【发布时间】:2017-12-14 19:14:13
【问题描述】:
我正在开发一个 nvme-cli 测试工具(用 c 编写,可以在 linux 上运行)。
出于 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() 的新手,如果有任何错误,请纠正我。
【问题讨论】:
-
简单的
greping forNVME_IOCTL_SUBMIT_IO:给定的ioctl请求在drivers/nvme/host/core.c中处理。 -
@Tsyvarev,我是否可以通过添加一个名为 NVME_IOCTL_WRITE_AND_COMPARE_IO 的案例而不是
case NVME_IOCTL_SUBMIT_IO: return nvme_submit_io(ns, (void __user *)arg);来获得一个新命令?我不知道它是否有效。其实我不明白ioctl()函数是如何调用nvme_ioctl()我不知道这是不是一个愚蠢的问题,但由于我是新手,所以我不明白。 -
简而言之,
nvme_ioctl()分配给块设备,您传递给ioctl()在用户空间调用的描述符。有关详细说明,请阅读 linux 内核中的块设备并为它们编写驱动程序。如果您只想添加对新型 ioctl 请求的支持,只需在nvme_ioctl函数中执行此操作即可。
标签: linux linux-kernel systems-programming nvme