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 (ако съм прав) в RAM; сега въпросите ми са:

  • Тъй като машината се зарежда, RAM трябва да е празна, така че буутлоудърът е зареден на 0x0000 от RAM?
  • (Наистина не е свързано с този контекст) Има ли някакъв начин да получите обяснение на изходния код за 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 (ако съм прав) в RAM паметта

...

Тъй като машината се зарежда, RAM трябва да е празна, така че буутлоудърът е зареден на 0x0000 от RAM?

0000:7C00 се отнася за RAM адрес. RAM означава памет с произволен достъп, което означава, че всяко място в паметта може да бъде достъпно директно. Няма нищо като празна RAM памет. Можете също да се обърнете към функцията за прекъсване INT13 Четене на сектори от устройство: едно от параметрите (предаден в 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

Тъй като машината се зарежда, RAM трябва да е празна, така че буутлоудърът е зареден на 0x0000 от RAM?

Дори и да е началото, RAM няма да е празна. Следователно няма да може да използва 0x00000. Тъй като преди O/S да изпълни BIOS също създайте таблица за прекъсвания в RAM. (Ето защо можете да натиснете f2, f10 или клавиш за изтриване и т.н. и да отидете на настройките на BIOS. Ако няма манипулатор на прекъсвания, няма да можете да направите това.). Ето защо RAM паметта не е празна.

person Kasun    schedule 03.01.2021