當(dāng)使用Inter 80x86微處理器時(shí),必須區(qū)分三種地址:
邏輯地址:有段基址和段偏移量組成。
線性地址:32位無(wú)符號(hào)整數(shù)。
物理地址
CPU通過(guò)分段單元將邏輯地址轉(zhuǎn)換為線性地址,再通過(guò)分頁(yè)單元將線性地址轉(zhuǎn)化為物理地址
硬件的分段單元
從80386CPU開始,Intel微處理器能執(zhí)行兩種不同的地址轉(zhuǎn)換模式,分別稱為實(shí)模式(為了與早期OS兼容)和保護(hù)模式,這里重點(diǎn)放在保護(hù)模式上。
段寄存器
一個(gè)邏輯地址由兩部分組成,一個(gè)段標(biāo)識(shí)符(16位)和一個(gè)相對(duì)地址的偏移量(32位),段寄存器是用來(lái)存放段選則符的,包括cs,ss,ds,es,fs,gs。
cs:代碼段寄存器,用于存放程序指令的段。
ss:棧段寄存器,指向當(dāng)前存放程序棧的段;什么是程序棧空間,即主要用來(lái) 存放函數(shù)和數(shù)組等。
ds:數(shù)據(jù)段寄存器,指向存放靜態(tài)數(shù)據(jù)(永久性不變的數(shù)據(jù))或者外部數(shù)據(jù)的段。
其它三個(gè)寄存器做一般用途,可以用來(lái)訪問(wèn)任意段。
cs寄存器還有一個(gè)兩位域,用來(lái)指明cpu的特權(quán)級(jí),linux中只有0和3級(jí),分別為內(nèi)核態(tài)和用戶態(tài)。
段描述符
占8字節(jié),段描述符被放在全局描述符表(GDT)或者局部描述符表(LDT)。
系統(tǒng)通常只定義一個(gè)GDT(其地址被存放在GDTR寄存器中),每個(gè)進(jìn)程可以有自己的LDT(其地址被存放在LDTR寄存器中)。
其中,系統(tǒng)段存儲(chǔ)內(nèi)核數(shù)據(jù)結(jié)構(gòu),任務(wù)狀態(tài)段用于保存處理器寄存器的內(nèi)容。
段選擇符
為了加速邏輯地址到線性地址的轉(zhuǎn)換,Intel處理器提供一種附加的非編程的寄存器(不能被程序員設(shè)置),這樣在訪問(wèn)段寄存器中段選擇符時(shí),就不能(不需要)訪問(wèn)GDT或LDT了。
段單元
邏輯地址轉(zhuǎn)化為線性地址總覽:
Linux中的段
Linux更喜歡分頁(yè)的方式,當(dāng)所有的進(jìn)程使用相同的段寄存器值時(shí),內(nèi)存管理變得更簡(jiǎn)單,它們能共享相同的線性地址。而且許多RISC處理器不支持段功能,Linux不好做移植。
硬件的分頁(yè)單元
分頁(yè)單元認(rèn)為所有的RAM被分成固定長(zhǎng)度的頁(yè)框,每一個(gè)頁(yè)框包含一頁(yè)。在Intel處理器中,通過(guò)設(shè)置CR0寄存器的PG標(biāo)志啟動(dòng)分頁(yè)。當(dāng)PG=0時(shí),線性地址就被解釋成物理地址。
常規(guī)分頁(yè)
從i80386起,Intel處理器的分頁(yè)單元處理4KB的頁(yè)。32位線性地址被分成三個(gè)域:目錄(10),頁(yè)表(10),偏移量(12)。
正在使用的頁(yè)目錄表的物理地址存放在處理器的CR3寄存器中。
這里要說(shuō)明下,在頁(yè)目錄和頁(yè)表表項(xiàng)中由Page Size標(biāo)志為1,頁(yè)目錄項(xiàng)指的是4MB的頁(yè)框。如果Present為0,分頁(yè)單元就把這個(gè)線性地址存放在處理器的CR2寄存器中,并產(chǎn)生14號(hào)缺頁(yè)異常。
擴(kuò)展分頁(yè)
從奔騰處理器開始,Intel80x86微處理器引進(jìn)了擴(kuò)展分頁(yè),它允許頁(yè)框大小為4KB或4MB(頁(yè)目錄10位,偏移量22位)。
之后就是引入cache和TLB(計(jì)算機(jī)組成原理內(nèi)容),就不詳細(xì)說(shuō)了。
Linux的分頁(yè)
Linux采用三級(jí)分頁(yè),頁(yè)全局目錄(10),頁(yè)中間目錄(10),頁(yè)表(10),偏移量(13)。
保留的頁(yè)框
內(nèi)核代碼和數(shù)據(jù)結(jié)構(gòu)存放在一組保留的頁(yè)框中,這些頁(yè)框所含的頁(yè)從不動(dòng)態(tài)分配或者交換到內(nèi)存中。
作為一條常規(guī),Linux內(nèi)核被安裝在RAM物理地址0x00100000開始的地方,為什么從這個(gè)地方開始?
因?yàn)轫?yè)框0由BIOS使用,存放硬件配置。
物理地址0x000a0000到0x000fffff被BIO程序使用同時(shí)映射ISA上的顯存。
前1MB的其它頁(yè)框可能被保留用作特定的計(jì)算機(jī)模式。
為了避免把內(nèi)核裝入一組不連續(xù)的頁(yè)框,Linux更愿跳過(guò)第1MB的RAM。(內(nèi)核小于1MB _text---_etext)
審核編輯:劉清
-
寄存器
+關(guān)注
關(guān)注
31文章
5355瀏覽量
120517 -
cpu
+關(guān)注
關(guān)注
68文章
10872瀏覽量
211999 -
微處理器
+關(guān)注
關(guān)注
11文章
2264瀏覽量
82496 -
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
594瀏覽量
27410 -
LINUX內(nèi)核
+關(guān)注
關(guān)注
1文章
316瀏覽量
21656
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論