2010-08-19 130 views
16

我想直接从C程序访问整个硬盘。没有FS,永远不会是一个。Linux:从C程序直接访问硬盘(不含任何FS)

我只想打开/ dev/sda(例如)并在磁盘的块/扇区级别执行I/O操作。我正打算在Linux环境下编写一些学习C编程的程序(我知道C语言,Python,Perl和Java),但对Linux环境缺乏信心。

为了我的学习目的,我正在考虑玩京瓷柜,并将计算出的散列值对应的值直接保存到硬盘的“块/扇区”中,记录下这对:“散列,块/扇区参考“到一个京瓷橱柜散列数据库文件。

我不知道这是否使用标准CI/O功能是可行的或以其他方式我不得不写了一个“设备驱动程序”或类似的东西...

回答

7

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

18

如其他地方所述,在* 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会表现得就好像它是一个块设备,但写的所有信息将被存储在文件中。

+0

谢谢大家的快速回答。我会首先尝试使用循环设备。 – 2010-08-19 13:11:54

+3

+1以及使用环路设备进行测试。 – MarkR 2010-08-19 18:39:37

5

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

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

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

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

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

+0

非常感谢@MarkR。我会考虑到这一点,但作为Linux编程中的新手,可能太难以开始...... – 2010-08-20 06:18:50

+0

Linux编程几乎与Windows编程完全相同,所以它不应该是一个问题...您查找API,编写一个测试程序来试用它,然后在你的应用程序中使用它。就像Windows一样。 – MarkR 2010-08-20 08:46:11