D D系統構建 loader保護模式修改

2021-08-09 02:32:51 字數 2898 閱讀 7331

前面在loader進入保護模式時,使用了指令修改的方法,主要原因是虛擬位址從0開始,而跳轉的位址是相對段內而言的,通過修改指令的方式來加上基位址。

loader.asm

%include "base_phy.inc"    

section code align=16 vstart=0

jmp start

%include "filesystem.inc"

;;;;;;;;;;;棧區空間預留;;;;;;;

stack_rsv:

times 1024 db 0

stack_top:

;;;;;;;;;;;資料區預留;;;;;;;;

loadermsg db "loader is running...", 0ah,0dh;

loadermsglen equ $-loadermsg

gdt_tbl: dw 0 ;gdt界限

dd macro_gdt_addr ;gdt實體地址

;;;;;;;;;;;**區;;;;;;;;

start:

mov ax, cs

mov ds, ax

mov es, ax

mov ss, ax

mov ax, 0

mov gs, ax

;棧頂賦值

mov sp, stack_top

;顯示loader執行資訊

mov cx, loadermsglen ; cx = 串長度

push cx

mov cx, loadermsg

push cx

call showstring

pop cx

pop cx

jmp next

;showstring(字串位址,字串長度)

;在當前當前游標處顯示字串資訊

;字串長度: bp+6

showstring:

push bp

mov bp, sp

pusha

mov ax, 0x0300

mov bx, 0

int 0x10

mov cx, [bp+6] ; cx = 串長度

mov bp, [bp+4]

mov ax, 0x1301 ; ah = 0x13, al = 0x1

mov bx, 0x7 ; 頁號為0(bh = 0) 黑底白字(bl = 0x7)

int 0x10 ; int 0x10

popa

pop bp

retnext:

;安裝gdt

xor ebx, ebx

mov ebx, [gdt_tbl+2]

;0#號描述符的槽位

mov dword [gs:ebx],0x0

mov dword [gs:ebx+0x04],0x0

;建立1#描述符,保護模式下的**段描述符

mov dword [gs:ebx+0x08],0x0000ffff ;基位址為0,界限0xfffff,dpl=00

mov dword [gs:ebx+0x0c],0x00cf9800 ;4kb粒度,**段描述符,向上擴充套件

;建立2#描述符,保護模式下的資料段和堆疊段描述符

mov dword [gs:ebx+0x10],0x0000ffff ;基位址為0,界限0xfffff,dpl=00

mov dword [gs:ebx+0x14],0x00cf9200 ;4kb粒度,資料段描述符,向上擴充套件

;初始化描述符表暫存器gdtr

mov word [gdt_tbl],23 ;描述符表的界限

;開啟a20

lgdt [gdt_tbl]

in al,0x92 ;南橋晶元內的埠

or al,0000_0010b

out 0x92,al

cli ;中斷機制尚未工作

mov eax,cr0

or eax,1

mov cr0,eax ;設定pe位

;以下進入保護模式... ...

enter_32:

jmp dword 0x0008:flush ;16位的描述符選擇子:32位偏移

rsv: times 4096-($-$$) db 0 ;

section code32 align=32 vstart=0x11000

[bits 32]

flush:

mov eax,0x00010 ;載入資料段(4gb)選擇子

mov ds,eax

mov es,eax

mov fs,eax

mov gs,eax

mov ss,eax ;載入堆疊段(4gb)選擇子

mov esp,0x7000 ;堆疊指標

mov byte [gs:0xb8000], 'l'

mov byte [gs:0xb8002], 'l'

mov byte [gs:0xb8004], 'l'

mov byte [gs:0xb8006], 'l'

jmp $

;halt

這樣我們在使用段選擇子0x8時,它的基位址為0,但偏移位址為0x11000,正好直接進入。

作業系統保護模式Protected Mode

保護模式,是一種80286系列和之後的x86相容 cpu操作模式。保護模式有一些新的特色,設計用來增強 多工和系統穩定度,像是 記憶體保護,分頁系統,以及硬體支援的 虛擬記憶體。大部分的現今 x86 作業系統 都在保護模式下執行,包含 linux freebsd 以及 微軟windows 2.0 和...

動手製作作業系統 認識實模式與保護模式

因為計算機啟動後按照實模式定址,cpu只能訪問1m的記憶體,所以為了訪問1m記憶體後更大的空間,就需要進入到保護模式,保護模式不僅有更大的位址空間,還將程式分成了4個特權級 0 4 數字越小特權級越高,在涉及特權級的操作時,處理器將會對特權級進行比較,最終允許訪問或者拒絕訪問。描述符 乙個特殊的資料...

《自己動手寫作業系統》讀書筆記 初識保護模式

書本第三章第一節是 認識保護模式 初步 講解了保護模式下全域性描述符表gdt 段描述符 段選擇子 從實模式進入保護模式等內容。去年看這個的時候,如果不是有以前學習保護模式時做的筆記,還真 不好懂呢,因為作者提供的材料不夠系統,對僅學習過8086組合語言的人來說,是不太好理解的。下面的內容大體以我以前...