Доступ к RAW-диску с использованием C / Stack Overflow

У меня есть большое запоминающее устройство (флэш-память), подключенное к моему компьютеру через шину PCIe, я хочу получить к нему доступ напрямую, т.е. без какой-либо файловой системы (например, NTFS или ext4) на нем.

Как я могу сделать это с помощью C / C ++? (как на Windows 7, так и на Linux)
Мне интересно, могу ли я: 1) открыть устройство просто как файл, а затем прочитать и записать в него двоичные данные, или 2) выделить все устройство с помощью некоторой функции, например mallocзатем у каждого байта на устройстве есть адрес, чтобы я мог получить к ним доступ на основе адресов.

Я предпочитаю второй способ, если это возможно, но я не знаю, поддерживает ли ОС это, поскольку кажется, что адресное пространство должно быть разделено с основной памятью.

4

Решение

В Linux каждое устройство хранения получает запись устройства в / dev. Первое запоминающее устройство обычно /dev/sdaвторое запоминающее устройство, если оно есть, /dev/sdb, Обратите внимание, что оптический диск является запоминающим устройством, поэтому привод CD-ROM или DVD-ROM, если таковой имеется, получит запись узла устройства.

Некоторые дистрибутивы Linux могут использовать другое соглашение об именах, но это обычно так. Итак, вам нужно выяснить, какое устройство соответствует вашему флеш-диску, и просто открыть /dev/sdX устройство, и просто читать и писать с него. Ваши операции чтения и записи должны выполняться для четных размеров блоков (секторов), а поиск открытого файла определяет, на какие блоки / сектора диска повлияет последующее чтение или запись.

В общем-то, /dev/sdX будет принадлежать пользователю root, но обычно существуют некоторые специфичные для дистрибутива способы Linux для изменения идентификатора пользователя, которому принадлежит конкретный узел устройства.

7

Другие решения

По данным Microsoft документация:

В Windows вы можете открыть физический диск, используя CreateFile используя путь в форме

\\. \ PhysicalDriveN

где N номер устройства или логический диск, используя путь в форме

\\.\ИКС:

Вам нужно будет искать, читать и писать кратно размеру сектора, который можно получить с помощью DeviceIoControl() с IOCTL_DISK_GET_DRIVE_GEOMETRY.

10

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector