Quero escrever uma pequena extensão de driver Linux. Mais específico: quero gravar toda a comunicação entre o host e um M.2-nvme-ssd em um arquivo de espaço do usuário. O driver nvme é muito grande e tenho dificuldades em identificar algum lugar para começar.
Um colega meu fez algo semelhante com cartões SD. Ele rastreou o IO depois que o host recebeu a resposta do cartão e está prestes a encerrar a operação (a função é sdhci_request_done
). O rastreamento mostra solicitações e respostas com opcode, dados e carimbos de data/hora. Algo assim seria meu objetivo.
Encontrei programas que rastreiam IO, mas operam no espaço do usuário. Isso é um problema, pois posso enviar uma mensagem para o cartão diretamente do driver.
Então, minha pergunta é: onde posso acessar o driver host para obter os dados, sem atrasar as operações ou alocar muita memória. Ou existe uma função de driver que faz isso?
Ao contrário dos cartões SD, a maioria dos dados será realmente trocada via DMA para um dispositivo nvme (normalmente), de modo que o seu Linux não pode saber o conteúdo da transferência, apenas que ela aconteceu. Tenho certeza que você pode desabilitar o DMA, para uma enorme redução de desempenho. Não sei como fazer isso, mas você pode conseguir isso usando um sinalizador de inicialização do kernel.
Fora isso, você já consegue rastrear todos os comandos trocados, sem precisar estender nada. O Linux possui tracepoints e o nvme é apenas uma família deles; então