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的默认配置文件,用来…

c语言字符串文库总结,C语言程序设计入门:字符串函数

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如果有侵权请立即联系:55525090qq.com,我们立即下架或…

vs写c语言能用scanf,【PAT编写代码时遇到的问题】vs中使用scanf(%c,x);

首先,为了在VS中使用scanf,可以在程序开头加上#pragma warning(disable:4996)昨天在编写程序的时候,突然发现在循环中使用scanf("%c",&x);的时候,发现结果很奇怪,只能读入和输出我所输入的数据的一半。后…

大数计算器概念c语言,用C语言求两个超大整数的和

用C语言求两个超大整数的和在生活中,我们经常需要计算非常大的数,但是任何一种计算器都有计算范围,一旦超过计算范围就会有精度的损失。或许有同学认为我们可以通过程序来解决,比如对于C语言来说,我们定义一个long lon…

3 5的二维数组C语言程序,C语言及程序设计提高例程-33 二维数组元素的引用

贺老师教学链接 C语言及程序设计提高 本课讲解输入输出二维数组元素#include int main(){int s[3][5], i, j;printf("Input 3*5 numbers\n");for (i0; i<3; i)for(j0; j<5; j)scanf("%d", &s[i][j]);for (i0; i<3; i){for(j0; j<5; j)pri…

android程序 幻灯片,Android:ViewPager制作幻灯片

public class MainActivity extendsActivity {//ViewPagerprivateViewPager viewpager;//幻灯片图片资源private int [] imgArray{R.drawable.view1,R.drawable.view2,R.drawable.view3};//图片数组private ArrayListviewlist;privateImageView imageView;//点点privateViewGro…

android获取图片方向并旋转,Android 判断imageview角度并旋转

/*** 读取照片exif信息中的旋转角度** return角度 获取从相册中选中图片的角度*/public static float readPictureDegree(String path) {int degree 0;try {ExifInterface exifInterface new ExifInterface(path);int orientation exifInterface.getAttributeInt(ExifInterf…

android键盘移动光标,在Android键盘上完成键

Jos Silva..12代替ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));尝试ic.performEditorAction(EditorInfo.IME_ACTION_GO);执行的操作应该是在EditorInfo上定义的操作,它将在方法onStartInputView上传递给您要在操作之间切换,请使用:(sEditorI…

android 远程桌面连接闪退,远程桌面一点连接就闪退,不能弹出输入账号密码窗口...

您好&#xff0c;感谢您在我们论坛发帖。首先&#xff0c;按照您的描述&#xff0c;正常情况下&#xff0c;您的客户端可以远程连接您的服务器&#xff0c;输入IP和端口之后&#xff0c;会弹出验证框&#xff0c;输入账户密码之后即可进入服务器的桌面。当出现问题时&#xff0…

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…

signature=5bcdc11c0d509d82e0d44c544cfad97b,江苏省职称计算机考试新职称光盘试卷

试卷一1、世界上第一台电子数字计算机采用的主要逻辑部件是(D)A光电管 B继电器 C晶体管 D电子管2、世界上首次提出存储程序计算机体系结构的是(D)A艾伦〃图灵 B莫奇莱 C乔治〃布尔 D冯〃诺依曼3、计算机最主要的工作特点是(A)A存储程序与自动控制 B高速度与高精度C可靠性与可用…

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

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

你是怎么理解HTML语义化,HTML语义化标签理解

1&#xff1a;语义化标签是什么&#xff1f;语义化标签&#xff0c;目的是让标签有自己的含义语义化非语义化如上代码&#xff0c;p标签含义就是段落&#xff0c;而span标签毫无意义。2&#xff1a;语义化标签好处方便用户阅读&#xff0c;页面更加清晰。更好的SEO&#xff0c;…

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

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

android开发屏幕横放,android-即使从横向旋转到垂直,细节片段也会...

在一个Activity中,我们称其为MasterActivity,我只想在横向模式下加载媒体播放的细节片段.准备就绪后,媒体将自动启动.主从流程设置&#xff1a;我有两个xml,activity_master和activity_master.xml(land).标识为“ detail_container”的容器视图仅位于景观xml中.具有细节容器的l…

android insmod命令,android的启动脚本(init.rc)文件的语法

android的启动脚本(init.rc)文件的语法&#xff0c;参考资料&#xff1a;Android 初始化语言(Android Init Language)Android初始化脚本语言包含四种类型的语句&#xff1a;动作(Actions)指令(Commands)服务(Services)选项(Options)该语言的语法包括下列约定&#xff1a;所有类…

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

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

html图片拼接出现留白,关于img标签周围留白的问题

在进行页面的DIV CSS排版时&#xff0c;遇到IE6浏览器中的图片元素img下出现多余空白的问题绝对是常见的&#xff0c;对于该问题的解决方法也是“见机行事”。1、将图片转换为块级对象即&#xff0c;设置img为“display:block;”。在本例中添加一组CSS代码&#xff1a;“#sub i…

html5中的行高元素,详解HTML元素的height、offsetHeight、clientHeight、scrollTop等梳理

关于元素的一些属性在前端的日常开发中&#xff0c;我们经常无可避免的需要获取或者监听一些页面的属性&#xff0c;那么我们需要经常了解一些属性代表的含义才能更好地使用这些属性。特别是一下这些&#xff1a;尺寸相关&#xff1a;offsetHeight、clientHeight、scrollHeight…

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

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