linux分段引導程式 Linux的分段和分頁機制

2021-10-17 02:28:37 字數 4603 閱讀 2872

寫在前面 : 上半部分為一般原理,即先分段再分頁,作業系統和組成原理上都應該有

下半部分為linux的保護模式,邏輯位址 對映 線性位址的原理。

**1.分段機制

80386的兩種工作模式

80386的工作模式包括實位址模式和虛位址模式(保護模式)。linux主要工作在保護模式下。

分段機制

在保護模式下,80386虛位址空間可達16k個段,每段大小可變,最大達4gb。

從邏輯位址到線性位址的轉換由80386分段機制管理。段暫存器cs、ds、es、ss、fs或gs標識乙個段。這些段暫存器作為段選擇器,用來選擇該段的描述符。

分段邏輯位址到線性位址轉換圖

圖9_7 分段邏輯位址到線性位址轉換圖

2. 分頁機制

分頁機制的作用

分頁機制是在段機制之後進行的,它進一步將線性位址轉換為實體地址。

80386使用4k位元組大小的頁,且每頁的起始位址都被4k整除。因此,80386把4gb位元組線性位址空間劃分為1m個頁面,採用了兩級表結構。

兩級頁表

兩級表的第一級表稱為頁目錄,儲存在乙個4k位元組的頁中,頁目錄表共有1k個表項,每個表項為4個位元組,線性位址最高的10位(22-31)用來產生第一級表索引,由該索引得到的表項中的內容定位了二級表中的乙個表的位址,即下級頁表所在的記憶體塊號。

第二級表稱為頁表,儲存在乙個4k位元組頁中,它包含了1k位元組的表項,每個表項包含了乙個頁的實體地址。二級頁表由線性位址的中間10位(12-21)位進行索引,定位頁表表項,獲得頁的實體地址。頁實體地址的高20位與線性位址的低12位形成最後的實體地址。

利用兩級頁表轉換位址

圖9_8 利用兩級頁表轉換位址

3. 核心空間和使用者空間

使用者空間

在linux中,每個使用者程序都可以訪問4gb的線性虛擬記憶體空間。其中從0到3gb的虛存位址是使用者空間,使用者程序可以直接訪問。

核心空間

從3gb到4gb的虛存位址為核心態空間,存放供核心訪問的**和資料,使用者態程序不能訪問。所有程序從3gb到4gb的虛擬空間都是一樣的,linux以此方式讓核心態程序共享**段和資料段。

保護模式(1)---儲存方式

writen by dangerman

保護模式現代作業系統的基礎,理解他是我們要翻越的第一座山。保護模式是相對實模式而言的,他們是處理器的兩種工作方式。很久以前大家使用的dos就是執行在實模式下,而現在的windows作業系統則是執行在保護模式下。兩種執行模式有著較大的不同,

實模式由於是由8086/8088發展而來因此他更像是乙個執行微控制器的簡單模式,計算機啟動後首先進入的就是實模式,通過8086/8088只有20根 位址線所以它的定址範圍只有2的20次冪,即1m。記憶體的訪問方式就是我們熟悉的seg:offset邏輯位址方式,例如我們給出位址邏輯位址它將在 cpu內轉換為20的實體地址,即將seg左移4位再加上offset值。例如位址1000h:5678h,則實體地址為 10000h+5678h=15678h。實模式在後續的cpu中被保留了下來,但實模式的侷限性是很明顯的,由於使用seg:offset邏輯位址只能

訪問1m多一點的記憶體空間,在擁有32根位址線的cpu中訪問1m以上的空間則變得很困難。而且隨著計算機的不斷發展實模式的工作方式越來越不能滿足計算 機對資源(儲存資源和cpu資源等等)的管理,由此產生了新的管理方式——保護模式。

