9、linux内存管理子系统
管理模型
?
?
?
右邊是虛擬地址,左下角是虛擬地址到物理地址的轉換。
在linux系統程序中都是用虛擬地址。虛擬地址空間是由硬件來決定的。例如32位的系統,虛擬地址空間是4G=2的32次方。0-3G是用戶空間,3G-4G是內核空間。而內核空間又被分為了四個部分:直接映射區(896M),vmalloc區,永久映射區,固定映射區。
?
?
?
?
?
?
?
?
?
?
虛擬地址到物理地址的轉換
上圖的簡述:首先在我們的cr3寄存器中,存放的是頁目錄的基地址,然后虛擬地址把他轉換為物理地址。然后怎么去找到我們的存儲單元呢?首先高10位和我們的cr3相加,就可以找到一個頁目錄項里的頁表的基地址。頁表的基地址,再加上中間的10位,就可以找到一個物理頁的基地址。物理頁的基地址再去加上最后12位的偏移,就可以找到這個物理頁,就可以去找到這個物理存儲單元了。大小通常是4K大小。
?
?
?
我們知道,對于4G的內存,從3G----3G+896M,稱為低端內存,3G+896M----4G稱為高端內存。
在linux系統中,為了避免內存的浪費,采用的是虛擬內存,所謂的虛擬內存就是當你在用戶程序使用malloc函數去創建一個內存空間的時候,系統分配給你的是虛擬地址,當你真正要使用到這個物理地址的時候,會產生一個請頁異常(缺頁異常),此時系統才會給你分配真正的物理空間。在內核程序存在兩種情況:第一是:當我們使用vmalloc函數申請內存空間的時候,也是跟用戶程序一樣的情況。第二是:當我們采用Kmalloc函數申請內存空間的時候,內存才會分配給你虛擬內存和物理內存映射好的內存空間。原理是:內核里有一個slab函數,他會從空閑的物理內存中,取一些物理內存放到他的池子里面。當我們使用Kmalloc的時候,就會從池中分配一些給你。
?
這些知識現在知識了解,等學了驅動才去深入。
轉載于:https://www.cnblogs.com/FORFISH/p/5188438.html
總結
以上是生活随笔為你收集整理的9、linux内存管理子系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 火星人乘坐核动力飞船回故乡
- 下一篇: 《LINUX内核设计与实现》第五章学习总