Linux内存管理之一 分段与分页
生活随笔
收集整理的這篇文章主要介紹了
Linux内存管理之一 分段与分页
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Linux內(nèi)存管理之一 分段與分頁
Posted on 2012-07-19 21:22 sin 閱讀(3130) 評論(0) ?編輯?收藏 引用 所屬分類: Linux編程 現(xiàn)代操作系統(tǒng)的內(nèi)存管理機(jī)制有兩種:段式管理和頁式管理。段式內(nèi)存管理,就是將內(nèi)存分成段,每個(gè)段的起始地址就是段基地址。地址映射的時(shí)候,由邏輯地址加上段基地址而得到物理地址。純粹的段式內(nèi)存管理的缺點(diǎn)很明顯,就是靈活性和效率比較差。首先是段的長度是可變的,這給內(nèi)存的換入換出帶來諸多不便,如何選擇一個(gè)段的長度是一個(gè)棘手的問題;其次進(jìn)程在運(yùn)行過程中,可能會(huì)擴(kuò)充地址空間,這就要增加段,從而造成進(jìn)程的地址空間由很多小段構(gòu)成,在進(jìn)程運(yùn)行過程中,訪問不同的段時(shí),就需要頻繁切換段基地址;再一點(diǎn),段式內(nèi)存管理如果有太多的小段,在釋放段的時(shí)候,會(huì)造成外部碎片。
頁式內(nèi)存管理,內(nèi)存分成固定長度的一個(gè)個(gè)頁片。地址映射的時(shí)候,需要先建立頁表,頁表中的每一項(xiàng)都記錄了這個(gè)頁的基地址。通過頁表,由邏輯地址的高位部分先找到邏輯地址對應(yīng)的頁基地址,再由頁基地址偏移一定長度就得到最后的物理地址,偏移的長度由邏輯地址的低位部分決定。一般情況下,這個(gè)過程都可以由硬件完成,所以效率還是比較高的。頁式內(nèi)存管理的優(yōu)點(diǎn)就是比較靈活,內(nèi)存管理以較小的頁為單位,方便內(nèi)存換入換出和擴(kuò)充地址空間。
嚴(yán)格說Linux采用段頁式內(nèi)存管理,也就是既分段,又分頁。地址映射的時(shí)候,先確定對應(yīng)的段,確定段基地址;段內(nèi)分頁,再找到對應(yīng)的頁表項(xiàng),確定頁基地址;再由邏輯地址低位確定的頁偏移量,就能找到最終的物理地址。但是,實(shí)際上Linux采用的是頁式內(nèi)存管理。原因是Linux中的段基地址都是0,相當(dāng)于所有的段都是相同的。這樣做的原因是某些體系結(jié)構(gòu)的硬件限制,比如Intel的i386。作為軟件的操作系統(tǒng),必須要符合硬件體系。雖然所有段基地址都是0,但是段的概念在Linux內(nèi)核中是確實(shí)存在的。比如常見的內(nèi)核代碼段、內(nèi)核數(shù)據(jù)段、用戶態(tài)代碼段、用戶態(tài)數(shù)據(jù)段等。除了符合硬件要求外,段也是有實(shí)際意義的。
x86硬件分段單元:
邏輯地址分為兩部分組成:段標(biāo)識符和指定段內(nèi)相對地址的偏移量。
段描述符:用來存放段起始地址,段大小,存儲(chǔ)權(quán)限等。
段描述符表:存放段描述的表項(xiàng)。
段寄存器:存放段標(biāo)識符。6個(gè)段寄存器稱為cs(代碼段寄存器),ss(棧段寄存器),ds(數(shù)據(jù)段寄存器),es,fs 和gs。
段基地址寄存器:指向段描述符表地址。
Linux分段機(jī)制:
Linux對分段使用非常有限。作為一個(gè)跨硬件體系的操作系統(tǒng),要支持多種硬件體系,而一些硬件體系結(jié)構(gòu)式不支持分段的,Linux把所有段起始地址都設(shè)為0。
Linux采用4個(gè)段進(jìn)行尋址,用戶態(tài)代碼段,用戶態(tài)數(shù)據(jù)段,內(nèi)核態(tài)代碼段,內(nèi)核態(tài)數(shù)據(jù)段。
x86分頁單元:
x86采用兩級頁表。
第一級為頁目錄表,存儲(chǔ)在一個(gè)4K字節(jié)的頁中,每個(gè)表項(xiàng)包含了一個(gè)頁表的物理地址。線性地址最高的10位(22-31)用來產(chǎn)生第一級表索引,由該索引得到的表項(xiàng)中的內(nèi)容定位了二級表中的一個(gè)表的地址,即下級頁表所在的內(nèi)存塊號。
第二級為頁表,存儲(chǔ)在一個(gè)4K字節(jié)頁中,每個(gè)表項(xiàng)包含了一個(gè)頁的物理地址。線性地址的中間10位(12-21)位進(jìn)行索引,定位頁表表項(xiàng),獲得頁的物理地址。頁物理地址的高20位與線性地址的低12位形成最后的物理地址。
分頁機(jī)制由CR0寄存器中的PG位啟用。如PG=1,啟用分頁機(jī)制,把線性地址轉(zhuǎn)換為物理地址。如PG=0,禁用分頁機(jī)制,直接段機(jī)制產(chǎn)生的線性地址當(dāng)作物理地址使用。
頁目錄表的物理地址存放在CR3寄存器。每個(gè)進(jìn)程有它自己的頁全局目錄和自己的頁表集。當(dāng)發(fā)生進(jìn)程切換時(shí),Linux把CR3控制寄存器的內(nèi)容保存在前一個(gè)執(zhí)行進(jìn)程的描述符中,然后把下一個(gè)要執(zhí)行進(jìn)程的描述符的值裝入CR3寄存器中。這確保了當(dāng)新進(jìn)程重新開始在CPU上執(zhí)行時(shí),分頁單元指向一組正確的頁表。
Linux分頁機(jī)制:
作為一個(gè)通用的操作系統(tǒng),Linux需要兼容各種硬件體系,包括不同位數(shù)的CPU。對64位的CPU來說,兩級頁表仍然太少,一個(gè)頁表會(huì)太大,這會(huì)占用太多寶貴的物理內(nèi)存。Linux采用了通用的四級頁表。實(shí)際采用幾級頁表則具體受硬件的限制。
四種頁表分別稱為: 頁全局目錄、頁上級目錄、頁中間目錄、頁表。對于32位x86系統(tǒng),兩級頁表已經(jīng)足夠了。Linux通過使“頁上級目錄”位和“頁中間目錄”位全為0,徹底取消了頁上級目 錄和頁中間目錄字段。不過,頁上級目錄和頁中間目錄在指針序列中的位置被保留,以便同樣的代碼在32位系統(tǒng)和64位系統(tǒng)下都能使用。 與50位技術(shù)專家面對面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的Linux内存管理之一 分段与分页的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bash mysql 循环输出_Bash
- 下一篇: python求输入数字的平方、如果平方运