arm linux 存储,linux arm的存储分布那些事

原标题:linux arm的存储分布那些事

linux arm 内存分布总览

ed7ad14e8933ded7ed0c119345b4fcb9.png

上图是linux的arm的虚拟地址分布总览,我们按从低地址到高地址的顺序逐个描述,每项的描述包括如下的内容的组和:

地址范围大小,虚拟转物理的接口函数,各个区域对应的分配函数,该区域有什么作用,使用场合等等。

首先开始第一个区域:CPUvector page null pointer trap

该区域的大小是一个page页的大小,对于那些不支持中断向量重映射的cpu,该区域用来存储对应的中断向量表;

对于那些支持中断向量重映射的cpu,该区域用来扑获0地址的非法访问,即null指针。针对arm体系,他是支持中断向量重映射,该区域一般保留不用,用来扑获null指针。

第二个区域:应用程序地址空间

地址大小范围属于[0x1000, 0xbf000000],我知道每个应用进程都有如下几个段:text段即存储代码段,data段即存储初始化的数据段,bss段即存储未初始化的数据段,堆(malloc,free),栈(往下生长)。他们的地址分布如下:

图1

07e834538c831364668ff8cfff81ebcd.png

在应用程序加载到内存后,会为每个段,分一个vma的内核结构体,并且为每个段都分配了虚拟地址(虚拟地址和大小都存储在vma结构体中),当可执行程序的各个段在加载的时候,就会给其分配虚拟地址,每个段对应内核的一个vma结构,程序所有段对应的vma,都挂在程序对应的进程的struct mm结构中,但并未给他分配实际的物理地址,待cpu实际去访问它时,才会去实际建立物理到vma指定的虚拟地址映射,并且将对应的段内容从elf文件中拷贝到相应的物理内存中。

譬如当cpu要访问text段时,这个时候并未建立相应的映射表,所以会产生page fault异常,从而在异常处理中,linux的内存管理系统会为其分配物理内存, 并从二进制可执行程序的elf文件读取text段到物理内存,并且为该进程对应的页表建立该物理页到虚拟地址的映射,这样cpu就可以访问该进程的text段,并且执行对应的指令了。

stack跟heap都一样,在cpu有实际的访问时,才会分配物理内存,并建立物理到对应的虚拟地址(在程序加载时,vma中就已经分配了虚拟地址)映射。这样做,就可以节省程序运行时实际物理内存的使用。而不是程序一开始就建立了所有物理到虚拟的映射,从而导致物理内存被大量不必要的消耗。

第三个区域:模块地址

该区域用来为内核模块分配地址,譬如在insmod一个驱动模块时,会通过如下的流程:sysinit_module-->load_module-->layout_and_allocate-->move_module-->module_alloc_update_bounds-->module_alloc来为模块的各个段分配虚拟地址

图2

139ae031d62f286416afc3f0ca789d77.png

line42可见:就指定了模块的虚拟地址范围为:[MODULES_VADDR,MODULES_END] = [0xbf000000,0xbfe00000],总计14MB。注意此时__vmalloc_node_range进行了实际的物理内存分配,并且建立了物理到虚拟地址的映射。

第四个区域:PKMAP地址段

该区域跟fixmap区域都是用来将高端物理内存页映射到内核的线性地址范围,以使内核能够访问他。但为什么还要分两个区域呢?他们有什么异同?

kmap和fixmap驱动的地址范围都是有限的,所以不能长久持有,最好使用完后,就尽快的释放。

其中kmap区域的API函数为:kmap/kunmap,该函数可以休眠,在地址资源紧张的时候就会发生休眠。

fixmap区域的api函数为:kmap_atomic/__kunmap_atomic,该函数为每个cpu都保留一个地址槽,并且该函数是原子的,不会休眠。使用kmap_atomic影射高端物理内存页,处理完后(并且该处理不应该休眠,同时kmap_atomic还会禁止抢占),就应该尽快调用__kunmap_atomic进行释放。所以该函数可以在中断上下文中使用

kmap地址段的开始虚拟地址和大小在trunk/arch/arm/mm/mmu.c中的kmap_init函数就指定了。

关于kmap的详细分析,见我的另一篇blog文章。

