學(xué)習(xí)筆記
使用教材(配書源碼以及使用方法)
《一個(gè)64位操作系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)》
http://www.ituring.com.cn/book/2450
http://www.itdecent.cn/p/28f9713a9171
源碼文件
- 第3章\程序\程序3-4\
loader.asm
代碼清單3-18 源碼 line : 110 ~ 178 :查找內(nèi)核文件kernel.bin
-
源碼與 程序3-3 loader.asm(Lable_Search_In_Root_Dir_Begin) 基本一致,只需修改要顯示的字符串相關(guān)
KernelFileName: db "KERNEL BIN",0 3-3 loader.asm Lable_Search_In_Root_Dir_Begin
[OS64位][006]源碼閱讀:代碼清單3-7 目標(biāo)文件搜索 Lable_Search_In_Root_Dir_Begin
http://www.itdecent.cn/p/2c03cdd67d4e
代碼清單3-19 源碼 line : 179 ~ 256 :內(nèi)核讀入內(nèi)存
3-19 代碼流程
- 將
kernel.bin文件一個(gè)扇區(qū)的數(shù)據(jù)讀取至物理內(nèi)存0x7E00 ~ 0x7FFF; - 接著馬上將這512 字節(jié)數(shù)據(jù)逐字節(jié)復(fù)制到
0x 1 0 0 0 0 0; - 反復(fù)地利用
0x7E00 ~ 0x7FFF這段0x200(512)字節(jié)作為臨時(shí)轉(zhuǎn)存空間,從而讀完內(nèi)核文件kernel.bin的全部數(shù)據(jù) ;
3-19 源碼解析:移動(dòng)數(shù)據(jù)到0x100000
3-19 源碼解析:移動(dòng)數(shù)據(jù)到0x100000
代碼清單 3-19的代碼結(jié)構(gòu)與代碼清單3-10是基本一致的 :
1、在軟盤根目錄區(qū)被讀入到緩沖區(qū)0x8000后,找到目標(biāo)文件kernel.bin的目錄項(xiàng),可讀出目標(biāo)文件的初始簇號(hào);
2、根據(jù)初始簇號(hào)可以計(jì)算出目標(biāo)文件位于軟盤的起始扇區(qū)號(hào),讀一個(gè)扇區(qū)數(shù)據(jù)到內(nèi)存緩沖區(qū)0x7E00
3、之后,馬上將0x7E00開始的512字節(jié)數(shù)據(jù)移動(dòng)到內(nèi)存地址0x100000處(上圖黑色代碼部分);
4、接著,計(jì)算目標(biāo)文件的下一個(gè)簇號(hào),(期間需要將FAT表讀入0x8000);
5、循環(huán)反復(fù),直到整個(gè)kernel.bin文件的全部扇區(qū)讀取完畢、移動(dòng)完畢。
3-19 源碼解析:移動(dòng)數(shù)據(jù)到0x100000 內(nèi)存示意圖
代碼清單3-20 源碼 line: 258 ~ 265 :顯示字符 G
- 當(dāng)內(nèi)核程序被加載到
1 MB以上物理內(nèi)存地址后,在屏幕正中間顯示一個(gè)字符'G'
Label_File_Loaded:
mov ax, 0B800h
mov gs, ax
mov ah, 0Fh ; 0000: 黑底 1111: 白字
mov al, 'G'
mov [gs:((80 * 0 + 39) * 2)], ax ; 屏幕第 0 行, 第 39 列。
mov [gs:((80 * 0 + 39) * 2)], ax ; 屏幕第 0 行, 第 39 列
代碼清單3-21 源碼 line : 266 ~272 : 關(guān)閉軟驅(qū)
- 當(dāng)Loader引導(dǎo)加載程序完成內(nèi)核程序的加載工作后,軟盤驅(qū)動(dòng)器將不再使用
- 向I/O端口
03F2h寫入數(shù)值0,關(guān)閉全部軟盤驅(qū)動(dòng)器
KillMotor:
push dx
mov dx, 03F2h
mov al, 0
out dx, al
pop dx
代碼清單3-22 源碼 line: 274 ~ 330 :保存物理地址空間信息
- 當(dāng)內(nèi)核程序不再借助臨時(shí)轉(zhuǎn)存空間后,這塊臨時(shí)轉(zhuǎn)存空間
0x7E00 ~ 0x7FFF將用于保存物理地址空間信息 - 使用
INT 15H來(lái)獲取物理地址空間信息
INT 15H 保存物理地址空間信息
參考資料
- FS寄存器
Segment registers
CS DS ES FS GS SS
ES,FS,GS : These are extra segment registers available for
far pointer addressing like video memory and such.x86 Registers
http://www.eecg.toronto.edu/~amza/www.mindsec.com/files/x86regs.html
- x86 Assembly
- [OS64位][010]源碼閱讀:代碼清單3-10 從FAT12文件系統(tǒng)中加載loader.bin文件到內(nèi)存 Label_FileName_Found
- [OS64位][008]軟盤文件系統(tǒng)分配圖:根目錄項(xiàng)結(jié)構(gòu)、FAT表項(xiàng)結(jié)構(gòu)
- [OS64位][007]源碼閱讀:代碼清單3-8 INT 10H字符串顯示,找不到loader.bin 時(shí)顯示提示信息
- int 15h中斷獲取內(nèi)存信息
調(diào)用中斷int 15h 之前,需要填充如下寄存器:
· eax int 15h 可以完成許多工作,主要有ax的值決定,我們想要獲取內(nèi)存信息,需要將ax賦值為0E820H。
· ebx 放置著“后續(xù)值(continuation value)”,第一次調(diào)用時(shí)ebx必須為0.
· es:di 指向一個(gè)地址范圍描述結(jié)構(gòu) ARDS(Address Range Descriptor Structure), BIOS將會(huì)填充此結(jié)構(gòu)。
· ecx es:di所指向的地址范圍描述結(jié)構(gòu)的大小,以字節(jié)為單位。無(wú)論es:di所指向的結(jié)構(gòu)如何設(shè)置,BIOS最多將會(huì)填充ecx字節(jié)。不過(guò),通常情況下無(wú)論ecx為多大,BIOS只填充20字節(jié),有些BIOS忽略ecx的值,總是填充20字節(jié)。
· edx 0534D4150h('SMAP')——BIOS將會(huì)使用此標(biāo)志,對(duì)調(diào)用者將要請(qǐng)求的系統(tǒng)映像信息進(jìn)行校驗(yàn),這些信息被BIOS放置到es:di所指向的結(jié)構(gòu)中。
中斷調(diào)用之后,結(jié)果存放于下列寄存器之中。
· CF CF=0表示沒(méi)有錯(cuò)誤,否則存在錯(cuò)誤。
· eax 0534D4150h('SMAP')
· es:di 返回的地址范圍描述符結(jié)構(gòu)指針,和輸入值相同。
· ecx BIOS填充在地址范圍描述符中的字節(jié)數(shù)量,被BIOS所返回的最小值是20字節(jié)。
· ebx 這里放置著為等到下一個(gè)地址描述符所需要的后續(xù)值,這個(gè)值得實(shí)際形勢(shì)依賴于具體的BIOS的實(shí)現(xiàn),
調(diào)用者不必關(guān)心它的具體形式,自需在下一次迭代時(shí)將其原封不動(dòng)地放置到ebx中,
就可以通過(guò)它獲取下一個(gè)地址范圍描述符。
如果它的值為0,并且CF沒(méi)有進(jìn)位,表示它是最后一個(gè)地址范圍描述符。



