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

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

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

從內(nèi)存布局圖角度看內(nèi)存管理

麥辣雞腿堡 ? 來源:TrustZone ? 作者:TrustZone ? 2023-10-30 17:50 ? 次閱讀

我們知道Linux是分為兩種狀態(tài) 用戶態(tài)和內(nèi)核態(tài),Linux內(nèi)核需要跑在硬件平臺上,硬件平臺也有自己的狀態(tài)。這里還是ARM,ARM有其中處理器的模式。

用戶模式(user):用戶程序運(yùn)行的模式。系統(tǒng)模式(system):特權(quán)模式。一般中斷模式(IRQ):普通中斷模式??焖僦袛嗄J剑‵IQ):快速中斷模式。管理模式(supervisor):操作系統(tǒng)的內(nèi)核通常運(yùn)行在該模式下。數(shù)據(jù)訪問終止模式(abort):當(dāng)數(shù)據(jù)或者指令預(yù)取終止時進(jìn)入該模式,用于虛擬存儲及存儲保護(hù)。未定義指令模式(undefined):當(dāng)未定義的指令執(zhí)行時進(jìn)入該模式,可用于支持硬件協(xié)處理器的軟件仿真。

Linux內(nèi)核的用戶態(tài)和內(nèi)核態(tài)兩種模式分別對應(yīng)的用戶模式和管理模式。

這里還是以32位,對應(yīng)4GB,內(nèi)核一般內(nèi)核:用戶按照1:3的比例分配。這也是可以修改的。

我們知道分頁機(jī)制,賦予了每個進(jìn)程都有尋址4GB的空間,因為每個進(jìn)程都有自己的進(jìn)程表。

內(nèi)核空間是從3GB開始,lowmem這段空間其實(shí)就是我們常說的線性映射區(qū)。(為啥虛擬地址明明在高位卻是low,繼續(xù)看)所謂的線性映射區(qū),就是物理內(nèi)存線性地映射到這段內(nèi)核空間的區(qū)域中。在 ARM32 平臺上,物理地址[0:760MB]的這一部分內(nèi)存被線性映射到[3GB :3GB+760MB]的虛擬地址上(因為其物理地址在低位)。

線性映射區(qū)的虛擬地址和物理地址相差PAGE_OFFSET,即3GB。內(nèi)核中有相關(guān)的宏來實(shí)現(xiàn)線性映射區(qū)的虛擬地址到物理地址的查找,例如pa(x)和va(x)。

其中,__pa()把線性映射區(qū)的虛擬地址轉(zhuǎn)換為物理地址,轉(zhuǎn)換公式很簡單,即用虛擬地址減去PAGE_OFFSET(3GB),然后加上PHYS_OFFSET(這個值在有的ARM平臺上為0,在ARM Vexpress平臺上為0x6000_0000)。

物理內(nèi)存被分成了兩部分,低端的部分用在線性映射區(qū),線性映射區(qū)就是這里的“l(fā)owmem”區(qū)域。剩下的高端部分的物理內(nèi)存被稱為高端內(nèi)存(High Memory),內(nèi)核要使用它,必須通過高端映射的方式來訪問。

內(nèi)核通常把低于760MB的物理內(nèi)存稱為線性映射內(nèi)存(Normal Memory),而高于760MB以上的稱為高端內(nèi)存。 (這個高端是針對內(nèi)核內(nèi)存來說,780到1G)

這個分給內(nèi)核的1G分成了高端和線性。

高端780到1G是干啥呢?剩下的264MB虛擬地址空間是保留給vmalloc機(jī)制、fixmap和高端異常向量表等使用的。內(nèi)核很多驅(qū)動使用vmalloc機(jī)制來分配連續(xù)虛擬地址的內(nèi)存,因為有的驅(qū)動不需要連續(xù)物理地址的內(nèi)存;除此以外,vmalloc機(jī)制還可以用于高端內(nèi)存的臨時映射。一個32位的系統(tǒng)中,實(shí)際支持的內(nèi)存數(shù)量會超過內(nèi)核線性映射的長度,但是內(nèi)核要具有對所有內(nèi)存的尋找能力。

