C语言中的低级写作

如何使用C编程语言写入硬盘上的任何块?

关于编写MBR有一个问题 ,但它没有涵盖C方面那么多。

由于文件描述符 – 正如文字所说 – 对于文件,我想在这种情况下没有办法使用它们。 C标准库中包含的低级I / O也使用filedescriptors实现。

更准确地说:
这个问题更像是编写HDD块而不是文件(独立于操作系统)。

上面提到的问题的答案基本上建议在UNIX-Systems上使用dd (coreutils)。 这就是我在C中寻求一种方式的原因。也许bootloaders( GRUB )和引导扇区病毒使用不同的技术?

我想改变文件描述符内部的实际指针并不合法。

问题和局限:
我知道要记住某些方面,例如

  • 某些操作系统限制对卷的直接访问(例如Windows)
  • 写入错误以及将错误的数据写入某些块可能会导致文件系统损坏(HDD上的数据丢失)。
  • 防病毒软件可能会将其标记为可疑代码。

这个问题更具理论性。

C语言可以访问具有fopen/fclose/fread/fwrite等函数的文件。但是语言中没有块设备 (甚至不是设备 )。

另一方面,POSIX具有低级functionopen/close/read/write以访问文件,并具有块设备的概念。 只要您遵循一些简单的规则(主要是块对齐)并且您知道设备的名称( /dev/xxx ), 可以(小心)使用这些函数用于块设备。

如果您在非POSIX系统(例如Windows)中,则操作系统将具有处理块设备访问的特定方式。 例如,在Windows中,您可以使用CreateFile函数和设备名称\\.\PhysicalDrive0\\.\C:等。

对于类Unix操作系统,这是一个非问题:硬盘是一个设备文件,就像任何其他文件一样,并且像任何其他文件一样被访问。 你得到一个文件描述符,你找,你写,你崩溃文件系统,一切都很好。

这意味着您也应该使用C中的普通文件I / O例程。 区分高级和低级I / O不是你的工作,而是操作系统的工作。 因为现在大多数操作系统都支持设备即文件的比喻,所以C中没有进一步的抽象。虽然这种方法可能不适用于DOS和衍生物,但这只是避免DOS避免维护过时代码的一个原因。

如果你想让操作系统独立,那么你可能想要使用某种多态性。 然后,您可以创建一个结构来支持您所需的function。

在哪里创建一个结构,然后包含指针的函数,当代码移动OS时可以更改这些函数。 然后,您需要为要支持的每个操作系统提供基于操作系统的实现。

这与C几乎没有任何关系。如何以编程方式访问硬件取决于CPU如何与该设备通信(即在系统/硬件架构/设计上),如果涉及任何操作系统,则如何操作系统允许其中运行的其他软件访问设备(如果有的话)。

在x86 PC上,如果没有运行OS,可以使用BIOS中断13hfunction来读写HDD扇区。 在不使用BIOS的情况下,可以使用众所周知的I / O端口和ATA(PI)命令来实现相同目的。 如果有DOS,它大致相同,硬件访问没有限制。 如果有Windows或Linux,除非您拥有足够的权限和/或以某种方式执行操作,否则操作系统不会让您执行此类操作。

open()close()read()write()不是C语言的一部分,它们是OS的一部分。

除此之外:write()不会写任何东西,它是一个系统调用, 要求操作系统为你编写它 。 操作系统可以使用此请求执行任何操作(例如忽略它)

/ dev / *条目只是机器私有部分的一个钩子,由操作系统提供给您,使您可以执行其他操作无法完成的操作。 但是当您打开()并写入()其中一个/ dev / disk设备时,操作系统仍然可以忽略您的请求。