91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳解Linux的物理內(nèi)存

汽車玩家 ? 來源:Linux世界 ? 作者:Linux世界 ? 2020-01-18 17:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在內(nèi)核態(tài)申請(qǐng)內(nèi)存比在用戶態(tài)申請(qǐng)內(nèi)存要更為直接,它沒有采用用戶態(tài)那種延遲分配內(nèi)存技術(shù)。內(nèi)核認(rèn)為一旦有內(nèi)核函數(shù)申請(qǐng)內(nèi)存,那么就必須立刻滿足該申請(qǐng)內(nèi)存的請(qǐng)求,并且這個(gè)請(qǐng)求一定是正確合理的。相反,對(duì)于用戶態(tài)申請(qǐng)內(nèi)存的請(qǐng)求,內(nèi)核總是盡量延后分配物理內(nèi)存,用戶進(jìn)程總是先獲得一個(gè)虛擬內(nèi)存區(qū)的使用權(quán),最終通過缺頁(yè)異常獲得一塊真正的物理內(nèi)存。

1.物理內(nèi)存的內(nèi)核映射

IA32架構(gòu)中內(nèi)核虛擬地址空間只有1GB大?。◤?GB到4GB),因此可以直接將1GB大小的物理內(nèi)存(即常規(guī)內(nèi)存)映射到內(nèi)核地址空間,但超出1GB大小的物理內(nèi)存(即高端內(nèi)存)就不能映射到內(nèi)核空間。為此,內(nèi)核采取了下面的方法使得內(nèi)核可以使用所有的物理內(nèi)存。

1.高端內(nèi)存不能全部映射到內(nèi)核空間,也就是說這些物理內(nèi)存沒有對(duì)應(yīng)的線性地址。不過,內(nèi)核為每個(gè)物理頁(yè)框都分配了對(duì)應(yīng)的頁(yè)框描述符,所有的頁(yè)框描述符都保存在mem_map數(shù)組中,因此每個(gè)頁(yè)框描述符的線性地址都是固定存在的。內(nèi)核此時(shí)可以使用alloc_pages()和alloc_page()來分配高端內(nèi)存,因?yàn)檫@些函數(shù)返回頁(yè)框描述符的線性地址。

2.內(nèi)核地址空間的后128MB專門用于映射高端內(nèi)存,否則,沒有線性地址的高端內(nèi)存不能被內(nèi)核所訪問。這些高端內(nèi)存的內(nèi)核映射顯然是暫時(shí)映射的,否則也只能映射128MB的高端內(nèi)存。當(dāng)內(nèi)核需要訪問高端內(nèi)存時(shí)就臨時(shí)在這個(gè)區(qū)域進(jìn)行地址映射,使用完畢之后再用來進(jìn)行其他高端內(nèi)存的映射。

由于要進(jìn)行高端內(nèi)存的內(nèi)核映射,因此直接能夠映射的物理內(nèi)存大小只有896MB,該值保存在high_memory中。內(nèi)核地址空間的線性地址區(qū)間如下圖所示:

詳解Linux的物理內(nèi)存

從圖中可以看出,內(nèi)核采用了三種機(jī)制將高端內(nèi)存映射到內(nèi)核空間:永久內(nèi)核映射,固定映射和vmalloc機(jī)制。

2.物理內(nèi)存管理機(jī)制

基于物理內(nèi)存在內(nèi)核空間中的映射原理,物理內(nèi)存的管理方式也有所不同。內(nèi)核中物理內(nèi)存的管理機(jī)制主要有伙伴算法,slab高速緩存和vmalloc機(jī)制。其中伙伴算法和slab高速緩存都在物理內(nèi)存映射區(qū)分配物理內(nèi)存,而vmalloc機(jī)制則在高端內(nèi)存映射區(qū)分配物理內(nèi)存。

伙伴算法

伙伴算法負(fù)責(zé)大塊連續(xù)物理內(nèi)存的分配和釋放,以頁(yè)框?yàn)榛締挝?。該機(jī)制可以避免外部碎片。

per-CPU頁(yè)框高速緩存

內(nèi)核經(jīng)常請(qǐng)求和釋放單個(gè)頁(yè)框,該緩存包含預(yù)先分配的頁(yè)框,用于滿足本地CPU發(fā)出的單一頁(yè)框請(qǐng)求。

slab緩存

slab緩存負(fù)責(zé)小塊物理內(nèi)存的分配,并且它也作為高速緩存,主要針對(duì)內(nèi)核中經(jīng)常分配并釋放的對(duì)象。

vmalloc機(jī)制

vmalloc機(jī)制使得內(nèi)核通過連續(xù)的線性地址來訪問非連續(xù)的物理頁(yè)框,這樣可以最大限度的使用高端物理內(nèi)存。

3.物理內(nèi)存的分配