第五个区域:内核地址空间的直接映射区,即linux内核的低端内存区

该区域也称为内核逻辑地址空间 是指从PAGE_OFFSET(3G)到high_memory之间的线性地址空间,是系统物理内存映射区,它映射了全部或部分(如果系统包含高端内存)物理内存。内核逻辑地址空间与系统RAM内存物理地址空间是一一对应的,内核逻辑地址空间中的地址与RAM内存物理地址空间中对应的地址只差一个固定偏移量(3G),如果RAM内存物理地址空间从0x00000000地址编址,那么这个偏移量就是PAGE_OFFSET(0xc0000000)。

系统初始化过程中将低端内存永久映射到了内核逻辑地址空间,为低端内存建立了虚拟映射页表。低端内存内物理内存的物理地址与线性地址之间的转换可以通过__pa(x)和__va(x)两个宏来进行:

#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) __pa(x)将内核逻辑地址空间的地址x转换成对应的物理地址,相当于__virt_to_phys((unsigned long)(x)),

__va(x)则相反,把低端物理内存空间的地址转换成对应的内核逻辑地址,相当于((void *)__phys_to_virt((unsigned long)(x)))

该区域的内存分配函数:kmalloc/kfree和__get_free_page都是从低端内存来分配内存

第六个区域:高端内存vmalloc区

该区域是属于linux内核的高端内存地址,该区域分配的虚拟地址是连续的,但对应的物理地址则可能是不连续的。该区域的内存分配api函数为:vmalloc/vfree, 该区域的api可以用来分配大片内存,但对应的物理内存可能是不连续的。该函数会修改页目录映射表,因为要为对应的虚拟地址和物理地址建立映射关系。

另外vmalloc区域跟高端内核(high_memory)有一个8MB的保留区域。端内存的物理地址与线性地址之间的转换不能使用上面的__pa(x)和__va(x)宏,关于该区域linux内核的文档:arm/memmory.txt有如下的描述:

vmalloc() / ioremap() space.

Memory returned by vmalloc/ioremap will

be dynamically placed in this region.

Machine specific static mappings are also

located here through iotable_init().

VMALLOC_START is based upon the value

of the high_memory variable, and VMALLOC_END

is equal to 0xff000000.

第七个区域:DMA内存映射区

该区域是为DMA分配内存的,该段区域的开始地址和大小在

trunk/arch/arm/mm/dma-mapping.c中已经指定了。

分别由consistent_base,DEFAULT_CONSISTENT_DMA_SIZE,

CONSISTENT_END指定该区域的开始地址,大小,结束地址。

该区域的内存分配api函数为:dma_alloc_coherent/dma_free_coherent,

该分配函数会建立映射表,并且分配出来的物理地址是连续的。

dma_alloc_coherent的核心函数为:__dma_alloc。具体详细的流程,

请见我的另外一篇blog。在调用这个api进行dma内存分配时,

虚拟地址是从CONSISTENT_END高地址往consistent_base低地址方向分配的,

即第一次dma_alloc_coherent调用的返回值>第二次dma_alloc_coherent

调用的返回值。请看图3一个实际的系统dma分配的内存情况

9e5d4caacf0c5743c2e26406b572b732.png

另外dma分配函数分配的物理页是属于低端内存,但他会通过__dma_alloc_remap函数,将该物理页重新映射到dma所属的地址范围。所以同一个物理页存在两个虚拟地址映射,因为该物理页对应的低端内存地址在内核初始化的时候,就已经映射建立好了。

第八个区域:Fixmap映射区

该区域的开始地址和大小在trunk/arch/arm/include/asm/fixmap.h文件中指定了,

该区域的地址范围:[0xfff00000,0xfffe0000],该区域是属于最顶部的pte页表中

(set_top_pte),他为系统中的每个cpu都保留了16个page页的虚拟地址。

该区域有两个特殊函数:

fix_to_virt/virt_to_fix

#define __virt_to_fix(x)(((x) - FIXADDR_START) >> PAGE_SHIFT)

表示虚拟地址相对FIXADDR_START偏移的页框数,该返回值应该属于

[0,15]之间。

第九个区域:CPUvector page

