У меня есть большое запоминающее устройство (флэш-память), подключенное к моему компьютеру через шину PCIe, я хочу получить к нему доступ напрямую, т.е. без какой-либо файловой системы (например, NTFS или ext4) на нем.
Как я могу сделать это с помощью C / C ++? (как на Windows 7, так и на Linux)
Мне интересно, могу ли я: 1) открыть устройство просто как файл, а затем прочитать и записать в него двоичные данные, или 2) выделить все устройство с помощью некоторой функции, например malloc
затем у каждого байта на устройстве есть адрес, чтобы я мог получить к ним доступ на основе адресов.
Я предпочитаю второй способ, если это возможно, но я не знаю, поддерживает ли ОС это, поскольку кажется, что адресное пространство должно быть разделено с основной памятью.
В Linux каждое устройство хранения получает запись устройства в / dev. Первое запоминающее устройство обычно /dev/sda
второе запоминающее устройство, если оно есть, /dev/sdb
, Обратите внимание, что оптический диск является запоминающим устройством, поэтому привод CD-ROM или DVD-ROM, если таковой имеется, получит запись узла устройства.
Некоторые дистрибутивы Linux могут использовать другое соглашение об именах, но это обычно так. Итак, вам нужно выяснить, какое устройство соответствует вашему флеш-диску, и просто открыть /dev/sdX
устройство, и просто читать и писать с него. Ваши операции чтения и записи должны выполняться для четных размеров блоков (секторов), а поиск открытого файла определяет, на какие блоки / сектора диска повлияет последующее чтение или запись.
В общем-то, /dev/sdX
будет принадлежать пользователю root, но обычно существуют некоторые специфичные для дистрибутива способы Linux для изменения идентификатора пользователя, которому принадлежит конкретный узел устройства.
По данным Microsoft документация:
В Windows вы можете открыть физический диск, используя CreateFile
используя путь в форме
\\. \ PhysicalDriveN
где N
номер устройства или логический диск, используя путь в форме
\\.\ИКС:
Вам нужно будет искать, читать и писать кратно размеру сектора, который можно получить с помощью DeviceIoControl()
с IOCTL_DISK_GET_DRIVE_GEOMETRY.