內(nèi)核發(fā)出內(nèi)存申請(qǐng)的請(qǐng)求時(shí),根據(jù)內(nèi)核函數(shù)調(diào)用接口將啟用不同的內(nèi)存分配器。

3.1 分區(qū)頁(yè)框分配器

分區(qū)頁(yè)框分配器 (zoned page frame allocator) ,處理對(duì)連續(xù)頁(yè)框的內(nèi)存分配請(qǐng)求。分區(qū)頁(yè)框管理器分為兩大部分:前端的管理區(qū)分配器和伙伴系統(tǒng),如下圖:

詳解Linux的物理內(nèi)存

管理區(qū)分配器負(fù)責(zé)搜索一個(gè)能滿足請(qǐng)求頁(yè)框塊大小的管理區(qū)。在每個(gè)管理區(qū)中,具體的頁(yè)框分配工作由伙伴系統(tǒng)負(fù)責(zé)。為了達(dá)到更好的系統(tǒng)性能,單個(gè)頁(yè)框的申請(qǐng)工作直接通過per-CPU頁(yè)框高速緩存完成。

該分配器通過幾個(gè)函數(shù)和宏來請(qǐng)求頁(yè)框,它們之間的封裝關(guān)系如下圖所示。

詳解Linux的物理內(nèi)存

這些函數(shù)和宏將核心的分配函數(shù)__alloc_pages_nodemask()封裝,形成滿足不同分配需求的分配函數(shù)。其中,alloc_pages()系列函數(shù)返回物理內(nèi)存首頁(yè)框描述符,__get_free_pages()系列函數(shù)返回內(nèi)存的線性地址。

3.2 slab分配器

slab 分配器最初是為了解決物理內(nèi)存的內(nèi)部碎片而提出的,它將內(nèi)核中常用的數(shù)據(jù)結(jié)構(gòu)看做對(duì)象。slab分配器為每一種對(duì)象建立高速緩存。內(nèi)核對(duì)該對(duì)象的分配和釋放均是在這塊高速緩存中操作。一種對(duì)象的slab分配器結(jié)構(gòu)圖如下:

詳解Linux的物理內(nèi)存

可以看到每種對(duì)象的高速緩存是由若干個(gè)slab組成,每個(gè)slab是由若干個(gè)頁(yè)框組成的。雖然slab分配器可以分配比單個(gè)頁(yè)框更小的內(nèi)存塊,但它所需的所有內(nèi)存都是通過伙伴算法分配的。

slab高速緩存分專用緩存和通用緩存。專用緩存是對(duì)特定的對(duì)象,比如為內(nèi)存描述符創(chuàng)建高速緩存。通用緩存則是針對(duì)一般情況,適合分配任意大小的物理內(nèi)存,其接口即為kmalloc()。

3.3 非連續(xù)內(nèi)存區(qū)內(nèi)存的分配

內(nèi)核通過vmalloc()來申請(qǐng)非連續(xù)的物理內(nèi)存,若申請(qǐng)成功,該函數(shù)返回連續(xù)內(nèi)存區(qū)的起始地址,否則,返回NULL。vmalloc()和kmalloc()申請(qǐng)的內(nèi)存有所不同,kmalloc()所申請(qǐng)內(nèi)存的線性地址與物理地址都是連續(xù)的,而vmalloc()所申請(qǐng)的內(nèi)存線性地址連續(xù)而物理地址則是離散的,兩個(gè)地址之間通過內(nèi)核頁(yè)表進(jìn)行映射。

vmalloc()的工作方式理解起來很簡(jiǎn)單:

1.尋找一個(gè)新的連續(xù)線性地址空間;

2.依次分配一組非連續(xù)的頁(yè)框;

3.為線性地址空間和非連續(xù)頁(yè)框建立映射關(guān)系,即修改內(nèi)核頁(yè)表;

