Como o sistema sabe quando um arquivo foi modificado? Em arquivos mapeados em memória particular

3

Se eu estou olhando para um processo de fora do processo, como posso saber quais arquivos ele modifica?

Uma coisa que posso fazer é acompanhar chamadas para escrever, mas um processo pode mapear um arquivo para a memória e gravar na memória, modificando o arquivo.

O kernel precisa acompanhar por dois motivos. Ele precisa saber o que liberar quando uma sincronização é chamada e precisa atualizar o mtime no arquivo.

Então, como o sistema sabe?

Existe também alguma outra maneira de modificar arquivos além do write e do mmap?

    
por Mouse.The.Lucky.Dog 18.04.2014 / 20:57

1 resposta

3

O kernel sabe quais páginas são modificadas da mesma forma que qualquer outra página: quando escrito, um sinalizador nas tabelas de páginas é configurado para marcá-lo como "sujo". Isso é feito pela CPU ou pela MMU ou com a ajuda deles (por exemplo, eles podem definir o bit diretamente ou interromper uma interrupção para que o software faça isso).

Mas, na verdade, o comportamento que você está assumindo não é garantido. Páginas alteradas não precisam ser escritas de volta (ou mesmo enfileiradas para serem escritas de volta) até que msync ou munmap seja chamado.

Não sei quantas outras formas existem para modificar um arquivo, mas há pelo menos algumas:

  1. truncate / ftruncate
  2. writev , pwritev , aio_write (variantes de write )
  3. Use-o como um arquivo de troca, um dispositivo de backup para um dispositivo de loopback (por exemplo, / dev / loop0), etc.
  4. Pode haver ioctl chamadas que alteram o conteúdo do arquivo. Pior, estes podem ser específicos do sistema de arquivos.
por 18.04.2014 / 21:22