Низкоуровневая запись в C - PullRequest
       10

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

4 голосов
/ 28 декабря 2011

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

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

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

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

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

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 28 декабря 2011

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

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

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

1 голос
/ 28 декабря 2011

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

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

1 голос
/ 28 декабря 2011

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

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

0 голосов
/ 28 декабря 2011

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

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

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

0 голосов
/ 28 декабря 2011

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

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

...