Na camada VFS, todos os arquivos são virtuais (na verdade, foram inventados pelos engenheiros da SunOS para vincular o sistema de arquivos UFS (baseado em disco) e NFS (baseado em rede)).
Cada file
tem tabela de funções f_op
que fornecem implementações para rotinas comuns (algumas delas podem ser genéricas) e cada inode
tem um objeto address_space
anexado que também possui uma tabela de funções C ( a_ops
) contendo implementações necessárias. A sequência é esta:
-
sys_read()
: o aplicativo inicia a leitura do arquivo usando a chamada do sistema - A chamada é passada para a camada superior da pilha VFS (
vfs_read()
) - A chamada é passada para o driver do sistema de arquivos usando
file->f_op->read()
oudo_sync_read()
ounew_sync_read()
- Se o arquivo for aberto no modo de saída de entrada direta, a função apropriada (
a_ops->direct_IO()
,ext4_direct_IO()
forext4
) será chamada e os dados serão retornados - Se a página for encontrada no cache da página, os dados serão retornados
file_get_page()
- Se a página não foi encontrada no cache da página, ela é lida no sistema de arquivos usando
a_ops->readpage()
, que é implementado porext4_readpage()
doext4
driver - A pilha do VFS cria uma solicitação de entrada / saída de bloco usando
submit_bio()
A partir do link , é um pouco desatualizado, já que a pilha do VFS era refatorou um pouco depois que eu escrevi isso