小さなLinuxドライバ拡張を書きたいです。具体的には、ホストとM.2-nvme-ssd間のすべての通信をユーザー空間ファイルに書きたいと思います。 nvmeドライバはかなり大きく、どこから始めるべきかを把握するのが困難です。
私の同僚がSDカードで同様のことをしました。ホストがカードから応答を受信し、ジョブが終了しようとしたときにIO(function is)を追跡しますsdhci_request_done
。トレースは、オペコード、データ、タイムスタンプとともに要求と応答を表示します。これが私の目標になります。
IOを追跡するプログラムが見つかりましたが、ユーザースペースで実行されます。これは、ドライバからカードに直接メッセージを送信できるため、問題になります。
だから私の質問は次のとおりです。タスクを遅らせたり、あまりにも多くのメモリを割り当てずにデータを取得したい場合は、ホストドライバにどこに入る必要がありますか?それともこれを実行できるドライバ機能はありますか?
答え1
私の同僚がSDカードで同様のことをしました。ホストがカードからの応答を受け取り、ジョブを終了しようとすると、IOを追跡します(関数はsdhci_request_done)。
SDカードとは異なり、ほとんどのデータは実際にDMAを介してnvmeデバイス(通常は)に交換されるため、Linuxは何が転送されたのかわからず、転送された内容だけがわかります。 DMAを無効にすると、パフォーマンスが大幅に低下する可能性があると確信しています。これを行う方法はわかりませんが、カーネルブートフラグを使用してこれを実行できます。
それ以外に、何も拡張せずに、すでに交換されているすべてのコマンドを追跡できます。 Linuxにはトレースポイントがあり、nvmeはそのうちの1つです。
sudo perf trace -e nvme:nvme_\* > logfile