80386及以上的處理器功能要大大超過其先前的處理器,但只有在保護模式下,處理器才能發揮作用。在保護模式下,全部32根位址線有效,可定址4g的物 理位址空間;擴充的儲存分段機制和可選的儲存器分頁機制,不僅為儲存器共享和保護提供了硬體支援,而且為實現虛擬儲存器提供了硬體支援;支援多工;4個 特權級和完善的特權級檢查機制,實現了資料的安全和保密。計算機啟動後首先進入的就是實模式,通過設定相應的暫存器才能進入保護模式(以後介紹)。保護模式是乙個整體的工作方式,但分步討論由淺入深更利於學習。

一.儲存方式

儲存方式主要體現在記憶體訪問方式上,由於相容和ia32框架的限制,保護模式在記憶體訪問上延用了實模式下的seg:offset的形式(即:邏輯位址), 其實seg:offset的形式在保護模式下只是乙個軀殼,內部的儲存方式與實模式截然不同。在保護模式下邏輯位址並不是直接轉換為實體地址,而是將邏輯 位址首先轉換為線性位址,再將線性位址轉換為實體地址。如圖一:

線性位址是個新概念,但大家不要把它想的過於複雜,簡單的說他就是0000000h~ffffffffh(即0~4g)的線性結構,是32個bite位能 表示的一段連續的位址,但他是乙個概念上的位址,是個抽象的位址,並不存在在現實之中。線性位址位址主要是為分頁機制而產生的。處理器在得到邏輯位址後首 先通過分段機制轉換為線性位址,線性位址再通過分頁機制轉換為實體地址最後讀取資料。如圖二:

分段機制是必須的,分頁機制是可選的,當不使用分頁的時候線性位址將直接對映為實體地址,設立分頁機制的目的主要是為了實現虛擬儲存(分頁機制在後面介紹)。先來介紹一下分段機制,以下文字是介紹如何由邏輯位址轉換為線性位址。

