【问题标题】:How does a ioctl() call the driver codeioctl() 如何调用驱动代码
【发布时间】: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 for NVME_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


【解决方案1】:

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

【讨论】:

  • 为了SSD验证目的,我们正在构建一个工具,我需要将一个随机模式写入磁盘,读取它然后比较写入磁盘的数据是否与我们实际想要写入的数据相同.由于我们正在编写随机模式,我们需要一个自定义命令,该命令在内部发送写入然后读取相同的内容。最后我们可以检查缓冲区内容来检查我们是否有相同的内容
  • @ArjunGS “内部”是什么意思?您可以运行一个程序,为每个块创建一个随机模式、保存、发送、读回并进行比较。如果您需要在磁盘内部执行此操作,则需要在 SSD 设备上实现代码,然后您可以发送自定义命令。也许 SSD 已经支持这样的命令了。
  • 我想做的是向 nvme-cli 添加一个新命令 Write-compare,它会执行写入、读取然后比较。但是对于ioctl(),我们无法使用线程重复,原因是我们需要指定不同的提交队列ID,而ioctl() 无法做到这一点。所以我们想在驱动模块中添加一些东西。
猜你喜欢
  • 2011-11-30
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多