色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

嵌入式Linux中內存管理詳解

嵌入式開發愛好者 ? 來源:嵌入式開發愛好者 ? 2023-10-29 17:15 ? 次閱讀

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 ? ?

物理內存的分配

Linux將內存分配分為兩種:1>、大內存大內存 利用伙伴系統 分配。ef7c9cea-7632-11ee-939d-92fbcf53809c.png伙伴系統的做法是將 ZONE 中的 Page 分組,然后組裝為多個鏈表。鏈表中存放的是 頁塊 的集合。頁塊對應著有不同的大小,分別為 1、2、4、8 … 1024個頁。當請求 (2i-1 ,2i] 大小的 page 的時候,會直接請求 2i 個頁, 如果對應的鏈表中有對應的頁塊,就直接分配。如果對應的鏈表沒有,就往上找 2i+1,如果 2i+1 存在,就將其分為 2 個 2i 頁塊,將其中 1 個 2i 加入到對應的鏈表中,將另外一個分配出去。例如,要請求一個 128 個頁的頁塊時,先檢查 128 個頁的頁塊鏈表是否有空閑塊。如果沒有,則查 256 個的頁塊鏈表;如果有空閑塊的話,則將 256 個頁的頁塊分成兩份,一份使用,一份插入 128 個頁的頁塊鏈表中。如果還是沒有,就查 512 個頁的頁塊鏈表;如果有的話,就分裂為 128、128、256 三個頁塊,一個 128 的使用,剩余兩個插入對應頁塊鏈表。2>、小內存分配小內存分配利用 slub 分配,比如對象等數據 slub 就是 將幾個頁單獨拎出來作為緩存,里面維護了鏈表。每次直接從鏈表中獲取對應的內存,用完之后也不用清空,就直接掛到鏈表上,然后等待下次利用。ef804ff2-7632-11ee-939d-92fbcf53809c.png

2、如何組織虛擬地址

虛擬地址對應的是虛擬空間,虛擬空間只不過是一個虛擬地址的集合,用來映射物理內存。 ef97b85e-7632-11ee-939d-92fbcf53809c.png ?虛擬空間分為 用戶態內核態32位系統中 將虛擬空間按照 1:3 的比例分配給 內核態用戶態。64位系統中 分別給 內核態 和 用戶態 分配了 128T。用戶態結構efa47210-7632-11ee-939d-92fbcf53809c.png ?每個進程 都會 對應一個 用戶態虛擬空間, 里面存放了 Text(代碼)的內存虛擬地址范圍、 Data(數據)的內存虛擬地址范圍、BSS(全局變量)的內存虛擬地址范圍、堆的虛擬地址范圍、棧的虛擬地址范圍,以及mmap 內存映射區。其中 mmap 用于申請動態內存的時候的映射,堆和棧都是動態變化的。一個進程對應的用戶態中的 各個方面的虛擬地址信息都通過一個 struct 來存儲在內存中,當創建進程的時候會為其分配內存存儲對應的虛擬地址信息。內核態結構efb855aa-7632-11ee-939d-92fbcf53809c.pngLinux 的內核程序共用一個內核態虛擬空間。其中分為了以下幾部分:1、直接映射區896M,內核空間直接映射到對應的ZONE_DMA和ZONE_NORMAL中。為什么叫做直接映射呢?邏輯地址 直接 減去對應的差值就可以得到對應的物理地址。固定死了。2、動態映射為什么要引入動態映射呢?因為所有物理內存的分配都需要內核程序進行申請,用戶進程沒有這個權限。所以內核空間一定要能映射到所有的物理內存地址。那么如果都采用直接映射的話,1G大小邏輯地址的內核空間只能映射1G大小的物理內存。所以引入了動態映射,動態映射就是 內核空間的邏輯地址可以映射到 物理內存中的ZONE_HIGHMEM(高端內存)中的任何一個地址,并且在對應的物理內存使用完之后,可以再映射其他物理內存地址。

動態映射分為三種:1>、動態內存映射: 使用完對應的物理內存后,就可以映射其他物理內存了。2>、永久內存映射: 一個虛擬地址只能映射一個物理地址。如果需要映射其他物理地址,需要解綁。3>、固定內存映射: 只能被某些特定的函數來調用引用物理地址。動態內存映射和直接映射的區別動態映射和直接映射的區別就是邏輯地址到物理地址的轉化規則。直接映射直接映射的規則是死的,一個邏輯地址對應的物理地址是固定的。通過邏輯地址加或者減去一個數,就可以得到對應的物理地址。動態映射動態映射是動態的綁定,每個邏輯地址對應的物理地址是動態的,通過頁表進行查詢。用戶空間映射:用戶空間采用動態映射,每個虛擬地址可以被映射到一個物理地址,映射到ZONE_HIGHMEM。為什么用戶空間不采用直接映射呢?因為物理內存是多個進程所有的,每個進程都有一個用戶空間。如果采用直接映射的話,對應的物理地址是會沖突的。其用戶空間的邏輯地址大小都為 3G,所以存在邏輯地址相同,但是對應的物理地址不同。需要通過頁表來轉化,一個進程會對應一個頁表。

