Atualmente estou trabalhando em um sistema operacional educativo chamado Pintos. Ao implementar a memória virtual, um dos problemas que estou tendo é gravar dados para trocar em uma falha de página que aconteceu durante a leitura de dados do sistema de arquivos.
O problema é que ambas as partições swap e file system usam o mesmo controlador e, portanto, apenas uma pode ser acessada por vez. Quando tento remover uma página para trocar em uma falha de página causada por uma leitura do sistema de arquivos, fico com deadlock (cada dispositivo está aguardando que o outro fique ocioso, portanto nenhum deles pode progredir).
Eu estou querendo saber como sistemas operacionais do mundo real, como o Linux, resolvem esse problema. Uma solução que estou pensando é talvez escrever a página trocada para a memória do kernel primeiro, gerenciá-la em uma fila e agendar a gravação de volta para trocar algum tempo depois, quando o dispositivo estiver disponível. No entanto, isso é caro, pois a gravação deve ser feita duas vezes. Além disso, é muito mais provável que eu fique sem RAM, pois há muito mais espaço de troca disponível do que a memória física.
Outra solução é talvez "forçar" o dispositivo a ficar ocioso na falha da página? Eu sei que o controlador do dispositivo usa alguns bits (BSY e DRQ) para determinar o status do dispositivo. No entanto, isso depende muito da implementação, e não tenho certeza se devo tocar esses bits, pois eles podem ser definidos pelo hardware.
Qualquer conselho seria muito apreciado.