歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

內存管理二之映射篇

上篇提到了內存管理的一些基本概念,本片介紹內存管理的虛擬地址與物理地址之間的映射關系。

2.0 內核空間與物理地址之間的映射

內核空間地址為3G~4G。由於開啟了分頁機制,內核想要訪問物理地址空間的話,必須先建立映射關系,然後通過虛擬地址來訪問。為了能夠訪問所有的物理地址空間,就要將全部物理地址映射到1G的內核線性空間中,這顯然不可能。於是,內核將0~896M的物理地址空間一一映射到自己的線性地址空間中,這樣他便可以隨時訪問ZONE_DMA和ZONE_NORMAL裡的物理頁面;此時內核剩下的128M線性地址空間不足以完全映射所有的ZONE_HIGHMEM,linux采取了動態映射的方法,即按需的將ZONE_HIGHMEM裡的物理頁面映射到kernel

space的最後128M線性地址空間裡,使用完之後釋放映射關系,以供其他物理頁面映射。雖然這樣存在效率的問題,但是內核畢竟可以正常的訪問所有的物理地址空間了。

2.1 用戶空間與物理地址之間的映射

關於內核空間和用戶空間,說的是linux驅動程序一般工作在內核空間,但也可以工作在用戶空間。

Linux簡化了分段機制,使得虛擬地址與線性地址總是一致,因此,Linux的虛擬地址空間也為0~4G.Linux內核將這4G字節的空間分為兩部分。將最高的1G字節(從虛擬地址0xC0000000到0xFFFFFFFF),供內核使用,稱為"內核空間".而將較低的3G字節(從虛擬地址0x00000000到0xBFFFFFFF),供各個進程使用,稱為"用戶空間)。因為每個進程可以通過系統調用進入內核,因此,Linux內核由系統內的所有進程共享。於是,從具體進程的角度來看,每個進程可以擁有4G字節的虛擬空間。

Linux使用兩級保護機制:0級供內核使用,3級供用戶程序使用。每個進程有各自的私有用戶空間(0~3G),這個空間對系統中的其他進程是不可見的。最高的1GB字節虛擬內核空間則為所有進程以及內核所共享。

內核空間中存放的是內核代碼和數據,而進程的用戶空間中存放的是用戶程序的代碼和數據。不管是內核空間還是用戶空間,它們都處於虛擬空間中。

簡單理解為:內核空間是內核使用,用戶空間是應用程序使用;除非編譯內核要考慮內核空間,其余情況都可以按照用戶空間處理

Copyright © Linux教程網 All Rights Reserved