當(dāng)使用Inter 80x86微處理器時,必須區(qū)分三種地址:
邏輯地址:有段基址和段偏移量組成。
線性地址:32位無符號整數(shù)。
物理地址
CPU通過分段單元將邏輯地址轉(zhuǎn)換為線性地址,再通過分頁單元將線性地址轉(zhuǎn)化為物理地址
硬件的分段單元
從80386CPU開始,Intel微處理器能執(zhí)行兩種不同的地址轉(zhuǎn)換模式,分別稱為實模式(為了與早期OS兼容)和保護模式,這里重點放在保護模式上。
段寄存器
一個邏輯地址由兩部分組成,一個段標(biāo)識符(16位)和一個相對地址的偏移量(32位),段寄存器是用來存放段選則符的,包括cs,ss,ds,es,fs,gs。
cs:代碼段寄存器,用于存放程序指令的段。
ss:棧段寄存器,指向當(dāng)前存放程序棧的段;什么是程序??臻g,即主要用來 存放函數(shù)和數(shù)組等。
ds:數(shù)據(jù)段寄存器,指向存放靜態(tài)數(shù)據(jù)(永久性不變的數(shù)據(jù))或者外部數(shù)據(jù)的段。
其它三個寄存器做一般用途,可以用來訪問任意段。
cs寄存器還有一個兩位域,用來指明cpu的特權(quán)級,linux中只有0和3級,分別為內(nèi)核態(tài)和用戶態(tài)。
段描述符
占8字節(jié),段描述符被放在全局描述符表(GDT)或者局部描述符表(LDT)。
系統(tǒng)通常只定義一個GDT(其地址被存放在GDTR寄存器中),每個進程可以有自己的LDT(其地址被存放在LDTR寄存器中)。
其中,系統(tǒng)段存儲內(nèi)核數(shù)據(jù)結(jié)構(gòu),任務(wù)狀態(tài)段用于保存處理器寄存器的內(nèi)容。

段選擇符
為了加速邏輯地址到線性地址的轉(zhuǎn)換,Intel處理器提供一種附加的非編程的寄存器(不能被程序員設(shè)置),這樣在訪問段寄存器中段選擇符時,就不能(不需要)訪問GDT或LDT了。

段單元
邏輯地址轉(zhuǎn)化為線性地址總覽:

Linux中的段
Linux更喜歡分頁的方式,當(dāng)所有的進程使用相同的段寄存器值時,內(nèi)存管理變得更簡單,它們能共享相同的線性地址。而且許多RISC處理器不支持段功能,Linux不好做移植。
硬件的分頁單元
分頁單元認(rèn)為所有的RAM被分成固定長度的頁框,每一個頁框包含一頁。在Intel處理器中,通過設(shè)置CR0寄存器的PG標(biāo)志啟動分頁。當(dāng)PG=0時,線性地址就被解釋成物理地址。
常規(guī)分頁
從i80386起,Intel處理器的分頁單元處理4KB的頁。32位線性地址被分成三個域:目錄(10),頁表(10),偏移量(12)。
正在使用的頁目錄表的物理地址存放在處理器的CR3寄存器中。

這里要說明下,在頁目錄和頁表表項中由Page Size標(biāo)志為1,頁目錄項指的是4MB的頁框。如果Present為0,分頁單元就把這個線性地址存放在處理器的CR2寄存器中,并產(chǎn)生14號缺頁異常。
擴展分頁
從奔騰處理器開始,Intel80x86微處理器引進了擴展分頁,它允許頁框大小為4KB或4MB(頁目錄10位,偏移量22位)。

之后就是引入cache和TLB(計算機組成原理內(nèi)容),就不詳細(xì)說了。
Linux的分頁
Linux采用三級分頁,頁全局目錄(10),頁中間目錄(10),頁表(10),偏移量(13)。

保留的頁框
內(nèi)核代碼和數(shù)據(jù)結(jié)構(gòu)存放在一組保留的頁框中,這些頁框所含的頁從不動態(tài)分配或者交換到內(nèi)存中。
作為一條常規(guī),Linux內(nèi)核被安裝在RAM物理地址0x00100000開始的地方,為什么從這個地方開始?
因為頁框0由BIOS使用,存放硬件配置。
物理地址0x000a0000到0x000fffff被BIO程序使用同時映射ISA上的顯存。
前1MB的其它頁框可能被保留用作特定的計算機模式。
為了避免把內(nèi)核裝入一組不連續(xù)的頁框,Linux更愿跳過第1MB的RAM。(內(nèi)核小于1MB _text---_etext)

審核編輯:劉清
-
寄存器
+關(guān)注
關(guān)注
31文章
5620瀏覽量
130457 -
cpu
+關(guān)注
關(guān)注
68文章
11332瀏覽量
226005 -
微處理器
+關(guān)注
關(guān)注
11文章
2440瀏覽量
86182 -
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
617瀏覽量
30178 -
LINUX內(nèi)核
+關(guān)注
關(guān)注
1文章
321瀏覽量
23306
發(fā)布評論請先 登錄
Linux的內(nèi)存管理是什么,Linux的內(nèi)存管理詳解
走進Linux內(nèi)存系統(tǒng)探尋內(nèi)存管理的機制和奧秘
關(guān)于Linux內(nèi)存管理的詳細(xì)介紹
Linux內(nèi)核的內(nèi)存管理詳解
linux內(nèi)存管理機制淺析
基于Linux內(nèi)存管理與Android內(nèi)存分配機制
你知道linux內(nèi)存管理基礎(chǔ)及方法?
Linux內(nèi)存管理體系介紹
Linux中內(nèi)存管理子系統(tǒng)開發(fā)必知的3個結(jié)構(gòu)概念
淺析Linux系統(tǒng)中的內(nèi)存管理
評論