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

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


person Neomex    schedule 24.01.2011    source источник
comment
+1 Я не согласен с этим минусом!   -  person BlackBear    schedule 24.01.2011


Ответы (2)


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

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

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

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

person Brendan    schedule 25.01.2011
comment
На данный момент я хотел бы просто сделать самый простой загрузчик, который загружает самое простое ядро. Я нахожу много туториалов, но они пишут только о том, как написать загрузчик/ядро, а не о том, как загрузить ядро. Я использовал шестнадцатеричный редактор, чтобы вставить мой загрузчик на дискету, поэтому мне нужно сделать то же самое с ядром, просто выберите любой сегмент, который мне нравится, но он не сможет быть больше 512, не так ли? Также в чем разница между 16-битным и 32-битным режимом? Есть ли смысл переходить на 32 в ядре? И что меняется, когда я переключаюсь в защищенный режим, и когда я должен это делать? Я буду признателен за любую помощь. - person Neomex; 25.01.2011
comment
Это много разных вопросов. Вам, вероятно, следует последовать совету AJ (в том числе прочитать все в разделе основной информации на wiki.osdev.org/Main_Page); а также начните читать Руководство по системному программированию Intel или AMD (например, том 3A отсюда intel.com/products /процессор/руководства ). - person Brendan; 25.01.2011
comment
Не нужно использовать шестнадцатеричный редактор — в большинстве unix-подобных ОС вы можете использовать утилиту dd (и даже в некоторых случаях просто копировать файлы непосредственно в /dev/fd0), а для Windows вы можете получить инструменты для этого ( например, необработанная запись). Если вы можете загрузить один сектор с диска, вы сможете понять, как загрузить более одного сектора. Существует множество различий между реальным режимом и защищенным режимом (см. руководства Intel или AMD). - person Brendan; 25.01.2011
comment
Мне нравится включать защищенный режим и пейджинг до запуска ядра, но другие люди включают защищенный режим в ядре - зависит от дизайна вашей ОС. - person Brendan; 25.01.2011
comment
Stackoverflow отлично подходит для быстрых вопросов и ответов, но для дискуссий (таких как эта) он отстой. По этой причине я также рекомендую вместо этого использовать форумы по адресу forum.osdev.org, чтобы люди любили меня. не нужно разбивать их ответы на 5 отдельных комментариев, чтобы обойти глупые ограничения. - person Brendan; 25.01.2011
comment
На данный момент я не получил от них письмо с активацией (15 часов), я новичок, я только что «загрузил» загрузочный сектор, но не могу понять, как загрузить что-то большее, куда прыгнуть, если нужно, и как соединить файлы (просто положить на дискету? как узнать какой там сектор? ), я перейду на osdev, но пока это мое единственное место, где я могу об этом спросить. - person Neomex; 25.01.2011

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

Для получения дополнительной информации посетите OSDev.org или Добросовестный разработчик ОС.

person AJ.    schedule 24.01.2011