#freebsd #linux #raw #ata #api-bindings

pakr-rawata

硬盘的原始访问 - 使用 READ_DMA_EXT (0x25) 读取,使用 WRITE_DMA_EXT (0x35) 写入,使用 IDENTIFY_DEVICE (0xEC) 识别。在 Linux 上使用 SG 子系统,在 FreeBSD 上使用 CAM 子系统。警告,它绕过了所有操作系统安全检查和所有软件缓存。你可以在瞬间摧毁你的硬盘上的数据。

1 个稳定版本

1.0.0 2020年9月27日

#830 in Unix API

BSD-2-Clause

28KB
593

为 Linux 和 FreeBSD 提供硬盘的原始访问。有关技术信息,请参阅ATA/ATAPI 命令集指南。

警告

它绕过了所有操作系统安全检查和所有软件缓存。你可以在瞬间摧毁你的硬盘上的数据。唯一的保护措施是它需要管理员权限才能运行。

支持的操作

  • 使用 READ_DMA_EXT (ATA 命令 0x25,文档第 7.21 章) 读取扇区,
  • 使用 WRITE_DMA_EXT (ATA 命令 0x35,文档第 7.57 章) 写入扇区
  • 使用 IDENTIFY_DEVICE (ATA 命令 0xEC,文档第 7.13 章,包括返回结构的详细描述) 识别驱动器。

在 Linux 上使用 SG 子系统,在 FreeBSD 上使用 CAM 子系统。

注意

理论上,单个 ATA DMA 传输限制为 65536 个扇区(512B 扇区为 32MiB)。扇区计数为 16 位,使用 0x0000 扇区计数表示完整的 65536 个扇区传输。

实际上,操作系统强制实施的限制要低得多,在几 hundred 千字节范围内。

在 FreeBSD 上,我通过重新编译内核并使用自定义配置成功实现了每次稳定传输 8MB。

include GENERIC

ident           BIGDMA

options         DFLTPHYS=(16U*1024*1024)
options         MAXPHYS=(32U*1024*1024)

在 Linux 上,我没有找到任何可调整的参数来增加最大 DMA 传输大小,无论是编译时还是运行时。

待办事项

  • 支持不同于 512 字节的扇区大小

依赖关系

~0–1.9MB
~37K SLoC