私は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()を初めて使用しているので、間違いがある場合は私を修正してください。
'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
@Tsyvarev、それは私がケースNVME_IOCTL_SUBMIT_IOの代わりにNVME_IOCTL_WRITE_AND_COMPARE_IOというケースを追加することで新しいコマンドを出すことができるのですか? \t \t return nvme_submit_io(ns、(void __user *)arg); '動作すればわかりません。実際に私は 'ioctl()'関数が 'nvme_ioctl()'を呼び出す方法を理解していませんでしたが、私はそれが愚かな質問かどうかわかりません。 –
要するに、 'nvme_ioctl()'がブロックデバイスに割り当てられています。ユーザデバイスの 'ioctl()'コールに渡す記述子です。詳細な説明は、Linuxカーネルのブロックデバイスとそれらのライタードライバについての記事を参照してください。新しいタイプのioctlリクエストのサポートを追加したいだけなら、単に 'nvme_ioctl'関数でそれを行うだけです。 – Tsyvarev