c - 访问超出报告容量的 block 设备数据

标签 c linux-kernel linux-device-driver block-device sata

我有一个 SATA block 设备,其报告的容量小于其可访问空间,并且我想使用 Linux 为 block 设备创建的文件来读取和写入超过报告的容量。所以我希望使用open({"/dev/sda", O_RDWR)返回的描述符进行操作。但是,当我尝试使用 lseek 来超出设备的容量时,我收到错误并且 errno 设置为 EINVAL (22)。 有没有一种方法可以在不修改设备驱动程序的情况下访问超出设备容量的数据,同时仍然使用 open() 返回的文件描述符?

我的 Linux 版本是 CentOS 7,内核为 3.10.0-514.21.1.el7.x86_64,尽管我对解决方案感兴趣,即使它们涉及其他 Linux 发行版。

编辑:我正在使用的驱动器是 FLEX 协议(protocol)驱动器,它报告驱动器的常规容量,但也可以在高于驱动器报告容量的偏移处使用叠瓦磁记录。如果您有兴趣,可以在T13 website上找到该协议(protocol)的详细信息。 .

最佳答案

如果我没记错的话,该错误是由于设备本身无法读取或写入该柱面而引起的,表明它可能不存在。请注意,许多制造商使用 1000B = 1KB 等,并且文件系统也保留自己的空间。

简短的回答是,你不知道。设备只会报告您可以使用的空间,也不会报告缓存大小。这种误报不是在操作系统级别,而是在设备级别。

关于c - 访问超出报告容量的 block 设备数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48675276/

相关文章:

linux-device-driver - 与 Linux 串行端口一起使用低延迟模式是否安全?

c - 如何在 Windows 中打印\n?

c - 强制 GCC 放弃将某些全局变量归零

linux-kernel - 当我们执行 insmod <modulename.ko> 时,insmod 进程在哪个上下文用户空间上下文或系统模式上下文中运行

linux - 哪个硬件定时器用于 linux 中的 hr 定时器?

linux - 如何在 Linux 设备驱动程序中实现内存映射功能?

memory-management - 如何以编程方式获取 linux 内核页面大小

c - 在二维矩阵中使用链表进行 DFS - C

c++ - 改变一点整数

linux - ioremap 返回 NULL