使用C / C ++访问RAW磁盘

时间:2014-11-21 03:16:40

标签: c++ c linux windows disk

我有一个大型存储设备(闪存)通过PCIe总线插入我的计算机,我想直接访问这样的设备,即没有任何文件系统(例如,NTFS或ext4)。

如何使用C / C ++完成此操作? (在Windows 7和Linux上) 我想知道我是否可以1)打开设备作为文件,然后读取和写入二进制数据,或2)使用像malloc这样的函数分配整个设备,然后设备上的每个字节都有一个地址,以便我可以根据地址访问它们。

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

2 个答案:

答案 0 :(得分:10)

根据微软documentation

在Windows上,您可以使用{/ 1>格式的路径使用CreateFile打开物理驱动器

  

\\。\ PhysicalDriveN

其中N是设备号或使用格式

的路径的逻辑驱动器
  

\\ \ X:

您需要以扇区大小的倍数进行搜索,读取和写入,可以使用DeviceIoControl()和IOCTL_DISK_GET_DRIVE_GEOMETRY来检索。

答案 1 :(得分:7)

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

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

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