3、如何將虛擬地址映射到物理內存

虛擬地址通過 頁表虛擬地址 轉化為 物理地址,每個進程都對應著一個頁表,內核只有一個頁表。虛擬空間 和 物理內存 都按照 4k 來分頁,一個虛擬空間中的頁 和 物理內存中頁 是 一一對應的。

頁表映射

efbf667e-7632-11ee-939d-92fbcf53809c.png如上圖所示,將虛擬地址中的頁號 通過頁表轉化為 對應的物理頁號,然后通過頁內偏移量 就可以得到對應的 物理地址了。efd18d22-7632-11ee-939d-92fbcf53809c.png但是 1 個進程就需要一個頁表,一個 4G 的內存條,就需要 1M 個頁表記錄來描述,假如 1 個 頁表記錄需要 4個字節,那么就需要 4MB。而且頁表記錄是通過下標來對應的,通過虛擬頁號來乘以對應的頁表項大小來計算得到對應的地址的。所以 Linux 將 4M 分為 1K 個 4K, 一個 4K 對應著一個 page,用來存儲對應的真正的頁表記錄。將 1K 個 page 分開存放,就不要求連續的 4M 了。如果將 4M 分成 1K 個離散的 page 的話,怎么虛擬地址對應的頁表號呢?利用指針,存儲 1K 個地址,分別指向這 1K 個 page, 地址的大小為 4 個字節,也就是32位,完全可以表示整個內存的地址范圍。1K * 4個字節,正好是一個 page 4k,所以 也就是利用 1 個 page來存儲對應的頁表記錄索引所以 我們的虛擬地址尋找過程如下:1>、找到對應的頁表記錄索引位置,因為有 1K 個索引,所以用 10 位就可以表示了2>、通過索引可以找到對應的真正的頁表地址,對應的有 1K 個頁表記錄,所以用 10 位就可以表示了3>、1個頁有 4K,通過 12 位就可以表示其頁內偏移量了。所以虛擬地址被分為了三部分:1>、10位 表示索引偏移2>、10位 表示頁表記錄偏移3>、 12位 表示頁內偏移雖然這種方式增加了索引項,進一步增加了內存,但是減少了連續內存的使用,通過離散的內存就可以存儲頁表。這是對于32位系統,而 64 位系統采用了5級頁表。efd61e50-7632-11ee-939d-92fbcf53809c.png ?映射流程圖efda01aa-7632-11ee-939d-92fbcf53809c.png用戶態申請內存時,只會申請對應的虛擬地址,不會直接為其分配物理內存,而是等到真正訪問內存的時候,產生缺頁中斷,然后內核才會為其分配,然后為其建立映射,也就是建立對應的頁表項。

TLB

TLB 就是一個緩存,放在 CPU 中。用來將虛擬地址和對應的物理地址進行緩存。當查詢對應的物理地址的時候,首先查詢 TLB,如果TLB中存在對應的記錄,就直接返回。如果不存在,就再去查詢頁表。

虛擬內存

虛擬內存 指的是 將硬盤中劃出一段 swap 分區 當作 虛擬的內存,用來存放內存中暫時用不到的內存頁,等到需要的時候再從 swap 分區中 將對應的內存頁調入到 內存中。硬盤此時相當于一個虛擬的內存。從邏輯上能夠運行更大內存的程序,因為程序運行的時候并不需要把所有數據都加載到內存中,只需要將當前運行必要的相關程序和數據加載到內存中就可以了,當需要其他數據和程序的時候,再將其調入。相較于真正的內存加載,虛擬內存需要將數據在內存和磁盤中不斷切換,這是一個耗時的操作,所以速度比不上真正的內存加載。

總結

虛擬空間 和 物理內存 都分為 內核空間 和 用戶空間。虛擬地址需要通過頁表轉化為物理地址,然后才能訪問。用戶虛擬空間 只能映射 物理內存中的用戶內存,無法映射到物理內存中的內核內存,也就是說,用戶進程只能操作用戶內存。內核空間 只能被 內核 申請使用,用戶進程只能操作用戶空間的物理內存和虛擬空間。當用戶進程 調用系統調用的時候,會將其對應的代碼和數據運行在內核空間中。所以當調用 內核空間 讀取文件或者網絡數據的時候,首先會將數據拷貝到內存空間,然后在將數據從內核空間拷貝到用戶空間。因為 用戶進程不能訪問內核空間。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5082

    文章

    19117

    瀏覽量

    304978
  • Linux
    +關注

    關注

    87

    文章

    11302

    瀏覽量

    209420
  • 內存管理
    +關注

    關注

    0

    文章

    168

    瀏覽量

    14137

