有没有办法让 ioctl() 带有新的(自定义)命令

问题描述 投票:0回答:1

我正在开发一个nvme-cli的测试工具(用c编写,可以在linux上运行)。

为了SSD验证目的,我实际上正在寻找一个自定义命令(例如I/O命令,写入然后读取相同的数据,最后比较两个数据是否相同)

在用户空间中,我需要调用至少 2 个

ioclt()
,一个使用写入命令(nvme_cmd_write),另一个使用读取命令(nvme_cmd_read)并比较两个缓冲区内容。

问题实际上是当我想并行发送这个命令时。在块级别(使用

ioclt()
)我们无法将此命令放入不同的 I/O 提交队列中。

我们可以有一个从

ioclt()
发送的自定义命令(nvme_cmd_write_compare),并在驱动程序级别有一个新模块来处理这个新命令。

由于我是这个nvme/ioctl()的新手,如果有任何错误请纠正我。

我想知道我们是否可以实施这个。

linux linux-device-driver systems-programming nvme
1个回答
0
投票

NVMe SSD测试工具Penetrate(https://www.cellcomputers.com.tw/penetrate.html)可以轻松做你想做的事。该工具支持用户编写脚本来访问NVMe SSD,包括启动读取和写入命令的功能。以下是执行您想要的操作的过程。

var EC, cntl_handle, sq1_handle, sq2_handle;
var buf_r_d, buf_r_m, buf_w_d, buf_w_m;

cntl_handle = ...
sq1_handle = ...
sq2_handle = ...
/* sq1 and sq2 are set to access the same namespace */
buf_w = ...; nvme::ddbFillPatRand(EC, buf_w);
buf_r = ...; nvme::ddbFillPat8(EC, buf_r, 0);
cmd_w = nvme::ioc::write(EC, sq1_handle, buf_w, lba, len);
do 
    sts = nvme::pspp(cmd_w);
while (!sts);
cmd_r = nvme::ioc::read(EC, sq2_handle, buf_r, lba, len);
do
    sts = nvme::pspp(cmd_r);
while (!sts);
if (nvme::ddbCompareN(EC, buf_r, buf_w, len * lba_size) == 0)
    print("Pass");
else
    print("Fail");
© www.soinside.com 2019 - 2024. All rights reserved.