Question 1:
User-level ISA 是用戶態(tài)的 application 可以直接調(diào)用的指令集。
System-level ISA 是 application 必須通過系統(tǒng)調(diào)用來執(zhí)行的指令集铡恕。
Question 2:
內(nèi)存尋址模式有 Real Mode 和 Protected Mode琢感。
Real Mode,訪存尋址用 Segment:Offset 的方法探熔。寄存器 16-bit驹针,總線 20-bit。 實際編程時用段寄存器來指定 segment诀艰。
Protected Mode柬甥,由于為了考慮向前兼容性,段寄存器仍然使用 16-bit其垄,但段描述符已經(jīng)成了64-bit苛蒲,所以引入了GDT,用段寄存器的值尋址 GDT绿满,GDT存放著段描述符臂外。
Question 3:
- BIOS 把磁盤第一個扇區(qū)中的啟動代碼讀到物理地址 0x7c00 處,初始化 cs = 0棒口,ip = 7c00寄月,以 real mode 開始執(zhí)行
- 關(guān)閉中斷辜膝,將 ds无牵、es、ss幾個段寄存器的值初始化為0.
- 打開 A20gate
- 將 GDT 的 bass 和 limit 到 GDTR
- 將 CR0 中的 PE 位置成 1厂抖,從 real mode 切換到 protected mode
- 通過 ljmp 將 cs 設(shè)為 8茎毁,同時修改 PC
- 調(diào)用 boot main 函數(shù)讀取 kernel 的 elf 文件,啟動 kernel
What is the usage of "ljmp $(SEG_KCODE<<3), $start32"?
修改 cs 寄存器忱辅,同時修改 PCWhat is the A20 problem?
在8086/8088中七蜘,只有20根地址總線,所以可以訪問的地址是2^20=1M墙懂,但由于8086/8088是16位地址模式橡卤,能夠表示的地址范圍是0-64K,所以為了在8086/8088下能夠訪問1M內(nèi)存损搬,Intel采取了分段的模式:16位段基地址:16位偏移碧库。其絕對地址計算方法為:16位基地址左移4位+16位偏移=20位地址柜与。
到了80286,系統(tǒng)的地址總線發(fā)展為24根嵌灰,這樣能夠訪問的內(nèi)存可以達(dá)到2^24=16M弄匕。Intel在設(shè)計80286時提出的目標(biāo)是,在實模式下沽瞭,系統(tǒng)所表現(xiàn)的行為應(yīng)該和8086/8088所表現(xiàn)的完全一樣迁匠,也就是說,在實模式下驹溃,80286以及后續(xù)系列城丧,應(yīng)該和8086/8088完全兼容。但最終吠架,80286芯片卻存在一個BUG:如果程序員訪問100000H-10FFEFH之間的內(nèi)存芙贫,系統(tǒng)將實際訪問這塊內(nèi)存,而不是象過去一樣重新從0開始傍药。
為了解決上述問題磺平,IBM使用鍵盤控制器上剩余的一些輸出線來管理第21根地址線(從0開始數(shù)是第20根),被稱為A20 Gate:如果A20
Gate被打開拐辽,則當(dāng)程序員給出100000H-10FFEFH之間的地址的時候拣挪,系統(tǒng)將真正訪問這塊內(nèi)存區(qū)域;如果A20
Gate被禁止俱诸,則當(dāng)程序員給出100000H-10FFEFH之間的地址的時候菠劝,系統(tǒng)仍然使用8086/8088的方式。絕大多數(shù)IBM PC兼容機默認(rèn)的A20
Gate是被禁止的睁搭。由于在當(dāng)時沒有更好的方法來解決這個問題赶诊,所以IBM使用了鍵盤控制器來操作A20 Gate,但這只是一種黑客行為园骆,畢竟A20
Gate和鍵盤操作沒有任何關(guān)系舔痪。在許多新型PC上存在著一種通過芯片來直接控制A20 Gate的BIOS功能。從性能上锌唾,這種方法比通過鍵盤控制器來控制A20
Gate要稍微高一點锄码。
因此在實模式下,gate關(guān)閉時晌涕,無法訪問1M以上內(nèi)存地址滋捶;gate打開的時候,可以訪問到1M以上內(nèi)存地址余黎。而在保護(hù)模式下重窟,gate關(guān)閉時,用戶只能訪問0-1M惧财,2-3M……的地址巡扇;gate開啟時炒考,可以訪問全地址。