Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SppoLabs.doc
Скачиваний:
23
Добавлен:
27.03.2015
Размер:
315.39 Кб
Скачать

2.2. Работа в защищённом режиме процессора

Лабораторная работа 2.2. Работа без ОС.

Цель. Изучение процесса начальной загрузки. Знакомство с защищённым режимом процессора.

Общие сведения.

После включения питания компьютера управление получает специальная программа, являющаяся частью Базовой систему ввода-вывода (BIOS), которая находится в ПЗУ (память, не требующая питания для хранения информации и доступная только для чтения). BIOS производит тестирование оборудования, после чего считывает из CMOS (устройство энергонезависимой памяти, позволяющее записывать и считывать информацию) последовательность устройств для загрузки, которая является частью настроек BIOS. На данном этапе пользователь может прервать процесс загрузки и войти в режим редактирования настроек.

Далее BIOS последовательно опрашивает данные устройства, проверяя наличие специального признака (0xAA55) в конце первого блока (сектора) данных. Как только удовлетворяющее этому требованию устройство найдено, с него считывается первый сектор, который записывается в ОЗУ по адресу 0x7C00 и получает управление.

Дальнейший процесс загрузки полностью определяется программой загрузки, записанной в указанном секторе. Обычно эта программа выводит список доступных для загрузки ОС и предоставляет выбор одной из них.

Эмуляторы виртуальной машины создают для запускаемой программы иллюзию того, что она работает одна на машине, тогда как на самом деле в это же время работают ОС и другие программы.

Эмуляторы делятся на два основных класса: одни, как например Bochs, сами интерпретируют все машинные инструкции выполняемой программы; другие, например VMWare, большую часть инструкций передают реальному процессору, эмулируя только привилегированные инструкции и обращение к внешним устройствам. В некоторых эмуляторах сочетаются оба подхода.

Ясно, что первый способ эмуляции универсален, но гораздо медленнее, зато второй требует использование специальных драйверов для гостевой ОС.

Для выполнения работы потребуется загрузочный образ для MS DOS, который можно скопировать с соответствующей загрузочной дискеты или найти в Интернет.

Ниже приведен пример ассемблерного кода для последнего задания этой работы.

Программа для старта с fdb, вывода приветствия и продолжения загрузки с fda.

[BITS 16]

[ORG 0x7c00]

_start:

cli

mov ax, cs

mov ds, ax

mov ss, ax

mov sp, _start

sti

mov si, msg_start

call kputs

.load:

mov ax, 0x7e0 ; es:bx - адрес памяти для записи данных

mov es, ax

mov bx, 0

mov cl, 2 ; CL - младшие шесть бит - номер сектора

mov ch, 0 ; старшие два бита CL и CH - номер цилиндра (дорожки)

mov dl, 0x80 ; DL - номер диска (начиная с 0x80 – HDD).

mov dh, 0 ; DH - номер головки

mov al, 1 ; AL - количество секторов (не более цилиндра)

mov ah, 0x02 ; функция

int 0x13

jnc .success

%define MAX_READ_ERRORS 5

inc byte [.errors_counter]

cmp byte [.errors_counter], MAX_READ_ERRORS

jl .load

mov si, msg_giving_up

call kputs

hlt

jmp short $

.errors_counter: db 0

.success:

jmp sector2

kputs:

.loop:

lodsb

test al, al

jz .quit

mov ah, 0x0E

int 0x10

jmp short .loop

.quit:

ret

msg_start: db "Startup..",0x0A,0x0D,0

msg_read: db "Second sector loaded.",0x0A,0x0D,0

msg_giving_up: db "Fatal: Too many errors",0x0A,0x0D, 0

times 510-($-$$) db 0

db 0x55,0xAA

sector2:

mov si, msg_read

call kputs

.load:

mov ax, 0x7c0 ; es:bx - адрес памяти для записи данных

mov es, ax

mov bx, 0

mov cl, 1 ; CL - младшие шесть бит - номер сектора

mov ch, 0 ; старшие два бита CL и CH - номер цилиндра (дорожки)

mov dl, 0 ; DL - номер диска (0 - дисковод A:)

mov dh, 0 ; DH - номер головки

mov al, 1 ; AL - количество

mov ah, 0x02 ; функция

int 0x13

jnc .success

inc byte [.errors_counter]

cmp byte [.errors_counter], MAX_READ_ERRORS

jl .load

mov si, msg_giving_up2

call kputs2

hlt

jmp short $

.errors_counter: db 0

.success:

mov si, msg_dos

call kputs2

jmp _start

hlt

jmp short $

kputs2:

.loop:

lodsb

test al, al

jz .quit

mov ah, 0x0E

int 0x10

jmp short .loop

.quit:

ret

msg_dos: db "Jump to DOS..",0x0A,0x0D,0

msg_giving_up2: db "Fatal: Too many errors",0x0A,0x0D, 0

align 512

Программа написана с использованием синтаксиса nasm и может быть скомпилирована командой: nasm -fbin %1 -o %1.bin. Ключ fbin необходим для того, чтобы компилятор создал «чистый» двоичный код (без дополнительной информации, которую содержат исполняемый файлы).

Для запуска эмуляции нужно задать конфигурацию в .bochsrc:

floppya: 1_44=boot622.IMA, status=inserted

ata0-master: type=disk, path=boot.bin, cylinders=100, heads=4, spt=17

boot: disk

В приведенной конфигурации загрузчик запускается с жесткого диска, а MS DOS – с дискеты.

Примеры загрузочных образов из данной работы могут быть запущены на реальной машине, если их перенести на дискету командой dd …fda и произвести загрузку с этой дискеты.

Вопросы для изучения.

1. Формат загрузочного сектора.

2. Прерывания BIOS для чтения данных с диска и для вывода текста на консоль.

3. Настройка Bochs.

4. Запуск гостевой ОС.

Задание.

1. Настроить Bochs, подключив в качестве floppy disk A загрузочный образ MS DOS. Запустить эмуляцию и убедиться в работоспособности гостевой  ОС.

2. Откомпилировать и собрать загрузочный образ, осуществляющий вывод приветствия. Подключить его в качестве floppy disk B и проверить работоспособность в эмуляторе.

3. Собрать загрузочный образ, состоящий из двух секторов, причем программа из первого сектора должна загружать второй и передавать ему управление, а программа из второго сектора — выводить приветствие.

4. Написать и отладить загрузчик, который при старте с floppy disk B загружает MS DOS, образ которой находится на floppy disk A.

Контрольные вопросы.

1. Что такое эмулятор?

2. В чем отличие полных и неполных эмуляторов?

3. Может ли эмулятор запускать код для другой архитектуры?

4. В чем плюсы и минусы эмуляторов, исполняющих часть инструкций на реальном процессоре?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]