Как загрузить ядро ​​или иметь возможность использовать больше места в собственном загрузчике? - PullRequest
4 голосов
/ 24 января 2011

Я следил за этим:
(http://www.codeproject.com/KB/tips/boot-loader.aspx)
Но не уверен, что и как делать дальше.
Как загрузить в него само написанное ядро?Или как сделать больше места, чем в одном сегменте?
А что делать с двоичными файлами?Я должен скопировать загрузчик в первый сектор, хорошо, но что с ядром и т. Д., Просто положить на дискету / диск?

Ответы [ 2 ]

7 голосов
/ 25 января 2011

«Как загрузить ядро» сводится к знанию, где ядро ​​находится на диске и где вы хотите его в памяти, а затем к использованию дисковых сервисов BIOS для его чтения.Если вы хотите, чтобы ядро ​​загружалось выше 0x00100000, то вам может потребоваться загрузить каждую часть во временный буфер (доступ к которому BIOS может получить в реальном режиме), а затем использовать защищенный режим или «нереальный режим», чтобы скопировать его из буфера вгде вы на самом деле хотите это.Если вы хотите поддерживать сжатие, вам может потребоваться загрузить файлы, а затем распаковать их.Если вы хотите, чтобы ядро ​​использовало сложный формат файла (например, ELF или PE, а не простой плоский двоичный файл), то вам, возможно, потребуется проанализировать заголовки, переместить разделы и т. Д.

Мои загрузчики обычно бывают многобольше, чем 1 сектор.Код в первом секторе загружает второй сектор, а код в первом и втором секторах загружает оставшуюся часть загрузчика.Таким образом, загрузчик может быть 20 КиБ (например), если вы будете осторожны и не пытаетесь использовать какой-либо код или данные, которые еще не были загружены.Вы также можете иметь второй этап (и третий, четвертый и т. Д. Этапы, если хотите), когда загрузчик загружает второй этап, а второй этап - следующий фрагмент и т. Д.

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

Примечание. Различные загрузчики работают по-разному.Для чего-то вроде загрузки из сети, загрузчик может быть 512 КБ и должен загружать данные из сети, используя PXE API.Для CD-ROM вы, вероятно, в конечном итоге будете использовать файловую систему ISO9660 (и 2 сектора КиБ).Для жестких дисков вам потребуется обрабатывать разделы (и, возможно, иметь один загрузчик для «MBR-разделов» и другой загрузчик для «GPT-разделов»).В итоге вы получите несколько совершенно разных загрузчиков, которые все загружают ядро ​​(или, может быть, какой-то образ RAM-диска, если это микроядро) и оставляют компьютер в определенном состоянии при запуске ядра (например,определенный режим ЦП, ядро ​​по определенному адресу, другие файлы в определенных местах и ​​т. д.), так что самому ядру не нужно заботиться о том, какой загрузчик его загрузил.Для дополнительной сложности можно включить намного больше в это «предопределенное состояние» (например, адрес таблиц ACPI, описание предварительно сконфигурированного режима видео и т. Д.), Чтобы можно было писать загрузчики для других типов систем, и ядро ​​победило.не нужно заботиться, загружается ли он из «BIOS компьютера», UEFI, OpenFirmware или чего-то еще.

2 голосов
/ 24 января 2011

Как правило, главное, что нужно сделать вашему загрузочному сектору, это загрузить в память загрузчик второго уровня или ядро.Предполагая, что вы используете ПК, вы будете использовать функции чтения диска BIOS для загрузки секторов.Делать это с отформатированной в FAT дискеты вполне возможно в 512b, которые вы получаете для своего загрузочного сектора.Кроме того, загрузитесь с компакт-диска El-Torito без эмуляции, который дает вам больше места для загрузчика.

Для получения дополнительной информации, посмотрите OSDev.org или BonaFide OS Dev .

...