MMU具有物理地址和虚拟地址转换,内存访问权限保护等功能。这使得Linux操作系统能单独为每个用户进程分配独立的内存空间并且保证用户空间不能访问内核空间的地址,为操作系统虚拟内存管理模块提供硬件基础。
Linux内存管理
       在Linux操作系统中,进程的4G空间被分成两个部分----用户空间和内核空间。用户空间一般为0~3GB(即PAGE_OFFSET,在X86系统中等于0xC0000000),而剩余的3GB~4GB为内核空间。用户进程在通常情况下只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址。用户只有通过系统调用才能访问到内核空间。
       每个进程的用户空间都是完全独立的、互不相干的,用户进程各自有不同的页表。内核进程是由内核负责映射的,它并不会跟着用户进程改变,是固定的。内核空间的虚拟地址独立其他程序的空间。
      Linux内核中的1GB的内核地址划分为物理内存映射区、虚拟内存分配区、高端页面映射区、专用页面映射区和保留区。
                
        在物理区和和高端映射区之间的是虚拟内存分配区,用于vmalloc()函数,他的前部与物理区存在一个隔离带,他的后部与高端内存映射区存在一个隔离带。
内存存取
1.用户空间内存动态申请
       函数为malloc,malloc( )申请的一定要free( )释放,这两个函数成对使用,否则会造成内存泄露。对于Linux内核而言,C库的malloc()函数通常通过底层的brk( )和mmap( )来实现。
2.内核空间内存动态申请
        内核申请涉及到的函数主要有kmalloc( )、__get_free_page( )和vmalloc( )、kmalloc( )和__get_free_page( )(及其相关函数)申请的内存位于物理内存映射区,在物理上也是连续的,他们与真实的物理地址相差一个固定的偏移量。而vmalloc()申请的内存位于虚拟内存映射区的一块内存,这块内存在物理内存上并不一定连续,而vmalloc()申请的虚拟内存和物理内存之间也没有简单的换算关系。
       (1)kmalloc( )
         kmalloc()的第一个参数为要分配的内存块的大小,第二个参数为标志位,用于控制kmalloc()函数的行为。最常用的标志位是GFP_KERNERL,含义是在内核的虚拟空间中申请内存。kmalloc的底层依赖于__get_free_page()来实现。使用__get_free_page( )时,若暂时不能满足,则进程会睡眠。因此不能再中断上下文或者持有自旋锁的时候不能使用GFP_KERNERL标志。
         在中断处理函数中,或者tasklet和定时器等非进程上下文不能阻塞时,可以使用GFP_ATOMIC标志位。用此标志申请时,若内核没有空闲,则不会等待。
       使用kmalloc( )申请的内存由kfree( )释放。
         (2)__get_free_page( )
       此函数是Linux内核本质上的最底层用于获取空闲内存的方法。因为底层的算法以page的2的n次方来管理内存。所以最底层的实现是以页为单位。
         此系列函数包含__get_zeroed_page()返回一个指向新页的指针,并且将该页清零。__get_free_page( )返回一个指向新页的指针,但是该页不清零。__get_free_pages( )该函数返回一个指向几页的指针的首地址,分配的页数为2的oder次方,并且分配的页数也不清零。oder允许的最大值为10(即1024页)或者11(2048),具体依赖于硬件平台。释放的时候采用free_page( )。如果释放的oder 和申请的oder不一致,则会造成内存混乱。
        (3)vmalloc()一般只存在于软件中的较大的顺序缓冲区的分配内存,vmalloc()远大于__get_free_page()的开销为了完成vmalloc,新的页表需要被建立。因此用vmalloc完成少量内存的申请是不妥的。
        vmalloc不能用在原子上下文,因为他的内部实现时调用__GFP_KERNERL标志位的kmalloc来实现的。
        (4)slab与内存池
        在Linux系统中用页作为单元来申请和释放内存是很容易导致浪费。另外,在操作系统中,进程会涉及到大量的重复生成、释放问题。例如:inode,task_struct 等。slab 就是使得在前后两次使用时分配在同一内存区域,或者同一类内存空间,并且保留了基本的数据结构,就可以达到提高效率。
        slab的使用流程如下:
        注:slab 在底层虽然依赖于__get_free_page( )来实现,但是,申请到的以页为单位的内存空间分隔成更小的内存单元来管理,这样不会造成内存的浪费。在Linux中还有内存池的使用,同样用于大量的小对象的后备缓冲技术的使用。 
 
 
 
 
 
 
 

