0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

从内存布局图角度看内存管理

麦辣鸡腿堡 来源:TrustZone 作者:TrustZone 2023-10-30 17:50 次阅读

我们知道Linux是分为两种状态 用户态和内核态,Linux内核需要跑在硬件平台上,硬件平台也有自己的状态。这里还是ARM,ARM有其中处理器的模式。

用户模式(user):用户程序运行的模式。系统模式(system):特权模式。一般中断模式(IRQ):普通中断模式。快速中断模式(FIQ):快速中断模式。管理模式(supervisor):操作系统的内核通常运行在该模式下。数据访问终止模式(abort):当数据或者指令预取终止时进入该模式,用于虚拟存储及存储保护。未定义指令模式(undefined):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真

Linux内核的用户态和内核态两种模式分别对应的用户模式和管理模式。

这里还是以32位,对应4GB,内核一般内核:用户按照1:3的比例分配。这也是可以修改的。

我们知道分页机制,赋予了每个进程都有寻址4GB的空间,因为每个进程都有自己的进程表。

内核空间是从3GB开始,lowmem这段空间其实就是我们常说的线性映射区。(为啥虚拟地址明明在高位却是low,继续看)所谓的线性映射区,就是物理内存线性地映射到这段内核空间的区域中。在 ARM32 平台上,物理地址[0:760MB]的这一部分内存被线性映射到[3GB :3GB+760MB]的虚拟地址上(因为其物理地址在低位)。

线性映射区的虚拟地址和物理地址相差PAGE_OFFSET,即3GB。内核中有相关的宏来实现线性映射区的虚拟地址到物理地址的查找,例如pa(x)和va(x)。

其中,__pa()把线性映射区的虚拟地址转换为物理地址,转换公式很简单,即用虚拟地址减去PAGE_OFFSET(3GB),然后加上PHYS_OFFSET(这个值在有的ARM平台上为0,在ARM Vexpress平台上为0x6000_0000)。

物理内存被分成了两部分,低端的部分用在线性映射区,线性映射区就是这里的“lowmem”区域。剩下的高端部分的物理内存被称为高端内存(High Memory),内核要使用它,必须通过高端映射的方式来访问。

内核通常把低于760MB的物理内存称为线性映射内存(Normal Memory),而高于760MB以上的称为高端内存。 (这个高端是针对内核内存来说,780到1G)

这个分给内核的1G分成了高端和线性。

高端780到1G是干啥呢?剩下的264MB虚拟地址空间是保留给vmalloc机制、fixmap和高端异常向量表等使用的。内核很多驱动使用vmalloc机制来分配连续虚拟地址的内存,因为有的驱动不需要连续物理地址的内存;除此以外,vmalloc机制还可以用于高端内存的临时映射。一个32位的系统中,实际支持的内存数量会超过内核线性映射的长度,但是内核要具有对所有内存的寻找能力。

(这里我想的是虽然在内核,但是我内核还是要对整个内存有个控制能力,这里就是体现,在vmalloc机制就可以干这个:个人看法,有纠正的大佬在评论区告诉小的一下)

编译器在编译目标文件并且链接完成之后,就可以知道内核映像文件最终的大小,接下来将其打包成二进制文件,该操作由arch/arm/kernel/vmlinux.ld.S 控制,其中也划定了内核的内存布局。

内核image本身占据的内存空间从_text段到_end段,并分为如下几个段。text段:_text和_etext为代码段的起始和结束地址,包含了编译后的内核代码。init段:init_begin和init_end为init段的起始和结束地址,包含了大部分内核模块初始化的数据。data段:_sdata和_edata为数据段的起始和结束地址,保存大部分内核的已初始化的变量。BSS段:bss_start和bss_stop为BSS段的开始和结束地址,包含初始化为0的所有静态全局变量。

上述几个段的大小在编译链接时根据内核配置来确定,因为每种配置的代码段和数据段长度都不相同,这取决于要编译哪些内核模块,但是起始地址_text 总是相同的。内核编译完成之后,会生成一个System.map文件,查询这个文件可以找到这些符号的具体数值。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19138

    浏览量

    228983
  • Linux
    +关注

    关注

    87

    文章

    11217

    浏览量

    208822
  • 内存
    +关注

    关注

    8

    文章

    2995

    浏览量

    73849
  • 进程
    +关注

    关注

    0

    文章

    201

    浏览量

    13942
