日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux内存管理之一 分段与分页

發(fā)布時間:2025/3/15 linux 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux内存管理之一 分段与分页 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Linux內(nèi)存管理之一 分段與分頁

Posted on 2012-07-19 21:22 sin 閱讀(3130) 評論(0) ?編輯?收藏 引用 所屬分類: Linux編程 現(xiàn)代操作系統(tǒng)的內(nèi)存管理機制有兩種:段式管理和頁式管理。

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

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

嚴(yán)格說Linux采用段頁式內(nèi)存管理,也就是既分段,又分頁。地址映射的時候,先確定對應(yīng)的段,確定段基地址;段內(nèi)分頁,再找到對應(yīng)的頁表項,確定頁基地址;再由邏輯地址低位確定的頁偏移量,就能找到最終的物理地址。但是,實際上Linux采用的是頁式內(nèi)存管理。原因是Linux中的段基地址都是0,相當(dāng)于所有的段都是相同的。這樣做的原因是某些體系結(jié)構(gòu)的硬件限制,比如Intel的i386。作為軟件的操作系統(tǒng),必須要符合硬件體系。雖然所有段基地址都是0,但是段的概念在Linux內(nèi)核中是確實存在的。比如常見的內(nèi)核代碼段、內(nèi)核數(shù)據(jù)段、用戶態(tài)代碼段、用戶態(tài)數(shù)據(jù)段等。除了符合硬件要求外,段也是有實際意義的。

x86硬件分段單元:

邏輯地址分為兩部分組成:段標(biāo)識符和指定段內(nèi)相對地址的偏移量。
段描述符:用來存放段起始地址,段大小,存儲權(quán)限等。
段描述符表:存放段描述的表項。
段寄存器:存放段標(biāo)識符。6個段寄存器稱為cs(代碼段寄存器),ss(棧段寄存器),ds(數(shù)據(jù)段寄存器),es,fs 和gs。
段基地址寄存器:指向段描述符表地址。
Linux分段機制:
Linux對分段使用非常有限。作為一個跨硬件體系的操作系統(tǒng),要支持多種硬件體系,而一些硬件體系結(jié)構(gòu)式不支持分段的,Linux把所有段起始地址都設(shè)為0。
Linux采用4個段進(jìn)行尋址,用戶態(tài)代碼段,用戶態(tài)數(shù)據(jù)段,內(nèi)核態(tài)代碼段,內(nèi)核態(tài)數(shù)據(jù)段。


x86分頁單元:

x86采用兩級頁表。
第一級為頁目錄表,存儲在一個4K字節(jié)的頁中,每個表項包含了一個頁表的物理地址。線性地址最高的10位(22-31)用來產(chǎn)生第一級表索引,由該索引得到的表項中的內(nèi)容定位了二級表中的一個表的地址,即下級頁表所在的內(nèi)存塊號。
第二級為頁表,存儲在一個4K字節(jié)頁中,每個表項包含了一個頁的物理地址。線性地址的中間10位(12-21)位進(jìn)行索引,定位頁表表項,獲得頁的物理地址。頁物理地址的高20位與線性地址的低12位形成最后的物理地址。
分頁機制由CR0寄存器中的PG位啟用。如PG=1,啟用分頁機制,把線性地址轉(zhuǎn)換為物理地址。如PG=0,禁用分頁機制,直接段機制產(chǎn)生的線性地址當(dāng)作物理地址使用。
頁目錄表的物理地址存放在CR3寄存器。每個進(jìn)程有它自己的頁全局目錄和自己的頁表集。當(dāng)發(fā)生進(jìn)程切換時,Linux把CR3控制寄存器的內(nèi)容保存在前一個執(zhí)行進(jìn)程的描述符中,然后把下一個要執(zhí)行進(jìn)程的描述符的值裝入CR3寄存器中。這確保了當(dāng)新進(jìn)程重新開始在CPU上執(zhí)行時,分頁單元指向一組正確的頁表。
Linux分頁機制:
作為一個通用的操作系統(tǒng),Linux需要兼容各種硬件體系,包括不同位數(shù)的CPU。對64位的CPU來說,兩級頁表仍然太少,一個頁表會太大,這會占用太多寶貴的物理內(nèi)存。Linux采用了通用的四級頁表。實際采用幾級頁表則具體受硬件的限制。

四種頁表分別稱為: 頁全局目錄、頁上級目錄、頁中間目錄、頁表。對于32位x86系統(tǒng),兩級頁表已經(jīng)足夠了。Linux通過使“頁上級目錄”位和“頁中間目錄”位全為0,徹底取消了頁上級目 錄和頁中間目錄字段。不過,頁上級目錄和頁中間目錄在指針序列中的位置被保留,以便同樣的代碼在32位系統(tǒng)和64位系統(tǒng)下都能使用。 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的Linux内存管理之一 分段与分页的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。