Professional Documents
Culture Documents
OS - Boot Loader
OS - Boot Loader
;
; System board I/O ports
;
dma0 equ 00h ;Primary 8237 DMA controller
pic0 equ 20h ;primary 8259 interrupt controller
timer equ 40h ;8254 timer
eoi equ 20h ;PIC: End of Interrupt
iowait equ 0ebh ;I/O wait register
Лістинг 3
;
; init interrupt vectors
;
post_vec: mov si,offset inttab ;init interrupt vectors
xor di,di ;vec00
mov ax,cs ;BIOS segment -> eax bit 31..16
shl eax,16
mov cx,1fh
post_vec1: cs:
lodsw ;copy vectors 00.1e
;load word at address DS:(E)SI into AX.
stosd ;vector + segment
;store EAX at address ES:(E)DI
loop post_vec1
mov cl,60h-20h
mov ax,offset intdummy ;dummy vectors 20..5F
rep stosd
Завантажувач.
Завантажувач представляє собою невелику програму, що розміщена в
стартовому 0-му секторі диска. Інформація на диску фізично зберігається у
секторах по 512 байт, тобто при звертанні до диску зчитується сектор. Розмір
коду завантажувача має бути не більш ніж 510 байт. Для роботи з диском та
іншими периферійними пристроями використовується система переривань
(програм, що зберігаються в ROM-BIOS).
В лістингу 7 представлений код простого завантажувача операційної
системи.
Лістинг 7
bits 16 ; 16-ти бітнИЙ режим Real Mode
org 0x7c00 ; BIOS завантажується за адресою 0x7C00
start: jmp loader ; перехід до погрузчика
msg db "Welcome to My Operating System!", 0; виводиться
строка
Print:
lodsb ; завантажити наступний байт до AL
or al, al ; нульовий символ означає кінець строки
jz PrintDone
mov ah, 0eh ; функція запису символу
int 10h ; перевірка місцезнаходження
курсору
jmp Print ; нескінченний цикл
PrintDone:
ret
loader:
xor ax, ax ; обнуління ax
mov ds, ax ; встановлення сегменту даних
mov es, ax ; встановлення es=ds, адреса від
0x7c00:0
mov si, msg ; повідомлення для печаті
call Print ; виклик функції печаті
cli ; очистити всі переривання
hlt ; зупинити систему
times 510 - ($-$$) db 0 ; доповнення бінарного коду нулями до
510 байт
dw 0xAA55 ; закінчення бінарного коду системного
завантажувача
31 С0 – xor ax, ax
8E D8 8E C0 – занесення до сегментних регістрів DS та ES значення з регістру
AX.
BE 02 7C – mov si, msg, замість msg виконується підстановка адреси відносно
7С00.
E8 E8 FF – CALL - виклик процедури, що знаходиться на 24 байт вище.
Розрахунок адреси виконується наступним чином: починаючи з останнього
байту команди CALL відмірюється задана константа (в даному випадку це
від’ємне значення, що задане в додатковому коді). Тобто від адреси 0x3A треба
відняти значення 0x18. У результаті отримуємо значення 0x22, тобто адресу
0xAC команди lodsb.
FA – cli
F4 - hlt
В даній програмі можна побачити, що BIOS завантажується за адресою
0x7C00 (org 0x7C00). Це адреса пам’яті, в яку BIOS завантажує MBR (англ.
Master Boot Record, перший сектор в hdd / fdd). Тобто всі адреси будуть
прив’язані до 0x7C00. Це означає, що перша інструкція буде записана за
адресою 0x7C00. Якщо дана адреса відсутня і не може бути зчитана, то BIOS
вважає пристрій незавантажуваним і переходить до перевірки наступного
пристрою.
Команда mov si, msg завантажує у регістр si адресу першого байту
повідомлення "Welcome to My Operating System!". Команда lodsb завантажує в
регістр AL байт, слово або подвійне слово з комірки пам’яті, що вказується за
допомогою індексного регістру-джерела (регістру si), яке після завантаження
автоматично збільшується на одиницю.
Коли завантажувач операційної системи запущений, процесор знаходиться
в реальному режимі, як було сказано раніше. Це означає, що можуть
використовуватися переривання BIOS, що включають в себе будь-які
переривання, що відображаються безпосередньо з апаратного забезпечення.
В коді програми переривання можна розглянути на прикладі функції
виведення символу на екран INT 10h. В регістр AL поміщений символ, що
виводиться на екран, а в AH – номер функції виводу символу.
Команда cli, що використовується в програмі скидає флаг IF. Коли цей флаг
скинутий, процесор ігнорує всі переривання від зовнішніх пристроїв, що
маскуються, але немасковані переривання (такі як Reset) залишаються
активними .
Команда HLT зупиняє роботу процесора до приходу чергового переривання
(може бути маскуємим або не маскуємим). Використовується для випадків
коли програма виконалася та чекає переривання від зовнішнього пристрою,
щоб продовжити свою роботу.
Команда times доповнює бінарний код нулями до 510 байт. Оператор
долара ($) представляє собою адресу поточного рядка. $$ представляє собою
адресу першої інструкції (org 0x7C00). Таким чином, $-$$ повертає кількість
байтів від поточного рядка до початку (в даному випадку це розмір програми).
Як ми вже вказали раніше, BIOS INT 0x19 шукає завантажувальний
диск. Якщо 511-й байт встановлений в 0xAA, а 512-й байт - в 0x55, INT 0x19
передає управління на першу команду завантаженого сектору. Оскільки макер
завантаження повинен бути останніми двома байтами в завантажувальному
секторі, в програмі використовується ключове слово times, щоб обчислити
інший розмір для заповнення до 510-го, а не 512-го байта.
Нижче представлені блок-схеми програми задля розуміння алгоритму
рішення задачі.
Рис.3. Блок-схема алгоритму рішення задачі та виведення рядка на друк
Контрольні питання
1. Что такое Real mode чем он отличается от других режимов. Какая
разрядность шин данных-команд, шины адреса. Однозадачный ли?
Работает с реальной или виртуальной памятью?
2. Каким образом производится адресация в реальном режиме – как
высчитывается адрес? Показать на примере.
3. Как стартует и работает процедура POST? Какой адрес находится в IP
после включения компьютера? Как происходит взаимодействие с
устройствами на низком уровне (порты, прерывания)? Какую роль
играют команды out, in? Как находится устройство с которого
загружается ОС, как считывается загрузочный сектор (прерывание,
функция), какого он размера и по какому адресу БИОС записывает
загрузочный сектор диска? Как проверяет? Как запускает на
выполнение?
4. На что влияет org 0x7C00? Что будет если ее убрать? Какой код следует
добавить в случае ее отсутствия? Оказывает ли влияние на команды
переходов, пересылки адресов. Зачем в сегментные регистры данных в
случаях ее (org 0x7C00) присутствия, записываются нули?
5. В команде move si, msg – msg означает адрес или символ строки?
6. Как работает команда lodsb, какое влияние оказывает на si?
7. Зачем используется команды or al, al; jz PrintDone?
8. Объяснить механизм работы прерываний БИОС. Зачем они нужны? Что
из себя представляют прерывания БИОС? Как передаются параметры?
Как задается функция? Показать на примере функции вывода символа
на экран.
9. Объяснить какие существуют прерывания в системе (аппаратные и
программные), приведите примеры? Какие прерывания маскируются
командой cli? Как эта маскировка физически реализуется – какие
компоненты в этом участвуют? Как аппаратные прерывания
обрабатываются в реальном режиме (таблица IVT, вектор прерывания и
пр.)?
10.Объяснить зачем нужна команда hlt?
11.Объяснить зачем нужна команда times… и что означают $-$$?
12.Объяснить зачем нужно писать в конце файла AA55. Что будет если
этого не сделать?