歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux 0.12內核與現代內核在內存管理上的區別

Linux 0.12內核與現代內核在內存管理上的區別

日期:2017/2/28 13:55:46   编辑:Linux教程

Linux 0.12內核的內存管理比較簡單粗暴,內核只用了一個頁目錄,只能映射4G的線性空間,所以每個進程的虛擬空間(邏輯空間)只能給到64M,最多64個進程;每個進程都有對應的任務號nr,當一個進程需要分配進程空間時,只需要nr乘以64M就可以得出該進程空間的線性起始地址。然後該進程的代碼段、數據段描述符裡面的基址字段會被設定為(nr x 64M),同時可以為進程分配頁目錄項和頁目錄表用以承載映射關系。

之後如果進程要訪問自己空間內的某個地址時就會首先用基地址與程序內32位偏移地址(邏輯地址)合成出線性地址,這個合成出來的線性地址一定在(段基址)~(段基址+段限長)之間,也就是(nr x 64M ~ nr x 64M+64M)之間。然後用這個線性地址遵循:“頁目錄項-頁表-頁表表項”這樣的順序找到對應的頁表表項,也就找到了物理地址,就可以真正的存取數據了。

但是在現代內核裡,內存管理有很多不同。

首先,線性地址空間不會改變,32位CPU可尋址4G線性空間。這個是唯一的。

但是每個進程都有自己各自獨立的4G虛擬空間,那麼這是如何做到的呢?其實是每個進程給它一個自己的頁目錄,這樣每個進程就能擁有4G的虛擬空間(邏輯空間)了。

注意:0.12內核兩個進程各自合成出的線性地址一定不相同,因為每個進程占據線性空間的不同區域。但是現代內核裡,A、B兩個進程可能合成出相同的線性地址,因為每個進程都有4G的虛擬空間,也就是說虛擬空間和線性空間對等了。但是由於兩個進程的頁目錄和頁表都不同,所以這兩個進程會把各自合成出的數值相等的線性地址,映射到不同的物理地址。也就是兩者線性空間到物理空間的映射是不同的。換句話說在現代內核裡,虛擬空間(邏輯空間)和線性空間幾乎成了一個概念,以下不作區分。

舉個例子,即使A和B進程同時訪問各自線性空間的0x0804800地址處,分段分頁地址變換機制也會把0x0804800這個線性地址映射到不同的物理地址上去。而這個過程,進程自己是看不到的,A和B都認為自己成功訪問了0x0804800這個地址,但是實際上,他們訪問的是各自線性空間裡“數值相等的”線性地址,最終這兩個“數值上相等”的線性地址將映射到不同的的物理內存地址處。這就實現了進程隔離。

每個進程都具備4G的線性空間(虛擬空間),進程的線性空間之間相互隔離,互不干涉,每個進程都在自己的世界裡干活。

上面說的都是從操作系統原理的角度說的,放到具體的Linux操作系統上會有點不同。因為Linux內核裡面規定,雖然每個進程各自擁有4G的線性空間,但是他們並不能隨意使用這全部的4個G。0-3G是用戶空間,的確是可以自由使用的,但是3G-4G之間內核空間,不能被隨意使用。所以,上面的理論可以完善為,每個進程都有一個大小為4G的線性空間,這4G的線性空間分為兩部分:

大小為3G的用戶空間,各進程在“特權級3級”下可以自由獨立使用,各進程的這塊空間是完全獨立的互不影響的,是指向物理內存不同位置的。

大小為1G的內核空間,各進程在“特權級0級”下才可以使用這塊空間,各進程的這塊空間不是獨立的,是指向同一物理內存位置的。也就是說是所有進程共享的。

Copyright © Linux教程網 All Rights Reserved