分 段機制在保護模式中是不能被繞過得,回到我們的seg:offset位址結構,在保護模式中seg有個新名字叫做「段選擇子 」(seg..selector)。段選擇子、gdt、ldt構成了保護模式的儲存結構,如圖三`,gdt、ldt分別叫做全域性描述符表和區域性描述符表, 描述符表是乙個線性表(陣列),表中存放的是描述符。

「描述符」是保護模式中的乙個新概念,它是乙個8位元組的資料結構,它的作用主要是描述乙個段(還有其他作用以後再說),用描述表中記錄的段基址加上邏輯地 址(sel:offset)的offset轉換成線性位址。描述符主要包括三部分:段基址(base)、段限制(limit)、段屬性(attr)。乙個 任務會涉及多個段,每個段需要乙個描述符來描述,為了便於組織管理,80386及以後處理器把描述符組織成表,即描述符表。在保護模式中存在三種描述符表 「全域性描述符表」(gdt)、「區域性描述符表」(ldt)和中斷描述符表(idt)(idt在以後討論)。

(1)全域性描述符表gdt(global descriptor table)在整個系統中,全域性描述符表gdt只有一張,gdt可以被放在記憶體的任何位置,但cpu必須知道gdt的入口,也就是基位址放在**,intel的設計者門提供了乙個暫存器gdtr用來存放gdt的入口位址,程式設計師將gdt設定在記憶體中某個位置之後,可以通過lgdt指令將gdt的入口位址裝入此積存器,從此以後,cpu就根據此暫存器中的內容作為gdt的入口來訪問gdt了。gdtr中存放的是gdt在記憶體中的基位址和其表長界限。

(2)段選擇子(selector)由gdtr訪問全域性描述符表是通過「段選擇子」(實模式下的段暫存器)來完成的,如圖三①步。段選擇子是乙個16位的暫存器(同實模式下的段暫存器相同)如圖四

段選擇子包括三部分:描述符索引(index)、ti、請求特權級(rpl)。他的index(描述符索引)部分表示所需要的段的描述符在描述符表的位 置,由這個位置再根據在gdtr中儲存的描述符表基址就可以找到相應的描述符(如圖三①步)。然後用描述符表中的段基址加上邏輯位址 (sel:offset)的offset就可以轉換成線性位址(如圖三②步),段選擇子中的ti值只有一位0或1,0代表選擇子是在gdt選擇,1代表選 擇子是在ldt選擇。請求特權級(rpl)則代表選擇子的特權級,共有4個特權級(0級、1級、2級、3級)。例如給出邏輯地

a. 選擇子sel=21h=0000000000100 0 01b 他代表的意思是:選擇子的index=4即100b選擇gdt中的第4個描述符;ti=0代表選擇子是在gdt選擇;左後的01b代表特權級rpl=1

b. offset=12345678h若此時gdt第四個描述符中描述的段基址(base)為11111111h,則線性位址=11111111h+12345678h=23456789h

(3)區域性描述符表ldt(local descriptor table)區域性描述符表可以有若干張,每個任務可以有一張。我們可以這樣理解gdt和ldt:gdt為一級描述符表,ldt為二級描述符表。如圖五

ldt和gdt從本質上說是相同的,只是ldt巢狀在gdt之中。ldtr記錄區域性描述符表的起始位置,與gdtr不同ldtr的內容是乙個段選擇子。由 於ldt本身同樣是一段記憶體,也是乙個段,所以它也有個描述符描述它,這個描述符就儲存在gdt中,對應這個表述符也會有乙個選擇子,ldtr裝載的就是

這樣乙個選擇子。ldtr可以在程式中隨時改變,通過使用lldt指令。如圖五,如果裝載的是selector 2則ldtr指向的是表ldt2。舉個例子:如果我們想在表ldt2中選擇第三個描述符所描述的段的位址12345678h。1. 首先需要裝載ldtr使它指向ldt2 使用指令lldt將select2裝載到ldtr2. 通 過邏輯位址(sel:offset)訪問時sel的index=3代表選擇第三個描述符;ti=1代表選擇子是在ldt選擇,此時ldtr指向的是 ldt2,所以是在ldt2中選擇,此時的sel值為1ch(二進位制為11 1 00b)。offset=12345678h。邏輯位址為1c:12345678h3. 由sel選擇出描述符,由描述符中的基址(base)加上offset可得到線性位址,例如基址是11111111h,則線性位址=11111111h+12345678h=23456789h4. 此時若再想訪問ldt1中的第三個描述符,只要使用lldt指令將選擇子selector 1裝入再執行2、3兩步就可以了(因為此時ldtr又指向了ldt1)由於每個程序都有自己的一套程式段、資料段、堆疊段,有了區域性描述符表則可以將每個程序的程式段、資料段、堆疊段封裝在一起,只要改變ldtr就可以實現對不同程序的段進行訪問。儲存方式是保護模式的基礎,學習他主要注意與實模式下的儲存模式的對比,總的思想就是首先通過段選擇子在描述符表中找到相應段的描述符,根據描述符中的段基址首先確定段的位置,再通過offset加上段基址計算出線性位址

Linux引導程式型別

bootloader monitor 描述 x86 arm powerpc lilo 否linux磁碟引導程式是否 否grub 否gnu的lilo替代程式是否 否loadlim 否從dos引導linux是否 否rolo 否從rom引導linux而不需要bios是否 否etherboot 否通過乙太網...

linux引導程式剖析(三)

該部分程式是在核心 的開頭部分,用來 做一些初始化的操作,比如重新設定idt,gdt,設定頁表等,最後將控制轉移到核心的main函式。text globl idt,gdt,pg dir,tmp floppy area 這個標誌是站位的,之後該程式會將頁目錄表存放在該處 將head.s的開頭部分覆蓋。...

Linux 引導啟動程式(boot)

主要描述boot 目錄中的三個彙編 檔案,見列表3 1 所示。正如在前一章中提到的,這三個檔案雖然都是匯程式設計序,但卻使用了兩種語法格式。bootsect.s 和setup.s 採用近似於intel 的組合語言語法,需要使用intel8086 彙編編譯器和聯結器as86 和ld86 而head.s...