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

Access the RAW disk using C/C++

本文关键字:RAW 磁盘 访问 C++ 使用      更新时间:2023-10-16

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

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

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

根据

Microsoft文档:

在 Windows 上,您可以使用CreateFile使用表单路径打开物理驱动器

\\

.\物理驱动N

其中N是设备编号或使用表单路径的逻辑驱动器

\\

.\X:

您将需要查找、读取和写入扇区大小的倍数,这些扇区大小可以使用DeviceIoControl()和IOCTL_DISK_GET_DRIVE_GEOMETRY进行检索。

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

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

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