Низкоуровневое письмо на C

Как я могу писать в любой блок на моем жестком диске, используя язык программирования C?

Был вопрос о написании MBR, но аспекты C.

Поскольку файловые дескрипторы - как говорится в слове - предназначены для файлов, я думаю, что в этом случае их нельзя использовать. Включены низкоуровневый ввод-вывод в стандартной библиотеке C также реализованы файловые дескрипторы.

Точнее:
Этот вопрос скорее касается записи блоков жесткого диска, чем файлов (независимо от ОС).

Ответы на упомянутый выше вопрос в основном предполагают использование dd (coreutils) в UNIX-системах. Вот почему я прошу способ в C. Может быть, загрузчики (GRUB) и загрузочные секторные вирусы используют разные техники?

Я предполагаю, что изменение фактического указателя внутри файлового дескриптора не является законным способом.

Проблемы и ограничения.
Я знаю, что нужно помнить об определенных аспектах, например

  • Некоторые операционные системы ограничивают прямой доступ к томам (например, Windows)
  • Ошибки записи, а также запись неправильных данных в определенные блоки могут привести к повреждению файловой системы (потере данных на жестком диске).
  • Антивирусное программное обеспечение может пометить его как подозрительный код.

Этот вопрос более теоретический.


person markusschmitz    schedule 28.12.2011    source источник
comment
openwatcom.org/index.php/ вот как это сделать в DOS. Поскольку вы не задаете конкретный вопрос, трудно дать ответ, кроме: нет, стандартного API C для записи неформатированных секторов жесткого диска не существует. какого черта он может быть?   -  person marinara    schedule 28.12.2011
comment
Это был бы вполне удовлетворительный ответ, но поскольку вы не ответили: Спасибо;). Я должен добавить: какого черта он может быть? Шутки в сторону? Может быть, я хотел бы изменить MBR с помощью C? В чем проблема?   -  person markusschmitz    schedule 28.12.2011


Ответы (5)


Язык C имеет доступ к файлам с функциями fopen/fclose/fread/fwrite и т. Д. Но в языке нет такой вещи, как блочное устройство (даже устройство, если на то пошло).

POSIX, с другой стороны, имеет низкоуровневые функции open/close/read/write для доступа к файлам и концепцию блочного устройства. Эти функции можно использовать (с осторожностью) для блочного устройства, если вы следуете нескольким простым правилам (в основном, выравнивание блоков) и знаете имя своего устройства (/dev/xxx).

Если вы работаете в системе, отличной от POSIX, такой как Windows, тогда у ОС будет особый способ обработки доступа к блочным устройствам. В Windows, например, вы можете использовать функцию CreateFile с именем устройства \\.\PhysicalDrive0, \\.\C: и т. Д.

person rodrigo    schedule 28.12.2011

Для Unix-подобных операционных систем это не вопрос: жесткий диск - это файл устройства, как и любой другой, и доступ к нему осуществляется так же, как и к любому другому файлу. Вы получаете дескриптор файла, ищете, пишете, вы ломаете файловую систему, и все в порядке.

Это означает, что вы также должны использовать обычные процедуры файлового ввода-вывода в C. Различать высокоуровневый и низкоуровневый ввод-вывод - это не ваша работа, а задача операционной системы. Поскольку большинство операционных систем в настоящее время поддерживают метафору «устройство как файл», в C. нет дальнейшей абстракции. Хотя этот подход может не работать для DOS и производных, это только причина избегать DOS, чтобы избежать поддержки устаревшего кода.

person thiton    schedule 28.12.2011
comment
В окнах это тоже не проблема. Существуют специальные именованные файлы (например, / dev / in * nix), которые обеспечивают прямой доступ к диску. - person werewindle; 28.12.2011

Если вы хотите сделать его независимым от ОС, вы, вероятно, захотите использовать какой-то полиморфизм. Затем вы можете создать структуру для поддержки необходимой вам функциональности.

Где вы создаете структуру, которая затем будет содержать функции указателей, которые можно изменить, когда код перемещает ОС. Затем вам потребуется реализация на основе ОС для каждой ОС, которую вы хотите поддерживать.

person Community    schedule 28.12.2011

Это практически не имеет ничего общего с C. Как программный доступ к части оборудования зависит от того, как ЦП может взаимодействовать с этим устройством (то есть от архитектуры / дизайна системы / оборудования) и, если задействована какая-либо ОС, от того, как ОС позволяет другому программному обеспечению, работающему в ней, получать доступ к устройству (если вообще).

На ПК x86, если ОС не запущена, вы можете использовать функции прерывания BIOS 13h для чтения и записи секторов жесткого диска. Для достижения того же можно использовать хорошо известные порты ввода-вывода и команды ATA (PI) без использования BIOS. Если есть DOS, то примерно то же самое, ограничений на доступ к оборудованию нет. Если есть Windows или Linux, операционная система не позволит вам делать такие вещи, если у вас нет достаточных привилегий и / или вы не будете делать что-то определенным образом.

person Alexey Frunze    schedule 28.12.2011

open () close () read () write () не являются частью языка C, они являются частью ОС.

Кроме того: write () ничего не пишет, это системный вызов с просьбой к ОС написать это за вас. ОС может делать с этим запросом все, что угодно (например, игнорировать его).

Записи / dev / * - это просто привязка к частным частям машины, предоставленная вам ОС, чтобы вы могли делать то, что невозможно сделать иначе. Но когда вы открываете () и пишете () одно из устройств / dev / disk, ОС по-прежнему может проигнорировать ваш запрос.

person wildplasser    schedule 28.12.2011