收藏 人收藏

    评论

    相关推荐

    Linux kernel内存管理模块结构分析

    基于上面章节的需求,Linux kernel虚拟内存(VM)、DMA mapping以及DMA buffer sharing三个角度,对内存进行
    发表于 09-19 11:55 1741次阅读
    Linux kernel<b class='flag-5'>内存</b><b class='flag-5'>管理</b>模块结构分析

    Linux的内存管理是什么,Linux的内存管理详解

    Linux的内存管理 Linux的内存管理是一个非常复杂的过程,主要分成两个大的部分:内核的内存管理
    的头像 发表于 05-11 17:54 5966次阅读
    Linux的<b class='flag-5'>内存</b><b class='flag-5'>管理</b>是什么,Linux的<b class='flag-5'>内存</b><b class='flag-5'>管理</b>详解

    走进Linux内存系统探寻内存管理的机制和奥秘

    Linux 内存是后台开发人员,需要深入了解的计算机资源。合理的使用内存,有助于提升机器的性能和稳定性。本文主要介绍Linux 内存组织结构和页面布局
    的头像 发表于 01-05 09:47 1595次阅读

    Linux内存相关知识科普

    ,Linux 内核几种内存管理的方法,内存使用场景以及内存使用的那些坑。**内存的原理和结构,
    发表于 07-25 14:43 710次阅读
    Linux<b class='flag-5'>内存</b>相关知识科普

    ARM32 Linux的内存布局

    一部分空间是内核无法访问到的,对于该问题内核借助于高端内存(highmem)方法来管理多余的内存,本章的主要讲解以下内容什么是高端内存及其作用ARM32 Linux的
    发表于 04-24 14:20

    Elastos内存管理对软件调试的支持

    软件调试支持是操作系统的重要组成部分,而由于内存管理不善造成的软件BUG占软件故障的很大比例。内存管理
    发表于 12-01 15:38 19次下载
    Elastos<b class='flag-5'>内存</b><b class='flag-5'>管理</b>对软件调试的支持

    了解并学习Linux内存模型

    model,其实就是cpu的角度,其物理内存的分布情况,在linux kernel中,使用什么的方式来管理这些物理
    发表于 05-12 09:44 675次阅读
    了解并学习Linux<b class='flag-5'>内存</b>模型

    进程虚拟内存布局以及进程的虚拟内存分配释放流程,涉及的代码

    我们计划通过一系列文章来介绍虚拟内存分配/释放,缺页处理,内存压缩/回收,内存分配器等知识,梳理虚拟内存管理。本章节结合代码介绍进程虚拟
    的头像 发表于 06-28 09:38 4030次阅读

    STM32内存管理

    内存管理详解1、介绍内存管理,是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和
    发表于 12-24 19:37 13次下载
    STM32<b class='flag-5'>内存</b><b class='flag-5'>管理</b>

    JVM内存布局的多方面了解

      JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的稳定高效运行。不同的JVM对于内存的划分方式和
    发表于 07-08 15:09 400次阅读

    探讨JVM的内存布局

    JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的稳定高效运行。
    的头像 发表于 09-09 15:57 792次阅读

    JVM内存布局详解

    JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的稳定高效运行。不同的JVM对于内存的划分方式和
    的头像 发表于 04-26 10:10 501次阅读
    JVM<b class='flag-5'>内存</b><b class='flag-5'>布局</b>详解

    详解Java虚拟机的JVM内存布局

    JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的稳定高效运行。不同的JVM对于内存的划分方式和
    的头像 发表于 07-13 09:52 501次阅读
    详解Java虚拟机的JVM<b class='flag-5'>内存</b><b class='flag-5'>布局</b>

    软件角度看看内存

    关于内存软件的角度去查看,其实作为一个软件程序员,大多数对这个维度的接触还是蛮多的。linux中有个free命令,其就是查看系统内存的情况。 free命令的选项也比较简单,常用的参
    的头像 发表于 10-30 17:41 672次阅读
    <b class='flag-5'>从</b>软件<b class='flag-5'>角度</b>看看<b class='flag-5'>内存</b>

    Linux 内存管理总结

    一、Linux内存管理概述 Linux内存管理是指对系统内存的分配、释放、映射、管理、交换、压缩
    的头像 发表于 11-10 14:58 493次阅读
    Linux <b class='flag-5'>内存</b><b class='flag-5'>管理</b>总结