2014-11-21 103 views
4

我有一個通過PCIe總線插入電腦的大容量存儲設備(閃存),我想直接訪問此設備,即沒有任何文件系統(例如NTFS或ext4 ) 在上面。使用C/C++訪問RAW磁盤

如何使用C/C++來做到這一點? (在Windows 7和Linux上) 我想知道如果我可以1)打開設備只是作爲一個文件,然後讀取和寫入二進制數據,或2)使用一些功能如malloc分配整個設備,然後每個設備上的字節有一個地址,以便我可以根據地址訪問它們。

如果可能,我更喜歡第二種方式,但我不知道操作系統是否支持此操作,因爲地址空間似乎需要與主內存共享。

+0

不知道Windows,但'mmap()'是你在Linux上尋找的東西。 – xbug 2014-11-21 03:20:46

+3

低級硬件支持是您可以在操作系統的API中找到的類型,而不是在標準的C/C++庫中。 – MrEricSir 2014-11-21 03:21:13

+0

手邊有操作系統嗎?如果是,哪一個? – 2014-11-21 03:26:29

回答

7

在Linux上,每個存儲設備最終都會在/ dev中獲取設備條目。第一個存儲設備通常是/dev/sda,第二個存儲設備(如果有的話)是/dev/sdb。請注意,光盤是一種存儲設備,因此如果存在CD-ROM或DVD-ROM驅動器,則會獲得設備節點條目。

一些Linux發行版可能會使用不同的命名約定,但這是通常情況。因此,您需要確定哪個設備與您的閃存盤相對應,然後只需打開/dev/sdX設備,然後只需對其進行讀取和寫入即可。讀取和寫入操作必須是偶數塊(扇區)大小,並且查找打開的文件控制隨後的讀取或寫入影響哪個磁盤塊/扇區。

通常,/dev/sdX將由root擁有,但通常有一些特定於Linux發行版的方法來擺弄擁有特定設備節點的用戶標識。

+0

我明白了。所以我以字節爲單位訪問,但以扇區爲單位訪問是不可能的,對吧?在內存中,我可以使用地址來定位一個字節,那麼我怎樣才能在磁盤中找到一個扇區呢? – Bloodmoon 2014-11-21 10:46:54

+0

磁盤上的第一個扇區(以及第0個扇區)是字節偏移量0,下一個扇區是512字節偏移量,依此類推......您將文件找到正確的偏移量,用於邏輯塊地址,並讀取該塊。 – 2014-11-21 11:29:22

9

據微軟documentation

在Windows中可以使用CreateFile使用形式的路徑打開物理驅動器

\\。\ PhysicalDriveN

其中N是設備號或邏輯驅動器使用路徑的形式

\\。\ X:

你需要尋找,閱讀和可使用DeviceIoControl()與IOCTL_DISK_GET_DRIVE_GEOMETRY被檢索的扇區大小的倍數寫。

+0

似乎文檔不夠詳細,我如何找到磁盤中的塊或扇區? – Bloodmoon 2014-11-22 12:05:20

+0

找到什麼意思?您只需尋找想要尋找的扇區,即可在打開的文件中定位扇區*扇區大小。 – mclaassen 2014-11-22 22:37:35