ucore實驗Lab1知識點總結


Intel 80386

ucore目前支持的硬件環境是基於Intel 80386以上的計算機系統。html

Intel 80386是80x86系列中的第一種32位微處理器。80386的內部和外部數據總線都是32位,地址總線也是32位,可尋址高達4GB內存。數據結構

工做方式包括實模式、保護模式以及虛擬86模式。架構

Bootloader

咱們知道計算機啓動是從BIOS開始,再由BIOS決定從哪一個設備啓動以及啓動順序,好比先從DVD啓動再從硬盤啓動等。計算機啓動後,BIOS根據配置找到啓動設備,並讀取這個設備的第0個扇區,把這個扇區的內容加載到0x7c00,以後讓CPU從0x7c00開始執行,這時BIOS已經交出了計算機的控制權,由被加載的扇區程序接管計算機。
這第一個扇區的程序就叫Boot,它通常作一些準備工做,把操做系統內核加載進內存,並把控制權交給內核。因爲Boot只能有一個扇區大小,即512字節,它所能作的工做頗有限,所以它有可能不直接加載內核,而是加載一個叫Loader的程序,再由Loader加載內核。由於Loader不是BIOS直接加載的,因此它能夠突破512字節的程序大小限制(在實模式下理論上能夠達到1M)。若是Boot沒有加載Loader而直接加載內核,咱們能夠把它叫作Bootloader。
Bootloader加載內核就要讀取文件,在實模式下能夠用BIOS的INT 13h中斷。內核文件放在哪裏,怎麼查找讀取,這裏牽涉到文件系統,Bootloader要從硬盤(軟盤)的文件系統中查找內核文件,所以Bootloader須要解析文件系統的能力。GRUB是一個專業的Bootloader,它對這些提供了很好的支持。
對於一個Toy操做系統來講,能夠簡單處理,把內核文件放到Bootloader以後,即從軟盤的第1個扇區開始,這樣咱們能夠不須要支持文件系統,直接讀取扇區數據加載到內存便可。

MBR與磁盤分區

  在目前x86的系統架構中,系統硬盤位於第0號磁道:0到511KB的區塊爲MBR(硬盤中的每個磁道容量爲512KB),開機管理程序使用這塊區域來儲存第一階段開機引導程序(stage1)。接着位於1到62號磁道做爲第1.5階段的開機引導程序(stage1.5),從第63號磁道開始纔是操做系統的分區。spa

  主引導記錄(MBR,Master Boot Record)是位於磁盤最前邊的一段引導(Loader)代碼。它負責磁盤操做系統(DOS)對磁盤進行讀寫時分區合法性的判別、分區引導信息的定位,它由磁盤操做系統(DOS)在對硬盤進行初始化時產生。操作系統

  MBR的內容分爲三部分:第一部分是0到445KB,是計算機的基礎導引程序,也稱爲第一階段的導引程序;接着446KB到509KB爲磁盤分區表,由四個分區表項構成(每一個16個字節)。負責說明磁盤上的分區狀況。內容包括分區標記、分區的起始位置、分區的容量以及分區的類型。最後一部分爲結束標誌只佔2KB,其值爲AA55,存儲時低位在前,高位在後。3d

從百度百科借了張圖:rest

 

 

MBR中緊跟在主引導程序後的主分區表這64字節(01BE~01FD)中包含了許多磁盤分區描述信息,尤爲是01BE~01CD這16字節,包含了分區引導標誌bootid、分區起始源頭beghead、分區起始扇區relsect、分區起始柱面begcy一、操做系統類型systid、分區結尾磁頭endhead、分區結尾扇區begsect、分區結尾柱面begcy一、分區扇區起始位置relsect、分區扇區總數numsect。orm

其中分區引導標誌bootid表示當前分區是否能夠引導,若爲0x0,則表示該分區爲非活動區;若爲0x80,則爲可開機啓動區。如有多個開機啓動區,則由用戶開機時的選擇而定(如GRUB的菜單)。htm

分區扇區起始位置relsect表示分區中第一個扇區相對於磁盤起始點的偏移位置。blog

實模式到保護模式

咱們知道Intel x86系列CPU有實模式和保護模式,實模式從8086開始就有,保護模式從80386開始引入。爲了兼容,Intel x86系列CPU都支持實模式。現代操做系統都是運行在保護模式下(Intel x86系列CPU)。計算機啓動時,默認的工做模式是實模式,爲了讓內核能運行在保護模式下,Bootloader須要從實模式切換到保護模式,切換步驟以下:
  1. 準備好GDT(Global Descriptor Table)
  2. 關中斷
  3. 加載GDT到GDTR寄存器
  4. 開啓A20,讓CPU尋址大於1M
  5. 開啓CPU的保護模式,即把cr0寄存器第一個bit置1
  6. 跳轉到保護模式代碼
