2017-12-14 40 views
0

私はnvme-cliのテストツール(cで書かれており、linuxで動くことができます)で作業しています。ioctl()がドライバコードを呼び出す方法

SSDの検証目的のために、私が実際にカスタムコマンドを探していましたが(例えばI/Oコマンドの場合、書き込み、同じを読んで、最終的にデータの両方が同じかどうかを比較)ioctl()機能を読むために

次のコードに示すように使用されます。

struct nvme_user_io io = { 
    .opcode  = opcode, 
    .flags  = 0, 
    .control = control, 
    .nblocks = nblocks, 
    .rsvd  = 0, 
    .metadata = (__u64)(uintptr_t) metadata, 
    .addr  = (__u64)(uintptr_t) data, 
    .slba  = slba, 
    .dsmgmt  = dsmgmt, 
    .reftag  = reftag, 
    .appmask = appmask, 
    .apptag  = apptag, 
}; 
err = ioctl(fd, NVME_IOCTL_SUBMIT_IO, &io); 

読み取りを理解するために、実行の制御が正確にどこに行くことができますか。

また、私は、私は内部的に書き込みを行うことができるように、その後、同じ場所を読んで、最終的にディスクにのみ含まれていることを確認するために、両方のデータを比較

err = ioctl(fd,NVME_IOCTL_WRITE_AND_COMPARE_IO, &io);

のように見える別のコマンドを持つようにしたいです私が書いたかったデータ。

私はこのnvme/ioctl()を初めて使用しているので、間違いがある場合は私を修正してください。

+0

'NVME_IOCTL_SUBMIT_IO'の単純な' grep':与えられたioctlリクエストは[drivers/nvme/host/core.c]で処理されます(https://elixir.free-electrons.com/linux/latest/source/drivers /nvme/host/core.c#L1042)。 – Tsyvarev

+0

@Tsyvarev、それは私がケースNVME_IOCTL_SUBMIT_IOの代わりにNVME_IOCTL_WRITE_AND_COMPARE_IOというケースを追加することで新しいコマンドを出すことができるのですか? \t \t return nvme_submit_io(ns、(void __user *)arg); '動作すればわかりません。実際に私は 'ioctl()'関数が 'nvme_ioctl()'を呼び出す方法を理解していませんでしたが、私はそれが愚かな質問かどうかわかりません。 –

+0

要するに、 'nvme_ioctl()'がブロックデバイスに割り当てられています。ユーザデバイスの 'ioctl()'コールに渡す記述子です。詳細な説明は、Linuxカーネルのブロックデバイスとそれらのライタードライバについての記事を参照してください。新しいタイプのioctlリクエストのサポートを追加したいだけなら、単に 'nvme_ioctl'関数でそれを行うだけです。 – Tsyvarev

答えて

0

nvme_io()は、デバイスに送信するNVMeオペコードをパラメータとして受け取るメインのコマンドハンドラです。標準によれば、読取り、書込みおよび比較のための別々のコマンド(オペコード)があります。これらのコマンドを個別に送信するか、ベンダー固有のコマンドを追加して必要なものを計算することができます。

+0

私たちはツールを構築するSSD検証の目的で、ディスクにランダムなパターンを書き込んで読み込み、ディスクに書き込まれたデータが実際に書きたいものと同じかどうかを比較する必要があります。私たちはランダムなパターンを書いているので、内部的に書き込みを送信してからそれを読み取るカスタムコマンドが必要です。最後に、両方の内容が同じかどうかを確認するためにバッファの内容を確認できます –

+0

@ArjunGS「内部的に」とはどういう意味ですか?ブロックごとにランダムパターンを作成し、保存し、送信し、読み戻して比較するプログラムを実行できます。ディスクの内部で実行する必要がある場合は、SSDデバイスにコードを実装し、カスタムコマンドを送信する必要があります。たぶん、SSDはすでにこのようなコマンドをサポートしています。 – Ora

+0

私がしたかったのは、新しいコマンドをnvme-cliに追加することです。書き込み - 比較は、書き込み、読み取り、比較を行います。しかし、 'ioctl()'ではスレッド化を繰り返すことができませんでした。なぜなら、 'ioctl()'では実行できない別のSubmissionキューIDを指定する必要があるからです。ドライバモジュールに何かを追加したいのです。 –

関連する問題