使用 C/C++ 访问 RAW 磁盘
Access the RAW disk using C/C++
我有一个通过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。
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 根据 GetLastError 直接写入磁盘会导致错误代码 5
- 矢量和其他容器如何在磁盘上工作?
- 如何从整个磁盘中排除要装载的一个文件
- 如何将 IPropertyBag 保存到磁盘
- 防止临时对象文件访问 MSVC 中的磁盘
- 即使使用 FILE_FLAG_DELETE_ON_CLOSE 属性创建文件,文件也会保留在磁盘上
- Linux 源代码中普通磁盘文件的"轮询"功能在哪里实现?
- 文件删除(使用取消链接)与释放所有磁盘空间之间的延迟
- 在RAW图像中提取RGB通道值的库或方法
- 在 Visual Studio 中调试时,是否可以将一些 C/C++ 结构内容保存到磁盘?
- 使用程序生成来创建磁盘,但纹理无法正常工作
- 使用C++项目将数据保存在磁盘上
- 将数据复制到磁盘上新位置的语法
- 通过C++与fst将对象写入R中的磁盘
- 如何使用PHP将上传到本地主机的一个html文件重定向到磁盘上的另一个html文档
- 从shared_ptr获取原始指针以将其传递给需要 raw 的函数
- 磁盘已满时,Boost日志崩溃
- 以RAW形式恢复磁盘内容并转储为一个大二进制文件的应用程序
- 使用 C/C++ 访问 RAW 磁盘