【问题标题】:How do you properly read/write a block device in C?如何在 C 中正确读/写块设备?
【发布时间】:2022-01-20 13:36:16
【问题描述】:

我知道您可以对块设备(/dev/sda 等)使用常规 I/O 功能,但是您可以只读取一些大小为 n 的数据,还是必须能被 512 整除?有没有听说过小尺寸的阅读?有些设备的块大于 512 字节,如果较小的大小有开销,我怎么知道最佳的块大小?

【问题讨论】:

标签: c linux block-device


【解决方案1】:

根据Wikipedia 以及对于 Unix 和类 Unix 系统(因此是 Linux):

块特殊文件或块设备提供对硬件设备的缓冲访问,并从它们的细节中提供一些抽象。与字符设备不同,块设备将始终允许程序员读取或写入任何大小(包括单个字符/字节)和任何对齐方式的块。不利的一面是,由于块设备是缓冲的,程序员不知道写入数据从内核缓冲区传递到实际设备需要多长时间,或者实际上两个单独的写入将以什么顺序到达物理设备。 .

这意味着您可以使用任何大小进行读取。由于 in 驱动程序 缓冲,物理读取将始终读取物理扇区。

【讨论】:

  • 那么在设备上进行一些较小的读取将导致一次实际的块读取?
  • @circl:AFAIK 是的。但这仍然会产生成本,因为每次读取都会有一个上下文更改用户/内核
  • 维基百科文章没有说明这对哪些操作系统有效:例如,Windows XP(我不确定 Windows 10)也有块设备,但它只支持写入整个扇区。而且 Solaris 10(我再次不知道最新版本)根本不允许从块文件中读取或写入!
  • @MartinRosenau:由于问题被标记为 linux,我认为 OP 仅与 Unix 块设备有关。维基百科页面的摘录是关于Unix 和类Unix 系统。但我应该明确表示。帖子已编辑,感谢您的评论。顺便说一句,不仅 Solaris,而且像 FreeBSD 这样的 BSD 系统都没有 块设备
  • 好吧,Solaris 有块设备,但它们只能用于“挂载”操作(不能用于读取或写入)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
相关资源
最近更新 更多