(這里我想的是雖然在內(nèi)核,但是我內(nèi)核還是要對整個內(nèi)存有個控制能力,這里就是體現(xiàn),在vmalloc機(jī)制就可以干這個:個人看法,有糾正的大佬在評論區(qū)告訴小的一下)

編譯器在編譯目標(biāo)文件并且鏈接完成之后,就可以知道內(nèi)核映像文件最終的大小,接下來將其打包成二進(jìn)制文件,該操作由arch/arm/kernel/vmlinux.ld.S 控制,其中也劃定了內(nèi)核的內(nèi)存布局。

內(nèi)核image本身占據(jù)的內(nèi)存空間從_text段到_end段,并分為如下幾個段。text段:_text和_etext為代碼段的起始和結(jié)束地址,包含了編譯后的內(nèi)核代碼。init段:init_begin和init_end為init段的起始和結(jié)束地址,包含了大部分內(nèi)核模塊初始化的數(shù)據(jù)。data段:_sdata和_edata為數(shù)據(jù)段的起始和結(jié)束地址,保存大部分內(nèi)核的已初始化的變量。BSS段:bss_start和bss_stop為BSS段的開始和結(jié)束地址,包含初始化為0的所有靜態(tài)全局變量。

上述幾個段的大小在編譯鏈接時根據(jù)內(nèi)核配置來確定,因為每種配置的代碼段和數(shù)據(jù)段長度都不相同,這取決于要編譯哪些內(nèi)核模塊,但是起始地址_text 總是相同的。內(nèi)核編譯完成之后,會生成一個System.map文件,查詢這個文件可以找到這些符號的具體數(shù)值。

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

    關(guān)注

    68

    文章

    18927

    瀏覽量

    227225
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

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

    關(guān)注

    8

    文章

    2903

    瀏覽量

    73536
  • 進(jìn)程
    +關(guān)注

    關(guān)注

    0

    文章

    197

    瀏覽量

    13928
