Como o Linux lê “arquivos reais” e “arquivos virtuais”?

3

Eu sou novo no Linux, descobri que no Linux existem "arquivos reais" e existem "arquivos virtuais", arquivos reais são arquivos que residem no disco rígido, enquanto arquivos virtuais são apenas dados representados pelo kernel como arquivos.

Por exemplo, os arquivos no diretório /proc são arquivos virtuais.

Eu quero entender como uma função como read() sabe ler um arquivo real e como ler um arquivo virtual. Eu criei o seguinte diagrama para mostrar minha compreensão deste assunto, por favor corrija-me se eu estiver errado sobre o meu entendimento:

    
por Paul 28.09.2017 / 17:33

2 respostas

5

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:

  1. sys_read() : o aplicativo inicia a leitura do arquivo usando a chamada do sistema
  2. A chamada é passada para a camada superior da pilha VFS ( vfs_read() )
  3. A chamada é passada para o driver do sistema de arquivos usando file->f_op->read() ou do_sync_read() ou new_sync_read()
  4. Se o arquivo for aberto no modo de saída de entrada direta, a função apropriada ( a_ops->direct_IO() , ext4_direct_IO() for ext4 ) será chamada e os dados serão retornados
  5. Se a página for encontrada no cache da página, os dados serão retornados file_get_page()
  6. 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 por ext4_readpage() do ext4 driver
  7. 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

    
por 28.09.2017 / 19:01
2

Não vou dar uma resposta exaustiva sobre isso por qualquer meio ...

Você está essencialmente correto, exceto por uma importante separação: read () pergunta ao kernel o que um descritor de arquivos contém, o kernel lida com o resto. Seja um sistema de arquivos físico, um sistema de arquivos de rede, um sistema de arquivos virtual (/ proc, / sys, ...) é irrelevante para read () . O kernel tem código subjacente para atender o pedido (ou não), ao qual você está se referindo como um driver.

    
por 28.09.2017 / 18:57