原文標題:嵌入式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版。《Linux
    發表于 09-14 08:57

    嵌入式Linux內存管理的知識

    這個內存管理的知識點還真的需要我們專門的去理解一下,今天大家一起來學習學習嵌入式Linux內存管理
    發表于 02-03 06:30

    嵌入式Linux內存管理知識點

    這個內存管理的知識點還真的需要我們專門的去理解一下,今天大家一起來學習學習嵌入式Linux內存管理
    發表于 03-04 06:22

    嵌入式Linux內存管理是什么

    點擊 嵌入式 Linux 內存管理
    發表于 11-05 07:01

    嵌入式系統內存管理方案研究

    摘要:嵌入式系統的內存管理機制必須滿足實時性和可靠性的要求。本文以開源的的操作系統RTEMS為例,介紹嵌入式系統
    發表于 05-24 23:57 ?1155次閱讀
    <b class='flag-5'>嵌入式</b>系統<b class='flag-5'>內存</b><b class='flag-5'>管理</b>方案研究

    ARM嵌入式Linux系統開發詳解

    ARM嵌入式Linux系統開發詳解,供大家參考。
    發表于 03-17 14:18 ?58次下載

    基于嵌入式Linux應用程序開發詳解

    基于嵌入式Linux應用程序開發詳解
    發表于 10-25 14:17 ?12次下載
    基于<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>應用程序開發<b class='flag-5'>詳解</b>

    詳解嵌入式linux 啟動信息

    詳解嵌入式linux 啟動信息
    發表于 10-30 10:28 ?11次下載
    <b class='flag-5'>詳解</b><b class='flag-5'>嵌入式</b><b class='flag-5'>linux</b> 啟動信息

    嵌入式系統內存管理機制詳解

    操作系統的內存管理功能用于向操作系統提供一致的地址映射功能和內存頁面的申請、釋放操作。在嵌入式實時系統
    發表于 11-18 09:41 ?4515次閱讀

    (網盤)ARM嵌入式Linux系統開發詳解

    (網盤)ARM嵌入式Linux系統開發詳解(python嵌入式開發 - csdn博客)-(網盤)ARM嵌入式
    發表于 08-04 12:35 ?74次下載
    (網盤)ARM<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>系統開發<b class='flag-5'>詳解</b>

    嵌入式 Linux 內存管理

    點擊 嵌入式 Linux 內存管理
    發表于 11-02 10:36 ?12次下載
    <b class='flag-5'>嵌入式</b> <b class='flag-5'>Linux</b> <b class='flag-5'>中</b>的<b class='flag-5'>內存</b><b class='flag-5'>管理</b>

    淺談嵌入式系統裸機編程的內存管理

     malloc和free在PC編程是很好用的一種內存分配手段。但是,其在嵌入式,就未必好用了。由于嵌入式裸機編程
    發表于 09-15 10:38 ?1524次閱讀
    主站蜘蛛池模板: 免费撕开胸罩吮胸视频| 国产精品7777人妻精品冫| 伊人网青青草| 亚洲精品一卡二卡三卡四卡2021| 色综合欧美色综合七久久| 日本美女搞基视频| 日日a.v拍夜夜添久久免费| 青柠电影在线看| 人C交ZZZ0OOZZZ000| 让男人玩尿道的女人| 人人超碰97caoporen国产| 欧美日韩在线成人看片a| 欧美另类极品videosbest| 欧美日韩亚洲中字二区| 青青热久久综合网伊人| 日韩伦理电影秋霞影院| 十二月综合缴缴情| 午夜国产高清精品一区免费| 无码欧美毛片一区二区三在线视频| 玩弄朋友娇妻呻吟交换电影| 性女传奇 快播| 亚洲三级黄色| 中文天堂www资源| 99久久国产综合色| 啊…嗯啊好深男男高h文总受| WW.国产人妻人伦精品| 岛国在线永久免费视频| 国产精品久久久精品日日| 国产一区内射最近更新| 久久久久久久网站| 欧美xxxav| 神马影院午夜伦理限级| 亚洲欧美中文字幕5发布| 最近的2019中文字幕HD| CHESENGAY痞帅警察GV| 国产成人小视频在线观看| 国内卡一卡二卡三免费网站| 伊人久久精品线影院| 7723手机游戏破解版下载| 超碰97视频在线观看| 国产美熟女乱又伦AV|