欢迎来到天天文库
浏览记录
ID:46583907
大小:1.32 MB
页数:54页
时间:2019-11-25
《嵌入式Linux内存管理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、嵌入式Linux内存管理我们使用高级语言写的程序,是如何在系统中运行,如何与系统相互作用。只有了解了这些,你才能更加充分的利用系统的资源,使你的程序高效。进程所占内存一个进程运行时,所占用的内存,可以分为如下几个部分:1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收。3、全局区(静态区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的
2、另一块区域。程序结束后有系统释放。4、文字常量区:常量字符串就是放在这里的。程序结束后由系统释放。5、程序代码区:存放函数体的二进制代码。下面我们看一个简单的例子:inta=0;//全局初始化区char*p1;//全局未初始化区main(){intb;//栈chars[]="abc";//栈char*p2;//栈char*p3="123456";//123456 在常量区,p3在栈上。staticintc=0;//全局(静态)初始化区p1=(char*)malloc(10);p2=(char*)malloc(20);//分配
3、得10和20字节的区域就在堆区。strcpy(p1,"123456");//123456放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。}实际上在Linux系统中,进程所占内存主要分为4个段:1、只读的代码段:它主要包括函数代码、只读的字符串、数据等。2、可修改的静态变量:它主要包括全局变量和使用static标识的静态变量。emdoor3、栈:在进程运行过程,系统自动分配的内存区域,它还包括进程的环境变量、进程参数、以及函数局部变量等。4、堆:由程序员自己手动申请和回收的动态内存区域。在编写程序中,我
4、们很少去考虑进程中内存空间的问题,对于32位的操作系统,每个进程可用空间为4G;而实际上,我们面对的是若干个独立的进程,共享64M或更少的物理内存。在Linux中采用了延迟分配物理内存的策略,针对进程的内存分配请求,它只是在内核中分配一段虚拟地址,只有当确实使用这块内存时,系统才会为其分配物理地址。下面我们来看一段代码:#include#include#includeintmain(){char*p=(char*)malloc(10);char*p1=(char*)ma
5、lloc(200);strcpy(p,”123”);return0;}问题一:虚拟内存、物理内存与代码的对应关系?答:在char*p=(char*)malloc(10),只是分配了虚拟内存,kernel不会分配物理页面给进程。在strcpy(p,“123”),进程需要使用这块内存了,kernel会产生一个页故障,从而为系统分配一个物理页面。因此,系统为p1只是分配了一个虚拟空间,而对p分配了相应的物理内存。问题二:虚拟内存与物理内存有多大?答:虚拟内存是210个字节,物理内存是4KByte,因为kernel分配物理内存的最小单
6、位为一个物理页面,一个物理页面为(4KByte)。上面我们说p1只是对应虚拟空间,是不准确的;确切的,应该是在strcpy(p,”123”)之前p对应的是虚拟内存,在这之后它确实对应着物理内存。问题三:上面主要讲述的堆的虚拟内存与物理内存,对于代码段和数据段将如何呢?答:在进程启动后,系统会将进程的代码段和数据段映射到一块虚拟内存(没有占用物理内存),只有运行到相应代码或使用数据时,才会分配物理内存。内存占用情况虚拟内存,是用户层的概念;而物理内存,则属于Linux操作系统管理。所以,如果我们要想了解进程物理内存的使用情况,只
7、能通过Linux内核来获得。Linux内核恰好为我们提供了这样的一个接口:proc文件系统。你可以在根目录下看到/proc目录,这个目录不占据磁盘空间。proc目录下有许多文件,这些文件是根据你读取的时间由内核生成信息返回的,我们可以通过它来实时的了解内核相关信息。proc文件系统属于Linux驱动程序的范畴,进入到proc目录,我们会发现一些特定的文件,这些文件可能会由于你Linux版本的不同而有所改动。emdoor在proc目录下,你可以发现很多以数字为名称的目录,其实这些数字对应着当前系统中运行进程的pid,而这些目录下
8、面的文件,则记载着该进程的一些信息,如果我们想要了解一个进程的内存使用情况,就要查看这些文件。例如我们写了如下的一个程序来查看进程号(因为每次执行系统所分配的进程都是随机的,所以看到的进程号也是随机变动的):注:得到进程信息的常用函数getpid()系统调用:#include
此文档下载收益归作者所有