Смекни!
smekni.com

Разработка виртуальных лабораторных работ средствами эмулятора Emu8086 (стр. 18 из 21)

Загрузочным монитором называется записанная в ПЗУ программа, которая находиться по тому адресу, по которому процессор передает управление в момент включения питания и производит первичную инициализацию процессора, тестирование памяти и обязательного периферийного оборудования, и, наконец, начинает загрузку системы

В чем отличие загрузочного монитора от консольного монитора?

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

Приведите определение первичного загрузчика.

Первичным загрузчиком (загрузочный сектор, boot-сектор) - это содержимое нулевого сектора нулевой дорожки диска, с которого производится загрузка. Первичный загрузчик, пользуясь сервисами загрузочного монитора, ищет на диске начало файловой системы своей родной ОС, находит в этой файловой системе файл с определенным именем, считывает его в память и передает этому файлу управление.

Что такое бутстрап?

Бустрап - это последовательное исполнение втягивающих друг друга загрузчиков возрастающей сложности.

Как происходит загрузка операционной системы?

Загрузка операционной системы может происходить по-разному. В простейшем случае, первичный загрузчик, пользуясь сервисами загрузочного монитора, ищет на диске начало файловой системы своей родной ОС, находит в этой файловой системе файл с определенным именем (ядро ОС), считывает его в память и передает этому файлу управление. Если файловая система имеет сложную структуру, то первичный загрузчик не в состоянии самостоятельно произвести загрузку ОС в связи с ограничениями его размера. Поэтому приходится считывать вторичный загрузчик, размер которого может быть намного больше. Из-за большего размера этот загрузчик намного умнее и в состоянии разобраться в структурах файловой системы. В некоторых случаях используются и третичные загрузчики.

Возможен вариант загрузки по сети: ПЗУ, установленное на сетевой карте, посылает в сеть пакет стандартного содержания, который содержит запрос к серверу удаленной загрузки. Этот сервер передает по сети вторичный загрузчик и т.д.

В чем преимущество модульного программирования ОС?

Преимущества модульного программирования ОС заключаются в возможности динамической сборки ядра операционной системы при загрузке, при которой дополнительные модули подгружаются уже после старта самого ядра. Это допускает подгрузку модулей по запросу, при этом подсистемы, нужные только иногда, могут не загрузиться вообще. Даже те модули, которые нужны всегда, могут проинициализироваться, только когда станут нужны, уменьшив тем самым время от начала загрузки до старта некоторых сервисов. Второе преимущество состоит в возможности реконфигурировать систему без перезагрузки, что особенно полезно для систем коллективного пользования. И, наконец, возможность выгрузки модулей ядра иногда (но не всегда, а лишь если поломка не мешает драйверу корректно освободить ресурсы) позволяет корректировать работу отдельных подсистем без перезагрузки всей ОС и пользовательских приложений.

Загрузчик boot. asm

kernel_segequ1000h

org 100h

start:

jmp begin

begin:

mov ax,kernel_seg

mov es,ax

mov bx,100h

call Write

exit:

call far kernel_seg: 0100h

ret

procwrite

mov al,1h

mov dl,0

xor ch,ch

mov cl,2h

mov dh,0

mov ah,02h

int 13h

ret

endp Write

end start

Ядро kernel. asm

code segment para public 'code'

assume cs: code, ds: code, ss: code,es: code

org 100h

main proc

jmp EndData

string db " Operatsionnaea Sisteam studenta Makarova Anatoliea, grupa TI-065"

string_len equ $-string

EndData:

xor ax,ax

mov bh,07h

xor cx,cx

mov dx,0184fh

mov ah,06h

int 10h

mov ah,13h

xor al,al

xor bh,bh

mov cx,string_len

mov bl,06h

mov bp,offset string

mov dl,10

mov dh,10

int 10h

mov ah,00h

int 16h

main endp

code ends

end main

Вывод:

Я научился реализовывать загрузку операционной системы. Изучил основные моменты и правила вызова адресов памяти.

Лабораторная работа № 2.

Меню операционной системы

Цель работы: Создать меню для операционной системы и перехват нажатия клавиш.

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

Новые добавления:

В процедуре PresKey происходит обработка нажатия клавиш, с последующим выводом сообщения на экран через процедуру print_string.

