Linux:从C程序直接访问硬盘(没有任何FS)

这是我在此的头一篇博文。

我想直接从C程序访问整个硬盘。 没有FS,永远不会是一个。

我只想打开/ dev / sda(例如)并在磁盘的块/扇区级别执行I / O操作。

我打算在Linux环境下编写一些学习C编程的程序(我知道C语言,Python,Perl和Java),但对Linux环境缺乏信心。

对于我的学习目的,我正在考虑玩京都内阁和保存价值对应到计算哈希直接到硬盘的“块/扇区”,logging对:“哈希,块/扇区参考”到一个京都内阁散列数据库文件。

我不知道使用标准的CI / Ofunction是否可行,否则我不得不写一个“设备驱动程序”或类似的东西…

谢谢你的时间。

正如其他地方所提到的,在* NIX系统下,像/dev/sda这样的块设备可以作为纯文件访问。 请注意,如果从设备挂载文件系统,将其作为写入文件打开将失败。

如果你想玩块设备,我建议先使用loop device ,它提供一个纯文件作为块设备。 例如:

 dd if=/dev/zero of=./loop_file_10MB bs=1024 count=10K losetup /dev/loop0 $PWD/loop_file_10MB 

之后, /dev/loop0行为就好像是一个块设备,但是写入的所有信息都将存储在文件中。

由于驱动器(例如/dev/sda )的设备文件是块设备,这意味着您可以像打开普通文件一样打开,查找和使用文件。

是的,正如其他人所指出的,你可以简单地打开块设备。

但是,在块边界和整个块上执行IO(无论如何写入)是一个非常好的主意。 您可以使用像pread()和pwrite()这样的IO来执行这些IO,或者使用mmap部分或全部设备。

有一堆可以使用的ioctls,请参阅“man sd”了解更多信息。 他们似乎没有被记录在同一个地方。

在linux / fs.h中定义了BLKROSET和其他一些ioctl,你必须查看如何使用它们。 你可以做一些有用的事情,比如找出设备有多大以及块的大小。

util-linux-ng软件包的源代码是你的朋友,它包含了一些例子。