SG_IO/SG_ATA_16 中的最大传输大小

SG_IO/SG_ATA_16 中的最大传输大小

我需要将直接的原始 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 都会通过“无效的论点“错误(准确地说,带有EINVALerrno)。在另一台机器上,运行与运行之间略有不同(无需重新启动),通常稳定在最大 1344 个扇区。

去哪里看?什么会导致数据传输上限?

相关内容