linux的swapper pg dir的初始化

2021-06-16 07:36:53 字數 2437 閱讀 4819

**:

是乙個頁目錄的指標

.section ".bss.page_aligned","w" 

.fill 1024,4,0

什麼是保護模式

自從2023年推出第乙個微處理器以來,intel處理器就在不斷地更新換代,從8086、8088、80286,到80386、80486、奔騰、奔騰ⅱ、奔騰4等,其體系結構也在不斷變化。80386以後,提供了一些新的功能,彌補了8086的一些缺陷。這其中包括記憶體保護、多工及使用640kb以上的記憶體等,並仍然保持和8086家族的相容性。也就是說80386仍然具備了8086和80286的所有功能,但是在功能上有了很大的增強。早期的處理器是工作在實模式之下的,80286以後引入了保護模式,而在80386以後保護模式又進行了很大的改進。在80386中,保護模式為程式設計師提供了更好的保護,提供了更多的記憶體。事實上,保護模式的目的不是為了保護程式,而是要保護程式以外的所有程式(包括作業系統)。

簡言之,保護模式是處理器的一種最自然的模式。在這種模式下,處理器的所有指令及體系結構的所有特色都是可用的,並且能夠達到最高的效能。

保護模式和實模式

從表面上看,保護模式和實模式並沒有太大的區別,二者都使用了記憶體段、中斷和裝置驅動來處理硬體,但二者有很多不同之處。我們知道,在實模式中記憶體被劃分成段,每個段的大小為64kb,而這樣的段位址可以用16位來表示。記憶體段的處理是通過和段暫存器相關聯的內部機制來處理的,這些段暫存器(cs、ds、ss和es)的內容形成了實體地址的一部分。具體來說,最終的實體地址是由16位的段位址和16位的段內偏移位址組成的。用公式表示為:

實體地址=左移4位的段位址+偏移位址。

在保護模式下,段是通過一系列被稱之為「描述符表」的表所定義的。段暫存器儲存的是指向這些表的指標。用於定義記憶體段的表有兩種:全域性描述符表(gdt)和區域性描述符表(ldt)。gdt是乙個段描述符陣列,其中包含所有應用程式都可以使用的基本描述符。在實模式中,段長是固定的(為64kb),而在保護模式中,段長是可變的,其最大可達4gb。ldt也是段描述符的乙個陣列。與gdt不同,ldt是乙個段,其中存放的是區域性的、不需要全域性共享的段描述符。每乙個作業系統都必須定義乙個gdt,而每乙個正在執行的任務都會有乙個相應的ldt。每乙個描述符的長度是8個位元組,格式如圖3所示。當段暫存器被載入的時候,段基位址就會從相應的表入口獲得。描述符的內容會被儲存在乙個程式設計師不可見的影像暫存器(shadow register)之中,以便下一次同乙個段可以使用該資訊而不用每次都到表中提取。實體地址由16位或者32位的偏移加上影像暫存器中的基址組成。實模式和保護模式的不同可以從圖1和圖2中很清楚地看出來。

圖1 實模式的定址

圖2 保護模式下的定址

圖3 段描述俯的格式

此外,還有乙個中斷描述符表(idt)。這些中斷描述符會告訴處理器到那裡可以找到中斷處理程式。和實模式一樣,每乙個中斷都有乙個入口,但是這些入口的格式卻完全不同。因為在切換到保護模式的過程中沒有使用到idt,所以在此就不多做介紹了。

進入保護模式

80386有4個32位控制暫存器,名字分別為cr0、cr1、cr2和cr3。cr1是保留在未來處理器中使用的,在80386中沒有定義。cr0包含系統的控制標誌,用於控制處理器的操作模式和狀態。cr2和cr3是用於控制分頁機制的。在此,我們關注的是cr0暫存器的pe位控制,它負責實模式和保護模式之間的切換。當pe=1時,說明處理器執行於保護模式之下,其採用的段機制和前面所述的相應內容對應。如果pe=0,那麼處理器就工作在實模式之下。

切換到保護模式,實際就是把pe位置為1。為了把系統切換到保護模式,還要做一些其它的事情。程式必須要對系統的段暫存器和控制暫存器進行初始化。把pe位置1後,還要執行跳轉指令。過程簡述如下:

1.建立gdt表;

2.通過置pe位為1進入保護模式;

3.執行跳轉以清除在實模式下讀取的任何指令。

下面使用**來實現這個切換過程。

需要的東西

◆ 一張空白軟盤

◆ nasm編譯器

下面是整個程式的源**:

org 0x07c00; 起始位址是0000:7c00

jmp short begin_boot ; 跳過其它的資料,跳轉到引導程式的開始處

bootmesg db "our os boot sector loading ......"

pm_mesg db "switching to protected mode ...."

dw 512 ; 每一扇區的位元組數

db 1 ; 每一簇的扇區數

dw 1 ; 保留的扇區號

db 2

dw 0x00e0

dw 0x0b40

db 0x0f0

dw 9

dw 18

dw 2 ; 讀寫扇區號

dw 0 ; 隱藏扇區號

print_mesg :

mov ah,0x13 ; 使用中斷10h的功能13,在螢幕上寫乙個字串

mov al,0x00 ; 決定呼叫函

Linux 的學習以及linux的發展

從最早的redhat 6.2到今天的ubuntu 6.4 其中一半是工作需要一半是興趣使然。我個人覺得linux的使用和學習之路是艱難和痛苦,其原因一方面來自於linux資料和社群團隊的缺乏,另一方面是由於使用者介面的不善。linux源自傳統的unix系統,而unix系統則源自古老的大型機系統。而中...

linux 正確刪除linux的方法

如果你需要從乙個硬碟驅動器中刪除 linux 並且已經試圖用預設的 dos windows fdisk 來這麼做,你將會遇到 分割槽存在但又不存在 的問題。要刪除非 dos 分割槽的最好辦法是使用乙個理解分割槽而不單是 dos 的工具。首先,插入 red hat linux 光碟來引導系統。引導後,...

linux學習筆記 linux的啟動

系統初始化 建立終端 使用者登入系統 開啟計算機後,首先進行bios開機自檢,按照bios中設定的順序來啟動硬體 然後由作業系統接管硬體,首先讀入 boot目錄下的核心檔案 init 程序是系統所有程序的起點,你可以把它比擬成系統所有程序的老祖宗,沒有這個程序,系統中任何程序都不會啟動。init 程...