; - ------------------------------------------- PresKeyPROC Again: mov ah,00h int 16h cmp al,0 jne Again cmp ah,3Bh; Pres F1? je F1 cmp ah,3Ch; Pres F2? je F2 cmp ah,3Dh; Pres F3? je F3 cmp ah,3Eh; Pres F4? je F4 cmp ah,3Fh; Pres F5? je F5 cmp ah,40h; Pres F6? je F6 jmp Again F1: leasi, mes1 callprint_string jmp Again F2: leasi, mes2 callprint_string jmp Again F3: leasi, mes3 callprint_string jmp Again F4: call clear_screen jmp Again F5: leasi, mes5 callprint_string jmp Again F6: leasi, mes6 callprint_string hlt ret ENDPPresKey

За вывод сообщения отвечает процедура print_string. Печать происходит по символьное, похожее на teletype.

print_string proc near push ax; store registers... push si; next_char: mov al, [si] cmp al, 0 jz printed inc si mov ah, 0eh; teletype function. int 10h jmp next_char printed: pop si; re-store registers... pop ax; ret print_string endp

В ОС предусмотрено обновление экрана, необходима для корректного отображения меню. Предотвращает его смещение.

clear_screen proc near push ax; store registers... push ds; push bx; push cx; push di; mov ax, 40h mov ds, ax; for getting screen parameters. mov ah, 06h; scroll up function id. mov al, 0; scroll all lines! mov bh, 10011111b; attribute for new lines. mov ch, 0; upper row. mov cl, 0; upper col. mov di, 84h; rows on screen - 1,mov dh, [di] ; lower row (byte). mov di, 4ah; columns on screen, mov dl, [di] dec dl; lower col. int 10h ; set cursor position to top ; of the screen: mov bh, 0; current page. mov dl, 0; col. mov dh, 0; row. mov ah, 02 int 10h pop di; re-store registers... pop cx; pop bx; pop ds; pop ax; mov ah,13h xor al,al xor bx,bx xor dx,dx mov cx,menu_len mov bl,11 mov bp,offset menu mov dl,10 mov dh,18h int 10h mov ah,13h xor al,al xor bh,bh mov cx,string_len mov bl, 19h mov bp,offset string mov dl,10 mov dh,0 int 10h ret clear_screen endp

Код рабочей программы:

. model small

CSEG segment

assume cs: CSEG, ds: CSEG, es: CSEG, ss: CSEG

; - --------------------------------------------- -

Start:

jmp EndData

mes1DB13,10,' Pres <F1>', 0Dh,0Ah,0

mes2DB13,10,' Pres <F2>', 0Dh,0Ah,0

mes3DB13,10,' Pres <F3>', 0Dh,0Ah,0

mes5DB13,10,' Pres <F5>', 0Dh,0Ah,0

mes6DB13,10,' Pres <F6>', 0Dh,0Ah,0

string db " Operatsionnaea Sisteam studenta Macarova Anatoliea, grupa TI-065"

string_len equ $-string

menu DB"F1 Help F2 Command F3 Calculator F4 ClearScreen F5 About F6 Exit"

menu_len equ $-menu

EndData:

mov ax,cs

mov es,ax

mov ds,ax

xor di,di

xor si,si

xor dx,dx

xor bx,bx

xor cx,cx

mov ss,ax

mov sp,0FFFEh

call clear_screen

call PresKey

Exit:

mov ah,00h

int 16h

hlt

; - -----------------------------------------------

PresKeyPROC

Again:

mov ah,00h

int 16h

cmp al,0

jne Again

cmp ah,3Bh; Pres F1?

je F1

cmp ah,3Ch; Pres F2?

je F2

cmp ah,3Dh; Pres F3?

je F3

cmp ah,3Eh; Pres F4?

je F4

cmp ah,3Fh; Pres F5?

je F5

cmp ah,40h; Pres F6?

je F6

jmp Again

F1:

leasi, mes1

callprint_string

jmp Again

F2:

leasi, mes2

callprint_string

jmp Again

F3:

leasi, mes3

callprint_string

jmp Again

F4:

call clear_screen

jmp Again

F5:

leasi, mes5

callprint_string

jmp Again

F6:

leasi, mes6

callprint_string

hlt

ret

ENDPPresKey

; print a null terminated string at current cursor position,