GDT是Intel CPU保護模式運行的核心數據結構,全部保護模式操做的數據都從GDT表開始查找, 這裏有GDT的詳細介紹。
GDT中的每個表項由8字節表示,以下圖:


其中Access Byte和Flags以下圖:


這裏
是詳細說明。
GDTR是一個6字節的寄存器,有4字節表示GDT表的基地址,2字節表示GDT表的大小,即最大65536(實際值是65535,16位最大值是65535),每一個表項8字節,那麼GDT表最多能夠有8192項。
實模式的尋址總線是20bits,爲了讓尋址超過1M,須要開啓A20,能夠經過如下指令開啓:
    in al, 0x92
    or al, 2
    out 0x92, al
把上述步驟完成以後,咱們就進入保護模式了。在保護模式下咱們要使用GDT經過GDT Selector完成,它是GDT表項相對於起始地址的偏移,所以它的值通常是0x0 0x8 0x10 0x18等。

A20

1981年8月,IBM公司最初推出的我的計算機IBM PC使用的CPU是Inter 8088.在該微機中地址線只有20根。在當時內存RAM只有幾百KB或不到1MB時,20根地址線已經足夠用來尋址這些 內存。其所能尋址的最高地址是0xffff,

也就是0x10ffef。對於超出0x100000(1MB)的尋址地址將默認地環繞到0xffef。當IBM公司與1985年引入AT機時,使用的是Inter 80286 CPU,具備24根地址線,最高可尋址16MB,而且有一個與8088那樣實現地址尋址的環繞。

可是當時已經有一些程序是利用這種環繞機制進行工做的。爲了實現徹底的兼容性,IBM公司發明了使用一個開關來開啓或禁止0x100000地址比特位。因爲當時的8042鍵盤控制器上剛好有空閒的端口引腳(輸出端口P2,引腳P21),

因而便使用了該引腳來做爲與門控制這個地址比特位。該信號即被稱爲A20。若是它爲零,則比特20及以上地址都被清除。從而實現了兼容性。

當A20地址線控制禁止時,程序就像運行在8086上,1MB以上的地址是不可訪問的,只能訪問奇數MB的不連續的地址。爲了使能全部地址位的尋址能力,必須向鍵盤控制器8082發送一個命令,鍵盤控制器8042會將A20線置於高電位,使所有32條地址線可用,實現訪問4GB內存。

GDT

GDT全稱是Global Descriptor Table,中文名稱叫「全局描述符表」,想要在「保護模式」下對內存進行尋址就先要有 GDT。GDT 表裏的每一項叫作「段描述符」,用來記錄每一個內存分段的一些屬性信息,每一個「段描述符」佔 8 字節。

在保護模式下,咱們經過設置GDT將內存空間被分割爲了一個又一個的段(這些段是能夠重疊的),這樣咱們就能實現不一樣的程序訪問不一樣的內存空間。這和實模式下的尋址方式是不一樣的, 在實模式下咱們只能使用address = segment << 4 | offset的方式進行尋址(雖然也是segment + offset的,但在實模式下咱們並不會真正的進行分段)。在這種狀況下,任何程序都能訪問整個1MB的空間。而在保護模式下,經過分段的方式,程序並不能訪問整個內存空間

ELF文件

Bootloader程序是原始可執行文件,若是程序由彙編寫成,彙編編譯器編譯生成的文件就是原始可執行文件,也可使用C語言編寫,編譯成可執行文件以後經過objcopy轉換成原始可執行文件, 這篇文章介紹了用C語言寫Bootloader。
那麼內核文件是什麼格式的呢?跟Bootloader同樣的固然能夠。內核通常使用C語言編寫,每次編譯連接完成以後調用objcopy是能夠的。咱們也能夠支持通用的可執行文件格式,ELF(Executable and Linkable Format)便是一種通用的格式,它的 維基百科
ELF文件有兩種視圖(View),連接視圖和執行視圖,以下圖:



連接視圖經過Section Header Table描述,執行視圖經過Program Header Table描述。Section Header Table描述了全部Section的信息,包括所在的文件偏移和大小等;Program Header Table描述了全部Segment的信息,即Text Segment, Data Segment和BSS Segment,每一個Segment中包含了一個或多個Section。
對於加載可執行文件,咱們只需關注執行視圖,即解析ELF文件,遍歷Program Header Table中的每一項,把每一個Program Header描述的Segment加載到對應的虛擬地址便可,而後從ELF header中取出Entry的地址,跳轉過去就開始執行了。對於ELF格式的內核文件來講,這個工做就須要由Bootloader完成。Bootloader支持ELF內核文件加載以後,用C語言編寫的內核編譯完成以後就不須要objcopy了。

中斷

中斷的具體內容(點擊)

相關文章
相關標籤/搜索