[OS64位][014]源碼閱讀:代碼清單3-18 ~ 3-22 將內(nèi)核kernel.bin讀至內(nèi)存0x100000

學(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

https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture

  • [OS64位][010]源碼閱讀:代碼清單3-10 從FAT12文件系統(tǒng)中加載loader.bin文件到內(nèi)存 Label_FileName_Found

http://www.itdecent.cn/p/d772901a6be3

  • [OS64位][008]軟盤文件系統(tǒng)分配圖:根目錄項(xiàng)結(jié)構(gòu)、FAT表項(xiàng)結(jié)構(gòu)

http://www.itdecent.cn/p/2290e05af3f2

  • [OS64位][007]源碼閱讀:代碼清單3-8 INT 10H字符串顯示,找不到loader.bin 時(shí)顯示提示信息

http://www.itdecent.cn/p/cdf5cb908693

  • 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è)地址范圍描述符。

https://blog.csdn.net/trochiluses/article/details/20078161

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容