该区域是用来映射cpu的中断向量表,因为linux arm使用的高端向量,即cpu中断产生时,pc指针会自动跳转到0xffff0000+4*vector_num的地方。

图4

13679b9f59be34f18901dc7b8ea0997c.png

line1107分配一个低端的物理内存页框,line1109 early_trap_init将中断向量表的内容拷贝到这个新分配的物理页框中。

图5

90cfbc0863bedb390e802de79f6e22e4.png

line1149-1153:将line1107行分配的物理页映射到虚拟地址0xffff0000,为cpu中断产生时,做好准备(对应的地址有各自的跳转代码,来处理各自的中断异常)。在这里这个物理页同样是存在两个虚拟地址的映射,一个是低端虚拟地址的影射,一个是高端虚拟地址的映射

最后附一个我们实际使用中的contexA9双核,ram为1GB大小的系统的linux内存分布情况图:

图6

8112eb934feb408d33594e9bb9b024e5.png

可以结合图1和图6一起分析来加深对linux的内存分布情况的理解,至于图1是怎么来的,就需要看上面每个段的具体分析。

166327167_777180

166327167_777180

责任编辑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux恢复终端默认配置,以gnome-terminal为例,修改gnome3 的默认配置,

以gnome-terminal为例,修改gnome3 的默认配置,gnome连续几个版本的terminal默认配置文件都是同一个配置文件“b1dcc9dd-5262-4d8d-a863-c897e6d979b9”。这是因为gnome的developers编辑了这个配置文件并作为gnome-terminal的默认配置文件,用来…

com.sec.android.app.smartclipservice,EPR Aerospace News

The World Cup Ball And Its Astonishing Effects Can Be Easily Explained Through TheTheory Of Dynamic Interactions, Which Also Applies To The Flight Of The Boomerang.The official World Cup ball, the so called “Jabulani”, which has been object of a lot of c…

html表格内文字置顶,css如何让table里的字居中?

css如何让table里的字居中?下面本篇文章就来给大家介绍一下使用CSS让table里字居中的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。在CSS中,可以通过设置text-align: center;和vertical-align:middle;来…

html5离开网页自动暂停,通过html5代码在网页中实现播放和暂停音乐mp3,mav等文

介绍通过html5代码在网页中实现播放和暂停音乐mp3,mav等文件的具体操作方法。这样对于用户来说,在线可播放功能能大大提高站内效率也可带来一定的流量。希望对有需要的朋友有所帮助。这里我们需要先了解下,在html5中的两个个重要标签。阿里西西web开发网…

android digest 认证,探究 Android 签名机制和原理

背景最近在调研一个测试工具的使用,在使用中发现被测试工具处理过的apk文件经安装后打开就会崩溃,分析崩溃日志后原因是签名不一致导致的。说到Android中的签名,可能大家都知道签名的目的就是为了保护apk文件的安全,如果apk被恶意…

pm2 start 带参数_3款有海景天窗的国产SUV,最适合带女朋友看星星,首付3万拿下...

夏天就这么缓缓地来了,在某一个周末的晚上,约上心爱的女朋友,开上车子,一路上驰骋在无人的大桥上,放上音乐,开到目的地,打开天窗,看看星星,从诗词歌赋谈到人生哲学&#…

html仿京东快速购物导航,jQuery仿京东楼层滑动侧边栏高亮(原创)

插件描述:jQuery模仿京东侧边栏点击滑动到该楼层,同时侧边栏随着页面滚动对应导航高亮。更新时间:2017/9/30 下午2:48:37更新说明:1,添加了查看评论按钮来改变对应区的高度2,将floorList和navList作为匿名函…

华为云大数据存储的冗余方式是三副本_华为TaurusDB技术解读(转载)

近日,华为云自研关系型数据库 Taurus 公开亮相。作为华为云自研的最新一代云原生分布式数据库,Taurus 完全兼容 MySQL 8.0,采用计算与存储分离、日志即数据的架构设计,支持 1 写 15 读,性能达到原生 MySQL 的 7 倍。性…

unity 是厘米还是米_乔丹19岁才1.75米,2年增高近20公分,这个长高方法你能坚持多久...

