C++ 使用C/C+访问原始磁盘+;

C++ 使用C/C+访问原始磁盘+;,c++,c,linux,windows,disk,C++,C,Linux,Windows,Disk,我有一个大型存储设备(闪存)通过PCIe总线插入到我的计算机上,我想直接访问此类设备,即不需要任何文件系统(如NTFS或ext4) 如何使用C/C++实现这一点?(在Windows 7和Linux上) 我想知道我是否可以1)将设备作为文件打开,然后读取和写入二进制数据,或者2)使用诸如malloc之类的函数分配整个设备,然后设备上的每个字节都有一个地址,以便我可以根据地址访问它们 如果可能的话,我更喜欢第二种方式,但我不知道操作系统是否支持这种方式,因为地址空间似乎需要与主内存共享。在Linux

我有一个大型存储设备(闪存)通过PCIe总线插入到我的计算机上,我想直接访问此类设备,即不需要任何文件系统(如NTFS或ext4)

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


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

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

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

通常,
/dev/sdX
将归root所有,但通常有一些特定于Linux发行版的方法来篡改拥有特定设备节点的用户ID。

根据Microsoft:

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

\\物理驱动

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

\\.\X:


您需要以扇区大小的倍数进行查找、读取和写入,这些扇区大小可以使用IOCTL\u DISK\u GET\u DRIVE\u GEOMETRY使用
DeviceIoControl()
检索。

不了解Windows,但
mmap()
是您在Linux上寻找的。低级别硬件支持是您在操作系统的API中可以找到的东西,不在标准C/C++库中。您手头有操作系统吗?如果是,哪一个?@πάνταῥεῖ 我有win7和Ubuntu 12.04server@xbug,
CreateFileMapping
类似于
mmap
。这些方法是用于将文件映射到用户进程的地址空间,而不是用于设备。所以我不可能以字节为单位访问,但以扇区为单位,对吗?在内存中,我可以使用地址定位一个字节,那么我如何定位磁盘中的扇区呢?磁盘上的第一个扇区(嗯,第0个扇区)是字节偏移量0,下一个扇区是字节偏移量512,依此类推。。。您根据逻辑块地址将文件查找到正确的偏移量,然后读取该块。文档似乎不够详细,如何在磁盘中定位块或扇区?定位是什么意思?您只需搜索要在打开的文件中定位扇区*扇区大小的任何扇区。