我需要将直接的原始 ATA 请求传递到硬盘驱动器(0x25,READ DMA EXT
),以违反最大扇区计数(长话短说),并绕过所有可能的操作系统缓存、缓冲区、重新排序等。
HDIO_DRIVE_TASKFILE
由于 .IOCTL 不再可用libata
。
SG_IO
我通过具有 ATA 直通功能的 IOCTL实现了目标(SG_ATA_16
( )。工作完美,除了一个问题:我可以在一个命令中读取最多 8192 个扇区。我需要总共读取了 32767 个扇区。
- 最大硬件扇区数kb是32767,所以驱动器支持这么多转移
- 最大扇区数kb很低,但我把它调到了 32767 个扇区,但无济于事
- 调度程序被设定为努普, 不用找了。
- 尝试收集缓冲区(
iovec_count>0
正确设置iovecs
为连续的缓冲区切片),没有变化。
环境:具有标准内核的 Ubuntu 16.04/16.10/17.04/17.10,SATA 驱动器连接到 Intel 芯片组上的标准 AHCI 接口。
无论我做什么,从 8193 扇区开始,IOCTL 都会通过“无效的论点“错误(准确地说,带有EINVAL
errno)。在另一台机器上,运行与运行之间略有不同(无需重新启动),通常稳定在最大 1344 个扇区。
去哪里看?什么会导致数据传输上限?