Отправляет email-рассылки с помощью сервиса Sendsay

Ассемблер для начинающих.

  Все выпуски  

Ассемблер для начинающих.




Creating_0S 03

 

Внимание, в этой статье я подразумеваю, что основы знаний ассемблера и работы с

компьютером и fasm у вас имеются. Если нет, то читайте статью ASM в 12-ом номере

FT, или любые другие источники.

 

 

Если что-либо в статье непонятно, пишите на skif_mob at mail.ru

или в форум. Обязательно отвечу на любые вопросы.

 

 

Все программы использованные в данной статье вы найдете на Ass3mbleR

fasm можно взять на FASM

 

Сегодня мы войдем в PM (защищенный режим), и напишем наброски драйвера для клавиатуры.

 

Begin.

У нас есть вторичный загрузчик, который грузится и ничего не делает. Нам надо чтобы он

переходил в РМ.

Защищённый режим (protected mode или PM). Как утверждает Intel, это родной (native) режим 32-разрядного процессора.

При работе в защищённом режиме процессор контролирует практически все действия программ и позволяет разделить

операционную систему, драйвера и прикладные программы разными уровнями привилегий. Благодаря этому ОС

может ограничить области памяти, выделяемой программам, запретить или разрешить ввод/вывод по любым

адресам, управлять прерываниями и многое другое. При попытке программы выйти за допустимый диапазон адресов памяти, выделенной ей, либо при обращении к запрещённым для неё портам процессор будет генерировать исключения(особые

прерывания). В этом режиме нам наиболее доступны все ресурсы процессора.

 

GDT Глобальная Дескрипторная таблица – перед переходом в РМ все сегменты и прочее должны быть

в ней описаны.

В РМ совершенно другая адресация памяти, и чтобы программа могла работать с ними используются сегменты,

но немного не такие как в R-mode. Сегмент – просто сегмент памяти выделенный для работы программы с ним.

Как вы наверное помните, раньше мы в cs,ds загружали адреса сегментов, и сегмент у нас был не более чем 64кб.

Сейчас же сегмент описывается не только его адресом(32разрядным), но и его пределом(размером 20 разрядным), уровнем его привилегий, типом(данные, стек, код), и др свойствами.

Набор сегментов доступных для программы определяется Дескриптором, в котором хранится описание сегмента.

Состоит он из 8 байт, и вот его структура:

 

0..15: предел, биты 0..15

16..31: адрес сегмента, биты 0..15

32..39: адрес сегмента, биты 16..23

40: бит A (Accessed)

41..43: Тип сегмента

44: бит S (System)

45,46: DPL (Descriptor Privilege Level)

47: бит P (Present)

48..51: предел, биты 16..19

52: бит U (User)

53: бит X (reserved)

54: бит D (Default size)

55: бит G (Granularity)

56..63: адрес сегмента, биты 24..31

 

 

 

; вторичный загрузчик SYSlo v0.0.0.5build

; Skif_Q. Created for os GroSYS.

; В комментах много мусора, это временное явление (это все-таки черновик пока)

 

 

INT_MASK_PORT EQU 21h ; порт для маскирования прерываний

MASTER8259A EQU 20h ; первый контроллер прерываний

SLAVE8259A EQU 0x0a0 ; второй контроллер прерываний

EOI EQU 20h ; команда конца прерывания

org 0x07C00

 

use16

jmp strt

 

gdt: ;GDT Глобальная Дескрипторная таблица – перед переходом в РМ все сегменты и прочее должны быть

; в ней описаны

dd 0, 0

 

db 0xFF ; Code Segment

db 0xFF ; limit

db 0x00

db 0x00

db 0x00 ; address

db 10011000b ; 1001 tipe 1 s 00 dpl 0p

db 11001111b ; 1100 limit 1 avl 1 o 1 d/b 1 g

db 0x00 ; address

db 0xFF ; Data segment

db 0xFF

db 0x00

db 0x00

db 0x00

db 10010010b

