Linux中內存管理
內存管理的主要工作就是對物理內存進行組織,然后對物理內存的分配和回收。但是Linux引入了虛擬地址的概念。
虛擬地址的作用如果用戶進程直接操作物理地址會有以下的壞處:1、 用戶進程可以直接操作內核對應的內存,破壞內核運行。2、 用戶進程也會破壞其他進程的運行CPU 中寄存器中存儲的是邏輯地址,需要進行映射才能轉化為對應的物理地址,然后獲取對應的內存。通過引入邏輯地址,每個進程都擁有單獨的邏輯地址范圍。當進程申請內存的時候,會為其分配邏輯地址和物理地址,并將邏輯地址和物理地址做一個映射。所以,Linux內存管理涉及到了以下三個部分:1、物理內存
物理內存的組織
Linux 中內存分為 3 個級別,從下到上依次為:1>、Page: 一個 page 的大小為 4k, Page 是內存的一個最基本的單位。2>、Zone: Zone 中提供了多個隊列來管理 page。Zone分為 3 種2.1、 ZONE_DMA:用來存放 DMA 讀取 IO 設備的數據,內核專用2.2、 ZONE_NORMAL:用來存放內核的相關數據,內核專用2.3、 ZONE_HIGHMEM:高端內存,用來存放用戶進程數據3>、Node 節點,一個 CPU 對應著一個 Node,一個 Node 包括一個 Zone_DMA、 ZONE_NORMAL、ZONE_HIGHMEM。同時當一個 CPU 對應的內存用光后,可以申請其他 CPU 對應的內存。![ef647674-7632-11ee-939d-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/AB/35/wKgaomU-IxmAVNgwAAJj6uZ89wI775.png)
物理內存的分配
Linux將內存分配分為兩種:1>、大內存大內存 利用伙伴系統 分配。![ef7c9cea-7632-11ee-939d-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/AB/35/wKgaomU-IxmAW4enAAEjO50v9tc051.png)
![ef804ff2-7632-11ee-939d-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/AB/35/wKgaomU-IxqAcgFLAAMbnhI7WJA476.png)
2、如何組織虛擬地址
虛擬地址對應的是虛擬空間,虛擬空間只不過是一個虛擬地址的集合,用來映射物理內存。![ef97b85e-7632-11ee-939d-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/AB/36/wKgaomU-IxqAGplCAAE51n2NKNM691.png)
![efa47210-7632-11ee-939d-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/AB/36/wKgaomU-IxqAGE6OAAIDMuIBHp4863.png)
![efb855aa-7632-11ee-939d-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/AB/36/wKgaomU-IxqAfwlEAAIwGrJEtZY283.png)
動態映射分為三種:1>、動態內存映射: 使用完對應的物理內存后,就可以映射其他物理內存了。2>、永久內存映射: 一個虛擬地址只能映射一個物理地址。如果需要映射其他物理地址,需要解綁。3>、固定內存映射: 只能被某些特定的函數來調用引用物理地址。動態內存映射和直接映射的區別動態映射和直接映射的區別就是邏輯地址到物理地址的轉化規則。直接映射直接映射的規則是死的,一個邏輯地址對應的物理地址是固定的。通過邏輯地址加或者減去一個數,就可以得到對應的物理地址。動態映射動態映射是動態的綁定,每個邏輯地址對應的物理地址是動態的,通過頁表進行查詢。用戶空間映射:用戶空間采用動態映射,每個虛擬地址可以被映射到一個物理地址,映射到ZONE_HIGHMEM。為什么用戶空間不采用直接映射呢?因為物理內存是多個進程所有的,每個進程都有一個用戶空間。如果采用直接映射的話,對應的物理地址是會沖突的。其用戶空間的邏輯地址大小都為 3G,所以存在邏輯地址相同,但是對應的物理地址不同。需要通過頁表來轉化,一個進程會對應一個頁表。
3、如何將虛擬地址映射到物理內存
虛擬地址通過 頁表 將 虛擬地址 轉化為 物理地址,每個進程都對應著一個頁表,內核只有一個頁表。虛擬空間 和 物理內存 都按照 4k 來分頁,一個虛擬空間中的頁 和 物理內存中頁 是 一一對應的。頁表映射
![efbf667e-7632-11ee-939d-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/AB/36/wKgaomU-IxqAeGhoAAEbG3-I3wk241.png)
![efd18d22-7632-11ee-939d-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/AB/36/wKgaomU-IxuAeT64AAMmJS2ZSTg715.png)
![efd61e50-7632-11ee-939d-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/AB/36/wKgaomU-IxuAXhVtAAGotOdeXxE562.png)
![efda01aa-7632-11ee-939d-92fbcf53809c.png](https://file1.elecfans.com/web2/M00/AB/36/wKgaomU-IxuAU3TQAAGnIVCOBV8130.png)
TLB
TLB 就是一個緩存,放在 CPU 中。用來將虛擬地址和對應的物理地址進行緩存。當查詢對應的物理地址的時候,首先查詢 TLB,如果TLB中存在對應的記錄,就直接返回。如果不存在,就再去查詢頁表。虛擬內存
虛擬內存 指的是 將硬盤中劃出一段 swap 分區 當作 虛擬的內存,用來存放內存中暫時用不到的內存頁,等到需要的時候再從 swap 分區中 將對應的內存頁調入到 內存中。硬盤此時相當于一個虛擬的內存。從邏輯上能夠運行更大內存的程序,因為程序運行的時候并不需要把所有數據都加載到內存中,只需要將當前運行必要的相關程序和數據加載到內存中就可以了,當需要其他數據和程序的時候,再將其調入。相較于真正的內存加載,虛擬內存需要將數據在內存和磁盤中不斷切換,這是一個耗時的操作,所以速度比不上真正的內存加載。總結
虛擬空間 和 物理內存 都分為 內核空間 和 用戶空間。虛擬地址需要通過頁表轉化為物理地址,然后才能訪問。用戶虛擬空間 只能映射 物理內存中的用戶內存,無法映射到物理內存中的內核內存,也就是說,用戶進程只能操作用戶內存。內核空間 只能被 內核 申請使用,用戶進程只能操作用戶空間的物理內存和虛擬空間。當用戶進程 調用系統調用的時候,會將其對應的代碼和數據運行在內核空間中。所以當調用 內核空間 讀取文件或者網絡數據的時候,首先會將數據拷貝到內存空間,然后在將數據從內核空間拷貝到用戶空間。因為 用戶進程不能訪問內核空間。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
嵌入式
+關注
關注
5089文章
19169瀏覽量
306778 -
Linux
+關注
關注
87文章
11336瀏覽量
210097 -
內存管理
+關注
關注
0文章
168瀏覽量
14163
原文標題:嵌入式Linux中內存管理詳解
文章出處:【微信號:嵌入式開發愛好者,微信公眾號:嵌入式開發愛好者】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
嵌入式Linux應用開發詳解 光盤
第2章,主要介紹嵌入式Linux的基本知識和如何配置嵌入式Linux開發環境;第二篇為系統篇,包括第3-7章,主要介紹了uClinux操作系統相關的知識,如任務
發表于 06-02 10:26
嵌入式系統內存管理
本帖最后由 VVX 于 2016-9-18 13:15 編輯
1、概述操作系統的內存管理功能用于向操作系統提供一致的地址映射功能和內存頁面的申請、釋放操作。在嵌入式實時系統
發表于 09-17 19:40
嵌入式學習路線 嵌入式學習路線詳解
,編寫一個守護進程程序,sleep系統調用任務管理、同步與通信Linux任務概述任務調度管道、信號共享內存,任務管理 API,了解Linux
發表于 03-17 18:05
ARM嵌入式Linux系統開發詳解
大量讀者好評的“Linux典藏大系”中的《ARM嵌入式Linux系統開發詳解》的第2版?!?b class='flag-5'>Linux
發表于 09-14 08:57
評論