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. axios携带cookie配置详解(axios+koa) 原

    话不多说,一个字,干! 前端配置如下: axios.defaults.withCredentials = true; //配置为tru openid: 'oJ0mVw4QrfS603gFa_uAFDA ...

  2. [转]Android 如何根据网络地址获取网络图片方法

    http://blog.csdn.net/xiazdong/article/details/7724103 目录(?)[-] h2pre namecode classhtml stylefont-we ...

  3. sudoers文件配置

    http://note.drx.tw/2008/01/linuxsudo.html foobar ALL=(ALL) ALL 現在讓我們來看一下那三個 ALL 到底是什麼意思.第一個 ALL 是指網路 ...

  4. bzoj 2599 [IOI2011]Race 点分

    [IOI2011]Race Time Limit: 70 Sec  Memory Limit: 128 MBSubmit: 4768  Solved: 1393[Submit][Status][Dis ...

  5. PIP 批量更新改为清华这边的镜像更新

    之前pip批量更新的时候发现有些包无法更新,而且速度也特别慢,今天尝试了下清华的镜像,速度是真快 # coding=utf-8import pipfrom subprocess import call ...

  6. uboot各文件及文件夹分析

    1.配置编译 uboot的配置编译需要在linux原生文件夹下,因为在编译过程中会生成符号链接.在windows中不支持.配置方法是:首先cd进入uboot源码的根目录,然后在根目录下执行:make ...

  7. Spring Boot 打包部署

    一.打包成jar并部署 1.工程--右键选择运行配置: 在Goals中输入: org.apache.maven.plugins:maven-jar-plugin:.RELEASE:repackage ...

  8. [技巧篇]03.关于MyBatis的简单批量处理

  9. 【网络】RFC1245-OSPF Protocol Analysis

    OSPF协议分析 摘要 这是OSPF协议的两份报告中的第一份,这些报告是因特网工程指导组要求的,是用来将一个因特网协议写成标准草案的.OSPF是一个TCP/IP协议族中的一个的路由协议,被设计用于一个 ...

  10. Jmeter-Java heap内存溢出

    使用jmeter进行压力测试时遇到一段时间后报内存溢出outfmenmory错误,导致jmeter卡死了,先尝试在jmeter.bat中增加了JVM_ARGS="-Xmx2048m -Xms ...