vmalloc()的內(nèi)存分配原理與用戶態(tài)的內(nèi)存分配相似,都是通過連續(xù)的虛擬內(nèi)存來訪問離散的物理內(nèi)存,并且虛擬地址和物理地址之間是通過頁(yè)表進(jìn)行連接的,通過這種方式可以有效的使用物理內(nèi)存。但是應(yīng)該注意的是,vmalloc()申請(qǐng)物理內(nèi)存時(shí)是立即分配的,因?yàn)閮?nèi)核認(rèn)為這種內(nèi)存分配請(qǐng)求是正當(dāng)而且緊急的;相反,用戶態(tài)有內(nèi)存請(qǐng)求時(shí),內(nèi)核總是盡可能的延后,畢竟用戶態(tài)跟內(nèi)核態(tài)不在一個(gè)特權(quán)級(jí)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11756

    瀏覽量

    218995
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    9

    文章

    3209

    瀏覽量

    76350
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux內(nèi)核伙伴系統(tǒng)內(nèi)存申請(qǐng)函數(shù)詳解:從原理到實(shí)戰(zhàn)

    Linux 內(nèi)核中,內(nèi)存管理是整個(gè)系統(tǒng)穩(wěn)定運(yùn)行的基石,而伙伴系統(tǒng)(Buddy System) 作為內(nèi)核物理內(nèi)存分配的核心機(jī)制,更是驅(qū)動(dòng)開發(fā)、內(nèi)核模塊開發(fā)的必備知識(shí)點(diǎn)。它通過 "2
    的頭像 發(fā)表于 02-10 16:58 ?3626次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核伙伴系統(tǒng)<b class='flag-5'>內(nèi)存</b>申請(qǐng)函數(shù)<b class='flag-5'>詳解</b>:從原理到實(shí)戰(zhàn)

    Linux內(nèi)核大塊內(nèi)存申請(qǐng):從場(chǎng)景到落地全解析

    網(wǎng)卡、硬盤等外設(shè)的 DMA 控制器,要求內(nèi)存物理地址連續(xù)(無法識(shí)別虛擬地址映射),且需一次性分配大尺寸緩沖區(qū)(如 1GB 網(wǎng)絡(luò)幀緩存)。
    的頭像 發(fā)表于 02-09 16:41 ?657次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核大塊<b class='flag-5'>內(nèi)存</b>申請(qǐng):從場(chǎng)景到落地全解析

    Linux下擴(kuò)充Swap交換空間:解決內(nèi)存不足的實(shí)用指南,這些影響要注意!

    大家在使用 Linux 系統(tǒng)(比如常用的 Ubuntu)時(shí),是不是偶爾會(huì)遇到 “內(nèi)存不足” 的彈窗?比如運(yùn)行大型編譯任務(wù)、多開虛擬機(jī)、做數(shù)據(jù)分析,或者把 Linux 當(dāng)服務(wù)器用的時(shí)候,物理
    的頭像 發(fā)表于 02-09 16:33 ?180次閱讀
    <b class='flag-5'>Linux</b>下擴(kuò)充Swap交換空間:解決<b class='flag-5'>內(nèi)存</b>不足的實(shí)用指南,這些影響要注意!

    RK平臺(tái)Linux IOMMU開發(fā):從原理到實(shí)戰(zhàn)

    在瑞芯微(RK)芯片的 Linux 開發(fā)中,IOMMU(輸入輸出內(nèi)存管理單元)是個(gè)關(guān)鍵部件 —— 它能實(shí)現(xiàn)設(shè)備虛擬地址(IOVA)與物理地址的轉(zhuǎn)換,還能控制讀寫權(quán)限、處理缺頁(yè) / 總線異常,廣泛用于
    的頭像 發(fā)表于 02-04 16:24 ?1413次閱讀
    RK平臺(tái)<b class='flag-5'>Linux</b> IOMMU開發(fā):從原理到實(shí)戰(zhàn)

    Linux如何防止內(nèi)存沖突?

    在聊這個(gè)話題之前,我們先回憶一下單片機(jī)系統(tǒng)中是如何分配內(nèi)存的?如果沒有bootloader,那硬件環(huán)境起來之后就直接進(jìn)入主程序運(yùn)行,如果有引導(dǎo)程序bootloader,那就需要設(shè)置好跳轉(zhuǎn)地址,否則設(shè)置不對(duì),系統(tǒng)就無法啟動(dòng)了。
    的頭像 發(fā)表于 01-30 16:51 ?1352次閱讀
    <b class='flag-5'>Linux</b>如何防止<b class='flag-5'>內(nèi)存</b>沖突?

    【「Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)」閱讀體驗(yàn)】+讀深入理解Linux內(nèi)核內(nèi)存分配

    每個(gè)內(nèi)存地址是虛擬的,不是直接指向RAM中的任何地址。當(dāng)用戶訪問內(nèi)存中的存儲(chǔ)單元時(shí),都會(huì)進(jìn)行地址轉(zhuǎn)換以匹配相應(yīng)的物理內(nèi)存。書籍的第10章討論了五個(gè)主題,對(duì)
    發(fā)表于 01-16 20:05

    rk基于linux/android內(nèi)存管理

    一、內(nèi)存分布 ? U-Boot 由前級(jí) Loader 加載到 CONFIG_SYS_TEXT_BASE 地址,初始化時(shí)會(huì)探明當(dāng)前系統(tǒng)的總內(nèi)存容 量, 32 位平臺(tái)上認(rèn)為最大 4GB 可用(但是不影響
    的頭像 發(fā)表于 12-15 10:42 ?202次閱讀
    rk基于<b class='flag-5'>linux</b>/android<b class='flag-5'>內(nèi)存</b>管理

    Linux Swap交換空間詳解:Android編譯內(nèi)存不足?這樣擴(kuò)充立竿見影

    ? ? 在 ?Linux? 系統(tǒng)使用過程中,你是否遇到過? “ 內(nèi)存不足 ”? 的報(bào)錯(cuò)?比如編譯? Android? 源碼時(shí),明明按教程操作,卻因物理內(nèi)存沒達(dá)到? 16G? 要求而編譯
    的頭像 發(fā)表于 12-06 08:10 ?4231次閱讀

    【迅為工業(yè)RK3568穩(wěn)定可靠】itop-3568開發(fā)板Linux驅(qū)動(dòng)開發(fā)實(shí)戰(zhàn):RK3568內(nèi)核模塊符號(hào)導(dǎo)出詳解

    【迅為工業(yè)RK3568穩(wěn)定可靠】itop-3568開發(fā)板Linux驅(qū)動(dòng)開發(fā)實(shí)戰(zhàn):RK3568內(nèi)核模塊符號(hào)導(dǎo)出詳解
    的頭像 發(fā)表于 11-21 13:25 ?1168次閱讀
    【迅為工業(yè)RK3568穩(wěn)定可靠】itop-3568開發(fā)板<b class='flag-5'>Linux</b>驅(qū)動(dòng)開發(fā)實(shí)戰(zhàn):RK3568內(nèi)核模塊符號(hào)導(dǎo)出<b class='flag-5'>詳解</b>

    科普:什么AI 內(nèi)存技術(shù)

    問題。 為什么 AI 內(nèi)存很重要? 在 AI 模型訓(xùn)練和推理過程中,大量的數(shù)據(jù)需要從內(nèi)存傳輸?shù)教幚砥鳎ㄈ?GPU 或 TPU)進(jìn)行計(jì)算。傳統(tǒng)的內(nèi)存技術(shù)由于其物理架構(gòu)限制,數(shù)據(jù)傳輸速度往
    的頭像 發(fā)表于 09-03 15:44 ?1383次閱讀

    Linux基礎(chǔ)命令which詳解

    Linux系統(tǒng)中,which命令用于查找并顯示指定命令的可執(zhí)行文件路徑。這對(duì)于系統(tǒng)管理員和開發(fā)人員來說是一個(gè)非常有用的工具,可以幫助定位命令所在的位置,確認(rèn)命令是否已正確安裝,并且能夠用于配置環(huán)境變量等任務(wù)。下面是華納云對(duì)which命令的詳細(xì)解釋。
    的頭像 發(fā)表于 07-29 17:58 ?847次閱讀

    Linux系統(tǒng)中網(wǎng)絡(luò)配置詳解

    網(wǎng)絡(luò)配置是Linux系統(tǒng)運(yùn)維中的核心技能之一。正確理解和配置子網(wǎng)掩碼、網(wǎng)關(guān)等網(wǎng)絡(luò)參數(shù),直接影響系統(tǒng)的網(wǎng)絡(luò)連通性和性能。本文將深入探討Linux系統(tǒng)中網(wǎng)絡(luò)配置的方方面面,為運(yùn)維工程師提供全面的技術(shù)指導(dǎo)。
    的頭像 發(fā)表于 07-17 11:01 ?1193次閱讀

    Linux系統(tǒng)環(huán)境監(jiān)測(cè)終極指南

    Linux系統(tǒng)環(huán)境主要監(jiān)測(cè)CPU、內(nèi)存、磁盤I/O和網(wǎng)絡(luò)流量。
    的頭像 發(fā)表于 06-25 14:41 ?799次閱讀
    <b class='flag-5'>Linux</b>系統(tǒng)環(huán)境監(jiān)測(cè)終極指南

    詳解Linux權(quán)限相關(guān)指令

    Linux嚴(yán)格來說是一個(gè)操作系統(tǒng),我們稱之為“核心”(kernel)。而作為用戶的我們并不能直接與核心交流,這時(shí)候就有一個(gè)中間人的角色出現(xiàn):將我們的指令翻譯為核心可以看懂的符號(hào),交由核心執(zhí)行,并將執(zhí)行結(jié)果翻譯并返回給我們。
    的頭像 發(fā)表于 06-06 11:47 ?968次閱讀
    <b class='flag-5'>詳解</b><b class='flag-5'>Linux</b>權(quán)限相關(guān)指令

    Linux系統(tǒng)用戶權(quán)限詳解

    Linux 是一種開源的、基于 Unix 的操作系統(tǒng),它因其靈活性、穩(wěn)定性和高性能而廣泛應(yīng)用于服務(wù)器、嵌入式系統(tǒng)、超級(jí)計(jì)算機(jī)、桌面計(jì)算等領(lǐng)域。
    的頭像 發(fā)表于 04-25 10:56 ?900次閱讀
    <b class='flag-5'>Linux</b>系統(tǒng)用戶權(quán)限<b class='flag-5'>詳解</b>