前面在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組合語言的人來說,是不太好理解的。下面的內容大體以我以前...