Linux设备驱动--内存管理的更多相关文章

  1. linux设备驱动归纳总结(五):1.在内核空间分配内存【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-79134.html linux设备驱动归纳总结(五):1.在内核空间分配内存 xxxxxxxxxxxx ...

  2. linux设备驱动归纳总结(四):1.进程管理的相关概念【转】

    本文转载自;http://blog.chinaunix.net/uid-25014876-id-64866.html linux设备驱动归纳总结(四):1.进程管理的相关概念 xxxxxxxxxxxx ...

  3. 蜕变成蝶~Linux设备驱动之CPU与内存和I/O

    那是世上最远的距离 思念让我无法去呼吸 你的一动和一举 占据我心里 陪我每个孤独无尽的夜里 用我心中盛放的画笔 描绘你微笑时的绚丽 爱让人痛彻心底 我却不怀疑 你的存在是我生命的奇迹 感受你的每一次的 ...

  4. 【Linux开发】linux设备驱动归纳总结(五):1.在内核空间分配内存

    linux设备驱动归纳总结(五):1.在内核空间分配内存 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  5. 【Linux开发】linux设备驱动归纳总结(五):2.操作硬件——IO内存

    linux设备驱动归纳总结(五):2.操作硬件--IO内存 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  6. 【Linux开发】linux设备驱动归纳总结(四):1.进程管理的相关概念

    linux设备驱动归纳总结(四):1.进程管理的相关概念 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  7. linux设备驱动归纳总结(七):1.时间管理与内核延时【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-100005.html linux设备驱动归纳总结(七):1.时间管理与内核延时 xxxxxxxxxxx ...

  8. 【Linux开发】linux设备驱动归纳总结(七):1.时间管理与内核延时

    linux设备驱动归纳总结(七):1.时间管理与内核延时 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  9. 浅谈Android系统移植、Linux设备驱动

    一.Android系统架构 第一层:Linux内核 包括驱动程序,管理内存.进程.电源等资源的程序 第二层:C/C++代码库 包括Linux的.so文件以及嵌入到APK程序中的NDK代码 第三层:An ...

随机推荐

  1. IBatis Map时间参数文字格式不匹配!

    CS. ht.Add("start_time", startTime); Map <isNotNull prepend="and" property=&q ...

  2. 【题解】SCOI2007组队

    恩……为什么大家都这么执着于 \(O(n^{2})\) 的复杂度捏?如果接受 \(O(n^{2} + nV)\) 的复杂度,那这题可不是道**题吗( • ̀ω•́ )✧ 首先把所有的人按照身高排个序, ...

  3. [洛谷P1552][APIO2012]派遣

    题目大意:有一棵$n$个点的树,和一个费用$m$,每个点有一个费用和价值,请选一个点,再从它的子树中选取若干个点,使得那个点的价值乘上选的点的个数最大,要求选的点费用总和小于等于$m$ 题解:树形$d ...

  4. bzoj 1207: [HNOI2004]打鼹鼠 (dp)

    var n,m,i,j,ans:longint; x,y,time,f:..]of longint; begin readln(n,m); to m do readln(time[i],x[i],y[ ...

  5. MySQL基础原创笔记(二)

    表索引关键字:PRI primary key 表示主键,唯一 写法: id bigint(20) unsigned primary key not null ,uni UNIQUE 表示唯一 id b ...

  6. DPM(Deformable Parts Model)--原理(一)

    http://blog.csdn.net/ttransposition/article/details/12966521 DPM(Deformable Parts Model) Reference: ...

  7. Spring框架介绍和原理

    SpringMVC框架介绍 1) Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面. Spring 框架提供了构建 Web 应用程序的全功 ...

  8. bzoj 1068 [SCOI2007]压缩 区间dp

    [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1644  Solved: 1042[Submit][Status][Discu ...

  9. Java程序运行时的几个区域

    Java运行时涉及到的区域 几个基本概念: 1.Java对象     2.Java方法    3.一个编译好的类,以class文件的形式出现 4.Java的本地方法   5.线程私有和线程共有   一 ...

  10. loj6102 「2017 山东二轮集训 Day1」第三题

    传送门:https://loj.ac/problem/6102 [题解] 贴一份zyz在知乎的回答吧 https://www.zhihu.com/question/61218881 其实是经典问题 # ...