收藏 人收藏

    評論

    相關(guān)推薦

    Linux kernel內(nèi)存管理模塊結(jié)構(gòu)分析

    基于上面章節(jié)的需求,Linux kernel虛擬內(nèi)存(VM)、DMA mapping以及DMA buffer sharing三個角度,對內(nèi)存進(jìn)行
    發(fā)表于 09-19 11:55 ?1669次閱讀
    Linux kernel<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>模塊結(jié)構(gòu)分析

    Linux的內(nèi)存管理是什么,Linux的內(nèi)存管理詳解

    Linux的內(nèi)存管理 Linux的內(nèi)存管理是一個非常復(fù)雜的過程,主要分成兩個大的部分:內(nèi)核的內(nèi)存管理
    的頭像 發(fā)表于 05-11 17:54 ?5827次閱讀
    Linux的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>是什么,Linux的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>詳解

    走進(jìn)Linux內(nèi)存系統(tǒng)探尋內(nèi)存管理的機(jī)制和奧秘

    Linux 內(nèi)存是后臺開發(fā)人員,需要深入了解的計算機(jī)資源。合理的使用內(nèi)存,有助于提升機(jī)器的性能和穩(wěn)定性。本文主要介紹Linux 內(nèi)存組織結(jié)構(gòu)和頁面布局,
    的頭像 發(fā)表于 01-05 09:47 ?1518次閱讀

    Linux內(nèi)存相關(guān)知識科普

    ,Linux 內(nèi)核幾種內(nèi)存管理的方法,內(nèi)存使用場景以及內(nèi)存使用的那些坑。**內(nèi)存的原理和結(jié)構(gòu),
    發(fā)表于 07-25 14:43 ?677次閱讀
    Linux<b class='flag-5'>內(nèi)存</b>相關(guān)知識科普

    ARM32 Linux的內(nèi)存布局

    一部分空間是內(nèi)核無法訪問到的,對于該問題內(nèi)核借助于高端內(nèi)存(highmem)方法來管理多余的內(nèi)存,本章的主要講解以下內(nèi)容什么是高端內(nèi)存及其作用ARM32 Linux的
    發(fā)表于 04-24 14:20

    Elastos內(nèi)存管理對軟件調(diào)試的支持

    軟件調(diào)試支持是操作系統(tǒng)的重要組成部分,而由于內(nèi)存管理不善造成的軟件BUG占軟件故障的很大比例。內(nèi)存管理
    發(fā)表于 12-01 15:38 ?19次下載
    Elastos<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>對軟件調(diào)試的支持

    了解并學(xué)習(xí)Linux內(nèi)存模型

    model,其實(shí)就是cpu的角度,其物理內(nèi)存的分布情況,在linux kernel中,使用什么的方式來管理這些物理
    發(fā)表于 05-12 09:44 ?650次閱讀
    了解并學(xué)習(xí)Linux<b class='flag-5'>內(nèi)存</b>模型

    進(jìn)程虛擬內(nèi)存布局以及進(jìn)程的虛擬內(nèi)存分配釋放流程,涉及的代碼

    我們計劃通過一系列文章來介紹虛擬內(nèi)存分配/釋放,缺頁處理,內(nèi)存壓縮/回收,內(nèi)存分配器等知識,梳理虛擬內(nèi)存管理。本章節(jié)結(jié)合代碼介紹進(jìn)程虛擬
    的頭像 發(fā)表于 06-28 09:38 ?3877次閱讀

    STM32內(nèi)存管理

    內(nèi)存管理詳解1、介紹內(nèi)存管理,是指軟件運(yùn)行時對計算機(jī)內(nèi)存資源的分配和使用的技術(shù)。其最主要的目的是如何高效,快速的分配,并且在適當(dāng)?shù)臅r候釋放和
    發(fā)表于 12-24 19:37 ?13次下載
    STM32<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>

    JVM內(nèi)存布局的多方面了解

      JVM內(nèi)存布局規(guī)定了Java在運(yùn)行過程中內(nèi)存申請、分配、管理的策略,保證了JVM的穩(wěn)定高效運(yùn)行。不同的JVM對于內(nèi)存的劃分方式和
    發(fā)表于 07-08 15:09 ?374次閱讀

    探討JVM的內(nèi)存布局

    JVM內(nèi)存布局規(guī)定了Java在運(yùn)行過程中內(nèi)存申請、分配、管理的策略,保證了JVM的穩(wěn)定高效運(yùn)行。
    的頭像 發(fā)表于 09-09 15:57 ?716次閱讀

    JVM內(nèi)存布局詳解

    JVM內(nèi)存布局規(guī)定了Java在運(yùn)行過程中內(nèi)存申請、分配、管理的策略,保證了JVM的穩(wěn)定高效運(yùn)行。不同的JVM對于內(nèi)存的劃分方式和
    的頭像 發(fā)表于 04-26 10:10 ?441次閱讀
    JVM<b class='flag-5'>內(nèi)存</b><b class='flag-5'>布局</b>詳解

    詳解Java虛擬機(jī)的JVM內(nèi)存布局

    JVM內(nèi)存布局規(guī)定了Java在運(yùn)行過程中內(nèi)存申請、分配、管理的策略,保證了JVM的穩(wěn)定高效運(yùn)行。不同的JVM對于內(nèi)存的劃分方式和
    的頭像 發(fā)表于 07-13 09:52 ?441次閱讀
    詳解Java虛擬機(jī)的JVM<b class='flag-5'>內(nèi)存</b><b class='flag-5'>布局</b>

    軟件角度看看內(nèi)存

    關(guān)于內(nèi)存軟件的角度去查看,其實(shí)作為一個軟件程序員,大多數(shù)對這個維度的接觸還是蠻多的。linux中有個free命令,其就是查看系統(tǒng)內(nèi)存的情況。 free命令的選項也比較簡單,常用的參
    的頭像 發(fā)表于 10-30 17:41 ?607次閱讀
    <b class='flag-5'>從</b>軟件<b class='flag-5'>角度</b>看看<b class='flag-5'>內(nèi)存</b>

    Linux 內(nèi)存管理總結(jié)

    一、Linux內(nèi)存管理概述 Linux內(nèi)存管理是指對系統(tǒng)內(nèi)存的分配、釋放、映射、管理、交換、壓縮
    的頭像 發(fā)表于 11-10 14:58 ?431次閱讀
    Linux <b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>總結(jié)