4

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

一个关于编写MBR的问题,但它并没有过多地涵盖 C 方面。

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

更准确地说:
这个问题是关于写入硬盘块而不是文件(独立于操作系统)。

上面提到的问题的答案基本上建议在 UNIX 系统上使用dd (coreutils)。这就是为什么我在 C 中寻求一种方法。也许引导加载程序(GRUB)和引导扇区病毒使用不同的技术?

我猜想更改文件描述符内部的实际指针不是合法的方式。

问题和局限:
我知道有些方面需要牢记,例如

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

这个问题更偏向于理论。

4

5 回答 5

5

C 语言可以访问具有函数fopen/fclose/fread/fwrite等的文件。但是该语言中没有块设备之类的东西(就此而言,甚至没有设备)。

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

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

于 2011-12-28T11:54:41.450 回答
1

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

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

于 2011-12-28T11:47:14.537 回答
1

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

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

于 2011-12-28T12:01:22.947 回答
0

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

在 x86 PC 上,如果没有操作系统运行,您可以使用 BIOS 中断 13h 函数来读取和写入 HDD 扇区。可以使用众所周知的 I/O 端口和 ATA(PI) 命令来实现相同的目的,而无需使用 BIOS。如果有DOS,也差不多,对硬件访问没有限制。如果有 Windows 或 Linux,除非你有足够的权限和/或以某种方式做事,否则操作系统不会让你做这种事情。

于 2011-12-28T12:01:12.150 回答
-1

open() close() read() write() 不是 C 语言的一部分,它们是操作系统的一部分。

此外: write() 不写任何东西,它是一个系统调用,要求操作系统为你写它。操作系统可以对这个请求做任何它想做的事情(比如忽略它)

/dev/* 条目只是进入机器私有部分的一个钩子,由操作系统提供给您,以使您能够完成其他方式无法完成的事情。但是当你 open() 和 write() 其中一个 /dev/disk 设备时,操作系统仍然有能力忽略你的请求。

于 2011-12-28T12:02:05.537 回答