BIOS копирует 512-байтовый загрузчик в 0x7c00

Я пишу ядро; перед тем, как написать такую ​​сложную вещь, я подумал, что было бы не только полезно, но и бесполезно провести теоретическое чтение ядер, загрузчиков, регистров, BIOS и т. д.

Эта статья говорит (и я цитирую):

The boot sector loader. 
This loads the first 512-byte sector from the boot disk into RAM and jumps to it.

Затем он продолжает говорить:

The first sector of a diskette can be loaded at address 0000:7C00. 

Итак, загрузчик загрузочного сектора загружает в ОЗУ 512 байт данных с дискеты, которая находится по адресу памяти 0x7C00 (если я прав); теперь мои вопросы:

  • Поскольку машина загружается, ОЗУ должно быть пустым, поэтому загрузчик загрузился в 0x0000 ОЗУ?
  • (На самом деле не имеет отношения к этому контексту.) Есть ли способ получить объяснение исходного кода для загрузчика GRUB Legacy (v .9x)?
  • И, наконец, какие статьи / книги я должен прочитать, чтобы ознакомиться с ядрами и т. Д.?

У меня 6-летний опыт программирования, но все они с языками высокого уровня в системах, что стало возможным благодаря ядру.

Любая помощь приветствуется. Спасибо!:)

2 ответа

Решение

... загрузчик загрузочного сектора загружает 512 байт данных с дискеты, которая находится по адресу памяти 0x7C00 (если я прав) в ОЗУ

...

Поскольку машина загружается, ОЗУ должно быть пустым, поэтому загрузчик загрузился в 0x0000 ОЗУ?

Нет. 0000:7C00 ссылается на адрес ОЗУ. RAM означает "Память с произвольным доступом", означает, что к каждой ячейке памяти можно получить прямой доступ. Нет ничего похожего на "пустую оперативную память". Вы также можете обратиться к функции прерывания INT13 "Чтение секторов с привода": один из параметров (передается в ES:BX) должен указывать на адрес назначения, где будет храниться содержимое сектора. Следовательно, то, что делает BIOS, это загружает 512 байт с диска и сохраняет его в 0000:7C00 в 0000:7DFF, а затем переходит к 0000:7C00 выполнить основной код загрузчика.

Какие статьи / книги я должен прочитать, чтобы ознакомиться с ядрами и т. Д.?

Эта вики очень полезна: http://wiki.osdev.org/Main_Page. Для процесса загрузки, посмотрите на http://wiki.osdev.org/Boot_Sequence.

Поскольку машина загружается, ОЗУ должно быть пустым, поэтому загрузчик загружается по адресу 0x0000 ОЗУ?

Даже если это будет запуск, оперативная память не будет пустой. Поэтому он не сможет использовать 0x00000. Потому что перед выполнением O/S BIOS также создает таблицу прерываний в ОЗУ. (Вот почему вы можете нажать клавишу f2, f10 или удалить и т. д. и перейти к настройкам BIOS. Если нет обработчика прерываний, вы не сможете этого сделать.). Вот почему оперативная память не пуста.

Другие вопросы по тегам