Копирует ли 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 лет опыта программирования, но все они работают с языками высокого уровня в системах, что стало возможным благодаря ядру.

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


person weirdpanda    schedule 24.08.2015    source источник
comment
boot sector loader - это код в BIOS (после включения / сброса), который считывает boot sector (первые 512 байт) с диска и копирует его в 0000:7c00. После загрузки загрузочного сектора BIOS перейдет с jmp на 0000:7c00, где начнется выполнение кода загрузочного сектора.   -  person Michael Petch    schedule 24.08.2015


Ответы (2)


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

...

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

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

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

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

person Andreas Fester    schedule 24.08.2015
comment
большое спасибо! Это немного сбивает с толку по сравнению с Java и C ++. - person weirdpanda; 24.08.2015

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

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

person Kasun    schedule 03.01.2021