Linux核心學習之分段機制

2021-09-30 15:21:30 字數 3331 閱讀 5850

**

x86分段機制

這裡講的分段指的保護模式(protected mode)下的段機制。與保護模式相對的乙個概念是實模式(real mode),實模式的位址由「段基址:偏移量」組成,段基址是個16位的暫存器(cs,ds等),這樣顯然限制了系統的定址空間。保護模式的位址由「段選擇子+偏移量組成」,段選擇子(segment selector)仍然由16位暫存器(cs,ds等)指定,但是其意義也不再是段基址,而是指定了乙個下標,用於從描述符表(x86把所有的段資訊都存在這個表中)中提取對應的段資訊。 

段選擇子格式:高12位作為下標從段描述符表選擇對應段資訊,第2位指示從哪個描述符表尋找(ti=0是取gdt),在x86中共有兩個,乙個是全域性描述符表gdt(global descriptor table),另乙個是區域性描述符表ldt(local descriptor table),低2位用於指示優先順序rpl(request privilege level)。x86共有4中優先順序(也叫4個ring),不過linux僅僅使用0和3。

段描述符格式:段描述符中的base(32位)指定了該段的基址,limit(26位)指定了段的範圍,具體數值要根據g bit來看,因為給定的是乙個「粒度」,相當於乙個單位,一般情況下是4k,所以總共就是2^26 * 4k = 2 ^ 32。另外type指明該段的屬性,比如是否**、可執行等,而dpl是與優先順序相關的屬性。

分段機制(邏輯位址 -- 線性位址)

linux對分段機制的應用

linux對段機制的應用效果是等價於幾乎繞過了段基址。在linux中僅有4個段,使用者**段、資料段和核心**段、資料段。

segment

base

g

limit

s

type

dpl

d/b

p

user code

0x00000000

10xfffff110

311user data

0x00000000

10xfffff12

311kernel code

0x00000000

10xfffff110

011kernel data

0x00000000

10xfffff12

011不難看到,由於base都為0,經分段機制後「線性位址=邏輯位址」,並且g=1(4k粒度)limit=2^20,因此最大定址空間為2^32。使用者層與核心層描述符之間的區別在於dpl。

上述四個描述符都在統一放在gdt中,事實上linux對ldt也是沒怎麼使用。gdt中內容如下:

x86分段機制

這裡講的分段指的保護模式(protected mode)下的段機制。與保護模式相對的乙個概念是實模式(real mode),實模式的位址由「段基址:偏移量」組成,段基址是個16位的暫存器(cs,ds等),這樣顯然限制了系統的定址空間。保護模式的位址由「段選擇子+偏移量組成」,段選擇子(segment selector)仍然由16位暫存器(cs,ds等)指定,但是其意義也不再是段基址,而是指定了乙個下標,用於從描述符表(x86把所有的段資訊都存在這個表中)中提取對應的段資訊。 

段選擇子格式:高12位作為下標從段描述符表選擇對應段資訊,第2位指示從哪個描述符表尋找(ti=0是取gdt),在x86中共有兩個,乙個是全域性描述符表gdt(global descriptor table),另乙個是區域性描述符表ldt(local descriptor table),低2位用於指示優先順序rpl(request privilege level)。x86共有4中優先順序(也叫4個ring),不過linux僅僅使用0和3。

段描述符格式:段描述符中的base(32位)指定了該段的基址,limit(26位)指定了段的範圍,具體數值要根據g bit來看,因為給定的是乙個「粒度」,相當於乙個單位,一般情況下是4k,所以總共就是2^26 * 4k = 2 ^ 32。另外type指明該段的屬性,比如是否**、可執行等,而dpl是與優先順序相關的屬性。

分段機制(邏輯位址 -- 線性位址)

linux對分段機制的應用

linux對段機制的應用效果是等價於幾乎繞過了段基址。在linux中僅有4個段,使用者**段、資料段和核心**段、資料段。

segment

base

g

limit

s

type

dpl

d/b

p

user code

0x00000000

10xfffff110

311user data

0x00000000

10xfffff12

311kernel code

0x00000000

10xfffff110

011kernel data

0x00000000

10xfffff12

011不難看到,由於base都為0,經分段機制後「線性位址=邏輯位址」,並且g=1(4k粒度)limit=2^20,因此最大定址空間為2^32。使用者層與核心層描述符之間的區別在於dpl。

上述四個描述符都在統一放在gdt中,事實上linux對ldt也是沒怎麼使用。gdt中內容如下:

Linux之分段機制和分頁機制

通用作業系統的設計原則 盡量縮短系統的平均響應時間並提高系統的吞吐率,在單位時間內為盡可能多的為使用者請求提供服務。如對於整個系統來說,注重所有任務的平均響應時間而不關心單個任務的響應時間,對於某個單個任務來說,注重每次執行的平均響應時間而不關心某次特定執行的響應時間。比如記憶體管理中的lru替換策...

Linux記憶體定址之分段機制

最近在學習linux核心,讀到 深入理解linux核心 的記憶體定址一章。原本以為自己對分段分頁機制已經理解了,結果發現其實是一知半解。於是,查詢了很多資料,最終理順了記憶體定址的知識。現在把我的理解記錄下來,希望對核心學習者有一定幫助,也希望大家指出錯誤之處。相信學過作業系統課程的人都知道分段分頁...

Linux 記憶體定址之分段機制

最近在學習linux核心,讀到 深入理解linux核心 的記憶體定址一章。原本以為自己對分段分頁機制已經理解了,結果發現其實是一知半解。於是,查詢了很多資料,最終理順了記憶體定址的知識。現在把我的理解記錄下來,希望對核心學習者有一定幫助,也希望大家指出錯誤之處。相信學過作業系統課程的人都知道分段分頁...