db 11001111b

db 0x00

 

db 0xFF ; SS

db 0xFF

db 0x00

db 0x00

db 0x00

db 10010010b

db 11001101b

db 0x00

 

gdtr: ; Образ gdtr

dw 3*8-1

dd gdt

idtr: ; Образ idtr

dw 0x48*8-1

dd idt

tests db '\nh\ne\nl\nl\no\n0\n0\n0\n0\n',0

strt:

cli ; запрещаем прерывания

 

mov ax,cs

xor ax,ax

mov ds,ax

mov es,ax

mov ss,ax

mov sp,0x07C0

 

; -------- Перепрограммируем контроллер прерываний --------

;

;

 

 

mov dx,20h ;

mov al,11h ; будет ски3 и ски4

out dx,al ; в порт 20h ски1 (ICW1)

inc dx ; работаем с портом 21h

mov al,30h ; ски2-базовый вектор 20h=32

out dx,al ; вывод

mov al,4 ; ски3-ведомый контроллер подключен к уровню 2

out dx,al ; вывод

mov al,1 ; ски4-тип микропроцессора 8086 (Pentium)

out dx,al ; и требование EOI

mov al,0fdh ; маска-разрешаем только клавиатуре

out dx,al ; вывод

mov dx,0a1h ; порт ведомого контроллера

mov al,0ffh ; запретим все прерывания

out dx,al ; вывод

xor al, al

out 0x70,al ; open 40h линию прерываний

 

lgdt [gdtr] ; грузим GDT

lidt [idtr] ; грузим IDT (таблица дескрипторов прерываний, там у нас вектора прерываний описаны)

; IDT находится в отдельном файле, читай ниже include idt.asm’ просто она слишком большая

; чтобы ее так писать )

 

 

mov eax, CR0 ; помещаем значение управляющего регистра в eax

or al, 1 ; устанавливаем бит PM

mov CR0, eax ; загружаем обратно

 

jmp 0x8:_protected_mode ;

 

 

use32

 

 

 

_protected_mode:

mov ax,0x10 ; загружаем дескриптором второго сегмента(1000и)

mov ds,ax

mov ss,ax

mov esp,0x2000000

sti ; разрешаем прерывания

 

 

mov dx,tests

mov ah,2

int 40h ; выводим сообщение что мы тут )

 

;

in al,INT_MASK_PORT ; размаскировываем прерывания клавы и таймера

and al,0fch

out INT_MASK_PORT,al

mov cx,1

mov ah,01

int 40h

call kernel_

jmp $ ; вешаемся

jmp $

jmp $

sysint: ; 40h

include 'sysint.asm'

 

 

timerint:

cli

push ax

mov al,EOI

out 0x20,al

; mov dx,te1

; mov ah,2

; int 40h ;test!)

;

; pop si

pop ax

sti

iret

te1 db '\ntimer OK',0

;прерывание клавиатуры

include 'keyboard.asm'

; ----------------------==== Далее код исключений ====-----------------

include 'exeps.asm'

 

; ----------------------==== Далее код прерываний ====-----------------

 

 

; а это для всех прерываний(аппаратных) что нам не нужны пока.

dummy_iret0:

 

mov al,EOI

out MASTER8259A,al

iret

 

 

dummy_iret1:

 

mov al,EOI

out MASTER8259A,al

out SLAVE8259A,al

iret

 

 

 

; далее дескрипторы исключений и прерываний

include 'idt.asm'

 

;kernel

include 'kernel.asm'

 

 

 

; ниже - верный способ вызвать ошибку, и перезап=грузить комп. используется для проверки кода.

; lgdt [gdtr1]

;

; gdtr1:

; dw 3*8-1

; dd gdtr1+100

;

 

Спасибо за внимание, все вопросы если что на мыло skif_mob at mail.ru

Линк на архив с этой статьей и этой версией GroSYS на ass3mbler вверху







Автор: Skif_Q
skif_q@mail.ru

Ass3mbleR SitE


В избранное