ioctl()如何调用驱动程序代码

时间:2017-12-14 04:24:01

标签: linux linux-kernel systems-programming nvme

我正在研究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()的新手,如果有任何错误请指正。

1 个答案:

答案 0 :(得分:0)

nvme_io()是一个主命令处理程序,它接受您要发送到设备的NVMe操作码作为参数。根据标准,您有用于读取,写入和比较的单独命令(操作码)。您可以单独发送这些命令,也可以添加特定于供应商的命令来计算您需要的命令。