Как они читают кластеры / цилиндры / сектора с диска? - PullRequest
2 голосов
/ 20 мая 2010

Мне нужно было восстановить таблицу разделов, которую я случайно удалил. Я использовал приложение с именем TestDisk . Это просто сногсшибательное. Я читаю каждый цилиндр с диска. Я видел подобные приложения, которые работают с MBR и разметкой.

Мне любопытно.

Как они читают кластеры / цилиндры / сектора от диск? Для этого есть какой-то API?

Это снова зависит от ОС? Если да, то какой путь для Linux и для Windows?

EDIT: Ну, мне не просто интересно, я хочу получить опыт. Я хочу написать простое приложение, которое отображает каждый LBA.

Ответы [ 5 ]

3 голосов
/ 21 мая 2010

Для * nix уже есть ответы (каталог / dev); для Windows существуют специальные объекты \\.\PhisicalDrive<i>X</i>, с X в качестве номера диска, которые можно открыть с помощью обычного CreateFile API. Для фактического чтения или записи вы должны использовать функцию DeviceIoControl .

Дополнительную информацию можно найти в разделе «Физические диски и тома» документации API CreateFile.

3 голосов
/ 21 мая 2010

Это просто благодаря волшебству * nix специальных файлов устройств. Вы можете открыть и прочитать /dev/sda так же, как и любой другой файл.

Просто используйте open, lseek, read, write (или pread, pwrite). Если вы хотите убедиться, что вы физически извлекаете данные с накопителя, а не из буферов ядра, вы можете открыть их с флагом O_DIRECT (хотя для этого нужно выполнить выравнивание операций чтения / записи по 512 байтам).

3 голосов
/ 20 мая 2010

Цилиндры и секторы ( объяснение вики ) в значительной степени устарели из-за более новой схемы LBA ( адресация логических блоков ) для адресации дисков.

Если вам интересно узнать историю, используйте в качестве отправной точки статью из Википедии. Если вам просто интересно, как он работает сейчас, ожидается, что код будет просто использовать адрес LBA (который работает в основном так же, как и файл - линейный массив байтов, расположенных в блоках)

2 голосов
/ 25 мая 2010

Я ОП. Я объединяю ответы Эрика Сеппанена и Маттео Италии, чтобы завершить его.

* NIX Платформы:

Это просто благодаря волшебству * nix специальных файлов устройств. Вы можете открыть и прочитать /dev/sda так же, как и любой другой файл.

Просто используйте open, lseek, read, write (или pread, pwrite). Если вы хотите убедиться, что вы физически извлекаете данные с накопителя, а не из буферов ядра, вы можете открыть их с флагом O_DIRECT (хотя для этого нужно выполнить выравнивание операций чтения / записи по 512 байтам).

Платформа Windows

Для Windows существуют специальные объекты \\.\PhisicalDrive<i>X</i> с X в качестве номера диска, которые можно открыть с помощью обычного CreateFile API. Для выполнения чтения или записи просто вызовите ReadFile и WriteFile (буфер должен быть выровнен по размеру сектора).

Дополнительную информацию можно найти в разделе «Физические диски и тома» документации API CreateFile.

В качестве альтернативы вы также можете использовать функцию DeviceIoControl , которая отправляет управляющий код непосредственно в указанный драйвер устройства, заставляя соответствующее устройство выполнить соответствующую операцию.

1 голос
/ 20 мая 2010

В Linux, как пользователь root, вы можете сохранить MBR следующим образом (при условии, что вы используете диск / dev / sda):

dd if=/dev/sda of=mbr bs=512 count=1

Если вы хотите прочитать 1 МБ с вашего диска, начиная с 10-го МБ:

dd if=/dev/sda of=1Mb bs=1Mb count=1 skip=10
...