Linux知識點 – 進程概念(補充)
文章目錄
- Linux知識點 -- 進程概念(補充)
- 一、進程地址空間的堆區
- 二、虛擬地址到物理地址之間的轉化
- 三、虛擬地址到物理地址之間的映射
一、進程地址空間的堆區
在用戶每次使用malloc等函數在進程的堆區申請地址時,用戶只需要指定空間的大小,并且會得到一個起始地址,而不會得到結束地址;
-
因為堆區的結構都是由vm_area_struct管理的,每次malloc都會申請一個該結構體;
-
malloc在堆上申請空間時,只需要知道起始地址,不需要知道結束地址,就是因為vm_area_struct中保存了start和end;
-
堆區申請的空間都是連續的;
二、虛擬地址到物理地址之間的轉化
- 磁盤上的空間都是以4KB為單位的,我們的可執行程序存儲在磁盤上,其實它本來就是按照地址空間的方式進行編譯的,可執行程序也被劃分成了以4KB為單位的區域,存儲在磁盤上;
- 物理內存也是按照4KB劃分的,OS是通過struct page結構體對物理內存的各個單元進行管理的;
- 磁盤上的一個4KB單位叫做頁幀,物理內存上的一個4KB單位叫做頁框;
- IO的時候,基本單位就是4KB,就是將頁幀裝進頁框;
- 當OS通過頁表進行尋址時,發現對應地址的文件不在內存中,就需要引發缺頁中斷:
(1)申請對應的內存;
(2)在磁盤中查找對應的文件;
(3)加載到內存中指定的位置;
(4)重新填充頁表;
(5)返回到用戶;
三、虛擬地址到物理地址之間的映射
頁表中一個地址的映射叫做一個條目,假設一個條目大小為9byte(虛擬地址 + 物理地址 + 屬性),32位地址下一共2^32個條目,就是4GB個條目,一共就是36GB的頁表空間,內存中無法保存這么大的頁表;
- 實際上,OS在虛擬地址到物理地址的映射上,是將虛擬地址劃分的:
虛擬地址的前十個bit位在一級頁表進行索引,一級頁表的映射關系一共2^10,就是1024個;
一級頁表映射到二級頁表,再在對應的二級頁表中檢索中間的10bit地址;
二級頁表映射到物理內存的某個頁的起始地址;
后12位地址代表這個地址的頁內偏移(因為2^12 = 4KB);
這樣就能夠減小頁表的空間消耗;