2014-11-21 106 views
4

我有一个通过PCIe总线插入电脑的大容量存储设备(闪存),我想直接访问此设备,即没有任何文件系统(例如NTFS或ext4 ) 在上面。使用C/C++访问RAW磁盘

如何使用C/C++来做到这一点? (在Windows 7和Linux上) 我想知道如果我可以1)打开设备只是作为一个文件,然后读取和写入二进制数据,或2)使用一些功能如malloc分配整个设备,然后每个设备上的字节有一个地址,以便我可以根据地址访问它们。

如果可能,我更喜欢第二种方式,但我不知道操作系统是否支持此操作,因为地址空间似乎需要与主内存共享。

+0

不知道Windows,但'mmap()'是你在Linux上寻找的东西。 – xbug 2014-11-21 03:20:46

+3

低级硬件支持是您可以在操作系统的API中找到的类型,而不是在标准的C/C++库中。 – MrEricSir 2014-11-21 03:21:13

+0

手边有操作系统吗?如果是,哪一个? – 2014-11-21 03:26:29

回答

7

在Linux上,每个存储设备最终都会在/ dev中获取设备条目。第一个存储设备通常是/dev/sda,第二个存储设备(如果有的话)是/dev/sdb。请注意,光盘是一种存储设备,因此如果存在CD-ROM或DVD-ROM驱动器,则会获得设备节点条目。

一些Linux发行版可能会使用不同的命名约定,但这是通常情况。因此,您需要确定哪个设备与您的闪存盘相对应,然后只需打开/dev/sdX设备,然后只需对其进行读取和写入即可。读取和写入操作必须是偶数块(扇区)大小,并且查找打开的文件控制随后的读取或写入影响哪个磁盘块/扇区。

通常,/dev/sdX将由root拥有,但通常有一些特定于Linux发行版的方法来摆弄拥有特定设备节点的用户标识。

+0

我明白了。所以我以字节为单位访问,但以扇区为单位访问是不可能的,对吧?在内存中,我可以使用地址来定位一个字节,那么我怎样才能在磁盘中找到一个扇区呢? – Bloodmoon 2014-11-21 10:46:54

+0

磁盘上的第一个扇区(以及第0个扇区)是字节偏移量0,下一个扇区是512字节偏移量,依此类推......您将文件找到正确的偏移量,用于逻辑块地址,并读取该块。 – 2014-11-21 11:29:22

9

据微软documentation

在Windows中可以使用CreateFile使用形式的路径打开物理驱动器

\\。\ PhysicalDriveN

其中N是设备号或逻辑驱动器使用路径的形式

\\。\ X:

你需要寻找,阅读和可使用DeviceIoControl()与IOCTL_DISK_GET_DRIVE_GEOMETRY被检索的扇区大小的倍数写。

+0

似乎文档不够详细,我如何找到磁盘中的块或扇区? – Bloodmoon 2014-11-22 12:05:20

+0

找到什么意思?您只需寻找想要寻找的扇区,即可在打开的文件中定位扇区*扇区大小。 – mclaassen 2014-11-22 22:37:35