Linux內核之淺析內存管理(一)

前言

在學習linux驅動,過程中遇到一些linux內存管理上的東西,在此記錄,當做回顧思考,也算作筆記以備查看,_

一、linux內存虛擬地址佈局

    首先需要了解的就是在32位的linux的內存管理中,它把4G的虛擬地址空間分爲了3G的用戶地址空間和1G的內核地址空間。如下圖所示。
在這裏插入圖片描述
下面來關注這樣幾個問題:
Q1:每個進程用戶空間的虛擬地址空間(0-3G)是一樣的,你可能會有疑問:如果進程的虛擬地址空間一樣,不會造成重疊嗎?

A1:答案是不會。這就涉及到虛擬地址和物理地址的概念了。CPU發出一個虛擬地址後,內存管理單元(可以想象爲一個硬件部分)會根據不同的進程把這些“相同”的虛擬地址轉化爲(專業一點的說法是映射)不同的物理地址,所用的工具就是頁表(可以看做從虛擬地址到物理地址的索引)

Q2:每個進程內核空間的虛擬地址空間(3G-4G)是一樣的,那麼不同的進程的內核虛擬地址不會衝突嗎?

A2:答案是會。但這不影響,因爲每個進程本來就是共享內核空間的,即共享3G-4G這段內核空間所對應的的物理地址空間。(準確的說,這裏面的高內存段是通過不同進程的內核頁表同步實現的)

二、物理地址空間的分區段

先來上一張圖。
在這裏插入圖片描述

    每個進程的用戶空間佔據着0-3G的地址空間,每個進程根據自身的頁表,將要訪問的地址相安無事的映射到不同的物理地址上(這裏暫不考慮虛擬內存、換入換出的情況)。這種映射是動態的,即如上圖中用戶空間的動態映射。

    相對應的,每個進程的內核虛擬地址空間是一樣的(3G-4G),它們也會共享相同的內核物理地址空間(準確的說是物理內存映射區)。linux把這段共享的物理地址空間分爲三個部分,如上圖所示。
(1)、ZONE_DMA
(2)、ZONE_NORMAL
(3)、ZONE_HIGHMEM
其中,ZONE_DMA和ZONE_NORMAL段是直接映射的,即上圖中的連續映射部分(我估計這裏面主要放一些內核固定的代碼部分);而
ZONE_HIGHMEM是動態映射的,其主要是爲了解決1G的內核空間訪問4G的物理內存的問題(vmalloc申請返回的虛擬地址就在這個部分),這裏就不細說了。有興趣的可以參照,文後的一些參考。

參考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章