【问题标题】:Low-Level-Writing in CC语言的低级编写
【发布时间】:2011-12-28 11:23:13
【问题描述】:

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

a question 有关于编写 MBR 的内容,但它并没有涵盖 C 方面的内容。

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

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

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

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

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

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

这个问题更偏理论。

【问题讨论】:

  • openwatcom.org/index.php/… 这是在 DOS 中的操作方法。由于您没有提出具体问题,因此很难给出除以下之外的答案:“不,没有用于写入未格式化硬盘扇区的标准 C api。为什么会有一个?”
  • 那将是一个非常令人满意的答案,但是由于您没有回答:谢谢;)。我必须补充一句:“为什么会有一个?”严重地?也许我想用 C 来改变 MBR?有什么问题?

标签: c io dd mbr


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 在windows中也不是问题。有一些特殊的命名文件(如 *nix 中的 /dev/)允许直接访问驱动器。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2019-12-12
          • 2014-12-14
          • 1970-01-01
          • 2021-03-14
          • 1970-01-01
          • 2010-09-11
          • 2013-01-24
          • 2015-01-23
          • 1970-01-01
          相关资源
          最近更新 更多