相信现在有很多的人希望自己在长大之后能去NBA打篮球,但是因为种种原因,最后还是放弃了这个想法, 很多人是因为自己的身体素质达不到要求,比如说天赋上没有达到一个篮球运动员的身高,还有的是因为自己家庭的原因最后放…

win7变成xp风格了怎么改回_微软看了会沉默,把 Windows 10 变成经典 98 风格

众所周知「Windows 10」官方提供的主题都只是换换壁纸,所以喜欢折腾的小伙伴会选择用「UltraUXThemePatcher」来让「Windows 10」支持第三方主题,实现模仿各种风格,如 macOS、Win7、Ubuntu 等。但是由于「Windows 10」版本太多,导…

2021广东高考成绩排名如何查询,2021年广东高考个人排名怎么查询,广东高考成绩排名查询方法...

高考成绩公布后,很多家长和学生咨询我们,广东高考个人成绩排名位次如何查询:广东高考成绩排名,可以通过省招生考试院发布的广东一分一段表来查询,也可以到聚志愿网站直接输入分数查询,一分一段它显示每一个…

区块如何防篡改_深入浅出:一条数据是如何完成上链的

一笔业务数据在区块链处理的流程大致分为三个阶段:分别是上链前处理阶段、链上处理阶段和智能合约处理阶段。一.上链前处理阶段业务数据上链前需要将业务数据处理,并且对信息进行签名。这些过程可以通过对应的工具,比如序列化工具和各种椭圆曲…

锁定计算机在哪里设置方法,怎样锁定电脑?如何设置电脑锁屏【步骤详解】

我们在日常使用电脑的时候,特别是自己的私人电脑时,难免会遇到上个厕所接个水之类的杂事需要离开位置的,也许可能就一两分钟不到的时间,这么点的时间如果关机的话又觉得实在是太麻烦了,但是又不想让其它的人知道我们的…

hough变换检测圆周_Python OpenCV 霍夫变换

霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体。Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达…

easyui中onchange事件_React中类似Vue的“模板语法”

一、数据绑定类似 Vue 的 v-model,this.state { val: 1, companies: ["阿里巴巴", "腾讯", "百度", "京东"], };companyNameUpdate(e) { this.setState({ companyName: e…

html5着陆页模板,多用途着陆页HTML模板

资源下载此资源下载价格为5D币,请先登录资源文件列表apnew/css/animate.css , 74096apnew/css/bootstrap.min.css , 121260apnew/css/font-awesome.min.css , 27466apnew/css/jquery-ui.css , 36437apnew/css/jquery.carousel-3d.default.css , 3639apnew/css/mater…

php十六进制字符串转成字节数组_10 天 5 千 Star!21 岁本科生给程序员开发的十六进制编辑器...

【导语】:ImHex 是一款界面美观的十六进制编辑器,主要面向逆向工程师和程序员。如果你喜欢暗黑系编辑器,那它应该是你的菜。ImHex 最近在 GitHub 上非常火热,上架五天就收获了 2.5k Star,十天 5k Star。开发者介绍ImHe…

扫掠两条引导线_《神都夜行录》周年庆点燃线上线下,解读国风二次元IP的成长之路...

自2016年国产二次元手游在市场实现登顶以来,该品类便一直呈明显的上升趋势,如今也依然是大小厂商乃至创业团队的布局对象。不过具体到二次元手游的玩法和IP建设上,多数产品都选择沿袭早期舰娘like的收集模式,再加上市面热门的重度…

四川三河职业学院计算机寝室,2020四川三河职业学院宿舍条件如何-有空调否?(宿舍图片)...

对于要考的大学宿舍条件好不好,想必大家也是很关心的,下面就带大家探索一番。(注:每年存在大学宿舍翻新的情况,数据与图片可作为参考。。)1、四川三河职业学院宿舍条件学生宿舍近日,四川三河职业学院为2013级即将入住的…

安徽科技学院计算机二级,安徽科技大学2017年3月计算机二级考试报名时间

根据安徽省教育招生考试院要求,安徽科技学院2017年上半年全国计算机二级考试定于2017年3月25日至28日(具体时间见准考证)举行。本次考试报名工作具体安排如下:一、开考科目、级别二、报名及缴费时间2017年2月13日上午9:00至2月28日下午17:30。三、报名方…