; string address: ds: si

print_string proc near

push ax; store registers...

push si;

next_char:

mov al, [si]

cmp al, 0

jz printed

inc si

mov ah, 0eh; teletype function.

int 10h

jmp next_char

printed:

pop si; re-store registers...

pop ax;

ret

print_string endp

; clear the screen by scrolling entire screen window,

; and set cursor position on top.

; default attribute is set to white on blue.

clear_screen proc near

push ax; store registers...

push ds;

push bx;

push cx;

push di;

mov ax, 40h

mov ds, ax; for getting screen parameters.

mov ah, 06h; scroll up function id.

mov al, 0; scroll all lines!

mov bh, 10011111b; attribute for new lines.

mov ch, 0; upper row.

mov cl, 0; upper col.

mov di, 84h; rows on screen - 1,mov dh, [di] ; lower row (byte).

mov di, 4ah; columns on screen,

mov dl, [di]

dec dl; lower col.

int 10h

; set cursor position to top

; of the screen:

mov bh, 0; current page.

mov dl, 0; col.

mov dh, 0; row.

mov ah, 02

int 10h

pop di; re-store registers...

pop cx;

pop bx;

pop ds;

pop ax;

mov ah,13h

xor al,al

xor bx,bx

xor dx,dx

mov cx,menu_len

mov bl,11

mov bp,offset menu

mov dl,10

mov dh,18h

int 10h

mov ah,13h

xor al,al

xor bh,bh

mov cx,string_len

mov bl, 19h

mov bp,offset string

mov dl,10

mov dh,0

int 10h

ret

clear_screen endp

CSEG ends

end Start

Выводы:

Данное меню выполнено на простом выводе на экран teletype. При использование меню происходит постоянное обновление, предотвращая сдвига верхней и нижней строки. Каждая клавиша выводит на экран сообщение о нажатой клавише. Строки меню выводятся по определенным координатам и окрашены особенным цветом.

Лабораторная работа № 3.

Окна операционной системы, реализация меню

Цель работы: Создать окна для операционной системы и перехват нажатия клавиш для меню и их реализация.

Задание: Создать окна для операционной системы, для примера окно About, так же произвести перезагрузку компьютера, задействуя кнопку F6.

Новые добавления:

В Data segment определяю значение, которые будут использованы для отображения меню: Нижнее главное меню и верхнее название ОС. Так же и для окна About, которое уже составлено в этом значение из символов. Данное окно и меню будет прорисовываться посимвольно с помощью процедуры print_string.

string db " Operatsionnaea Sistema studenta Macarova Anatoliea, grupa TI-065"

string_len equ $-string

menuText DB"F1 Save F2 Read F3 New Write F4 Close "

menuText_len equ $-menuText

menu DB"F1 Bloknot F2 Change PAss F3 Convertor F4 ClearScreen F5 About F6 Exit"

menu_len equ $-menu

About DB 13,10

db ' +------------------------------------------------+', 0Dh,0Ah

db ' |XXXXXXXXXXXXXXXX About Makar OS XXXXXXXXXXXXXXXX|', 0Dh,0Ah

db ' +------------------------------------------------|', 0Dh,0Ah

db ' | |', 0Dh,0Ah

db ' | +----------------------------------------+ |', 0Dh,0Ah

db ' | | | |', 0Dh,0Ah

db ' | | @@@@ Makar OS A 1.5 | |', 0Dh,0Ah

db ' | | @@@@ | |', 0Dh,0Ah

db ' | | Copiright (C) 2008 | |', 0Dh,0Ah

db ' | | Author Macarov Anatoli TI-065 | |', 0Dh,0Ah

db ' | | All Rights Reserved | |', 0Dh,0Ah

db ' | +----------------------------------------+ |', 0Dh,0Ah

db ' | |', 0Dh,0Ah

db ' | +-----------+ |', 0Dh,0Ah

db ' | |####OK#####| |', 0Dh,0Ah

db ' | +-----------+ |', 0Dh,0Ah

db ' +------------------------------------------------+', 0Dh,0Ah,0

About_len equ $-About

Процедура print_string обеспечивает посимвольный вывод. Передача в регистр si данные и после вызвать процедуру, вы получите результат.

print_string proc near

push ax; store registers...

push si;

next_char:

mov al, [si]

cmp al, 0