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