Linux記憶體管理之一 分段與分頁

2021-09-14 02:43:13 字數 1906 閱讀 8694

現代作業系統的記憶體管理機制有兩種:段式管理和頁式管理。

段式記憶體管理,就是將記憶體分成段,每個段的起始位址就是段基位址。位址對映的時候,由邏輯位址加上段基位址而得到實體地址。純粹的段式記憶體管理的缺點很明顯,就是靈活性和效率比較差。首先是段的長度是可變的,這給記憶體的換入換出帶來諸多不便,如何選擇乙個段的長度是乙個棘手的問題;其次程序在執行過程中,可能會擴充位址空間,這就要增加段,從而造成程序的位址空間由很多小段構成,在程序執行過程中,訪問不同的段時,就需要頻繁切換段基位址;再一點,段式記憶體管理如果有太多的小段,在釋放段的時候,會造成外部碎片。

頁式記憶體管理,記憶體分成固定長度的乙個個頁片。位址對映的時候,需要先建立頁表,頁表中的每一項都記錄了這個頁的基位址。通過頁表,由邏輯位址的高位部分先找到邏輯位址對應的頁基位址,再由頁基位址偏移一定長度就得到最後的實體地址,偏移的長度由邏輯位址的低位部分決定。一般情況下,這個過程都可以由硬體完成,所以效率還是比較高的。頁式記憶體管理的優點就是比較靈活,記憶體管理以較小的頁為單位,方便記憶體換入換出和擴充位址空間。

嚴格說linux採用段頁式記憶體管理,也就是既分段,又分頁。位址對映的時候,先確定對應的段,確定段基位址;段內分頁,再找到對應的頁表項,確定頁基位址;再由邏輯位址低位確定的頁偏移量,就能找到最終的實體地址。但是,實際上linux採用的是頁式記憶體管理。原因是linux中的段基位址都是0,相當於所有的段都是相同的。這樣做的原因是某些體系結構的硬體限制,比如intel的i386。作為軟體的作業系統,必須要符合硬體體系。雖然所有段基位址都是0,但是段的概念在linux核心中是確實存在的。比如常見的核心**段、核心資料段、使用者態**段、使用者態資料段等。除了符合硬體要求外,段也是有實際意義的。

x86硬體分段單元:

邏輯位址分為兩部分組成:段識別符號和指定段內相對位址的偏移量。

段描述符表:存放段描述的表項。

段暫存器:存放段識別符號。6個段暫存器稱為cs(**段暫存器),ss(棧段暫存器),ds(資料段暫存器),es,fs 和gs。

linux分段機制:

linux對分段使用非常有限。作為乙個跨硬體體系的作業系統,要支援多種硬體體系,而一些硬體體系結構式不支援分段的,linux把所有段起始位址都設為0。

linux採用4個段進行定址,使用者態**段,使用者態資料段,核心態**段,核心態資料段。

x86分頁單元:

x86採用兩級頁表。

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

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

分頁機制由cr0暫存器中的pg位啟用。如pg=1,啟用分頁機制,把線性位址轉換為實體地址。如pg=0,禁用分頁機制,直接段機制產生的線性位址當作實體地址使用。

頁目錄表的實體地址存放在cr3暫存器。每個程序有它自己的頁全域性目錄和自己的頁表集。當發生程序切換時,linux把cr3控制暫存器的內容儲存在前乙個執行程序的描述符中,然後把下乙個要執行程序的描述符的值裝入cr3暫存器中。這確保了當新程序重新開始在cpu上執行時,分頁單元指向一組正確的頁表。

linux分頁機制:

作為乙個通用的作業系統,linux需要相容各種硬體體系,包括不同位數的cpu。對64位的cpu來說,兩級頁表仍然太少,乙個頁表會太大,這會占用太多寶貴的物理記憶體。linux採用了通用的四級頁表。實際採用幾級頁表則具體受硬體的限制。

四種頁表分別稱為: 頁全域性目錄、頁上級目錄、頁中間目錄、頁表。對於32位x86系統,兩級頁表已經足夠了。linux通過使「頁上級目錄」位和「頁中間目錄」位全為0,徹底取消了頁上級目 錄和頁中間目錄字段。不過,頁上級目錄和頁中間目錄在指標序列中的位置被保留,以便同樣的**在32位系統和64位系統下都能使用。

Linux記憶體管理之一 分段與分頁

現代作業系統的記憶體管理機制有兩種 段式管理和頁式管理。段式記憶體管理,就是將記憶體分成段,每個段的起始位址就是段基位址。位址對映的時候,由邏輯位址加上段基位址而得到實體地址。純粹的段式記憶體管理的缺點很明顯,就是靈活性和效率比較差。首先是段的長度是可變的,這給記憶體的換入換出帶來諸多不便,如何選擇...

Linux記憶體管理之一 分段與分頁

現代作業系統的記憶體管理機制有兩種 段式管理和頁式管理。段式記憶體管理,就是將記憶體分成段,每個段的起始位址就是段基位址。位址對映的時候,由邏輯位址加上段基位址而得到實體地址。純粹的段式記憶體管理的缺點很明顯,就是靈活性和效率比較差。首先是段的長度是可變的,這給記憶體的換入換出帶來諸多不便,如何選擇...

儲存器管理 4 分段儲存管理

1 基本思想 程式 分段 如 段 資料段 堆疊段等。每個段對應乙個段號,乙個段的虛擬位址空間從0開始連續編號。每段佔據一塊連續的記憶體。各段大小不等。記憶體動態分割槽 在程式裝入時,按照程式的段來分配記憶體,根據段的實際需求量,查詢乙個合適的空閒區,如果空閒區長度等於段的需求量,就可直接分配,否則將...