我有一个大型存储设备(闪存)通过PCIe总线插入我的计算机,我想直接访问这样的设备,即没有任何文件系统(例如,NTFS或ext4)。
如何使用C / C ++完成此操作? (在Windows 7和Linux上)
我想知道我是否可以1)打开设备作为文件,然后读取和写入二进制数据,或2)使用像malloc
这样的函数分配整个设备,然后设备上的每个字节都有一个地址,以便我可以根据地址访问它们。
如果有可能,我更喜欢第二种方式,但我不知道操作系统是否支持这一点,因为地址空间似乎需要与主存储器共享。
答案 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发行版的方法来摆弄拥有特定设备节点的用户标识。