如何使用C编程语言写入硬盘上的任何块?
关于a question的撰写有MBR,但它并没有涵盖C方面。
由于文件描述符 - 正如文字所说 - 对于文件,我想在这种情况下没有办法使用它们。 C标准库中包含的Low-level I/O也使用filedescriptors实现。
更准确地说:
这个问题更像是写硬盘块而不是文件(独立于操作系统)。
上述问题的答案基本上建议在UNIX-Systems上使用dd(coreutils)。这就是为什么我在C中要求一种方式。也许bootloaders(GRUB)和引导扇区病毒使用不同的技术?
我想改变文件描述符内部的实际指针并不合法。
问题与限制:
我知道要记住某些方面,例如
这个问题更具理论性。
答案 0 :(得分:4)
C语言可以访问具有函数fopen/fclose/fread/fwrite
等的文件。但是语言中没有块设备这样的东西(甚至不是设备 >,就此而言)。
另一方面,POSIX具有访问文件的低级函数open/close/read/write
,并具有块设备的概念。只要您遵循一些简单的规则(主要是块对齐)并且您知道设备的名称(/dev/xxx
,这些函数可以 用于(小心)块设备)。
如果您在非POSIX系统(如Windows)中,则操作系统将采用特定方式来处理块设备访问。例如,在Windows中,您可以将CreateFile
功能与设备名称\\.\PhysicalDrive0
,\\.\C:
等一起使用。
答案 1 :(得分:1)
对于类Unix操作系统,这是一个非问题:硬盘是一个设备文件,就像任何其他文件一样,并且像任何其他文件一样被访问。你得到一个文件描述符,你找,你写,你崩溃文件系统,一切都很好。
这意味着你也应该在C中使用普通的文件I / O例程。区分高级和低级I / O不是你的工作,而是操作系统的工作。因为现在大多数操作系统都支持设备即文件的比喻,所以C中没有进一步的抽象。虽然这种方法可能不适用于DOS和衍生物,但这只是避免DOS避免维护过时代码的一个原因。
答案 2 :(得分:1)
如果你想让操作系统独立,那么你可能想要使用某种多态性。然后,您可以创建一个结构来支持您所需的功能。
在哪里创建一个结构,然后包含指针的函数,当代码移动OS时可以更改这些函数。然后,您需要为要支持的每个操作系统实施基于操作系统的实现。
答案 3 :(得分:0)
这与C几乎没有任何关系。如何以编程方式访问硬件取决于CPU如何与该设备通信(即在系统/硬件架构/设计上),如果涉及任何操作系统,关于操作系统如何让其中运行的其他软件访问设备(如果有的话)。
在x86 PC上,如果没有运行的操作系统,您可以使用BIOS中断13h功能来读写HDD扇区。在不使用BIOS的情况下,可以使用众所周知的I / O端口和ATA(PI)命令来实现相同的功能。如果有DOS,它大致相同,对硬件访问没有限制。如果有Windows或Linux,除非你有足够的权限和/或以某种方式做事,否则操作系统不允许你做这类事情。
答案 4 :(得分:-1)
open()close()read()write()不是C语言的一部分,它们是操作系统的一部分。
此外:write()不会写任何内容,系统调用要求操作系统为您编写。操作系统可以使用此请求执行任何操作(例如忽略它)
/ dev / *条目只是机器私有部分的一个钩子,由操作系统提供给您,使您能够执行其他操作无法完成的操作。但是当您打开()并写入()其中一个/ dev / disk设备时,操作系统仍然可以忽略您的请求。