介绍概念:

  • vmallock kmallock mallock

    在设备驱动程序或者内核模块中动态开辟内存,不是用malloc,而是kmalloc vmalloc,释放内存用的是kfree,vfree

    Linux内核管理--内存(二)_Linux


  • 区别大概可总结为:

         1,vmalloc分配的一般为高端内存,只有当内存不够的时候才分配低端内存;kmallco从低端内存分配。

        2,vmalloc分配的物理地址一般不连续,而kmalloc分配的地址连续,两者分配的虚拟地址都是连续的;

        3,vmalloc分配的一般为大块内存,而kmaooc一般分配的为小块内存,(一般不超过128k);

                      4.k malloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存。

  •  用户内存与内核内存

    Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。用户空间的内存映射采用段页式,而内核空间有自己的规则



    通常32位linux内核虚拟地址空间划分0~3G为用户空间,3~4G为内核空间(注意,内核可以使用的线性地址只有1G)。虚拟内存默认4G, 注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的。

  • Linux内核管理--内存(二)_Linux_02

    1)对于32位系统来说,最多支持2的32次方(4G)内存,进程在创建时首先分配的是4G虚拟内存,其中3G是用户空间,存放用户程序的代码和数据,1G是内核空间,存放内核程序与代码。

     2) 1G的内核空间分为三个空间,zone_DMA, normal_DMA, high_DMA, 前两个占据0~896M, 高端内存占据后128M,虽然是高端内存,前896兆映射物理内存最低的0~896兆,不动,内核可以随时访问者896M,依靠最后的128M高端内存可以访问全部内存(4G),依靠位移映射:借一段地址空间,建立临时地址映射,用完后释放,达到这段地址空间可以循环使用,访问所有物理内存。用户内存只能访问3G物理内存。

可以参考这篇文章,写的很详细:

http://blog.csdn.net/tommy_wxie/article/details/17122923/


  • DMA

     DMA是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。要把外设的数据读入内存或把内存的数据传送到外设,一般都要通过CPU控制完成,如CPU程序查询或中断方式。利用中断进行数据传送,可以大大提高CPU的利用率。但是采用中断传送有它的缺点,对于一个高速I/O设备,以及批量交换数据的情况,只能采用DMA方式,才能解决效率和速度问题。DMA在外设与内存间直接进行数据交换,而不通过CPU,这样数据传送的速度就取决于存储器和外设的工作速度。通常系统的总线是由CPU管理的。在DMA方式时,就希望CPU把这些总线让出来,即CPU连到这些总线上的线处于第三态--高阻状态,而由DMA控制器接管,控制传送的字节数,判断DMA是否结束,以及发出DMA结束信号。DMA控制器必须有以下功能:

     1. 能向CPU发出系统保持(HOLD)信号,提出总线接管请求;

     2. 当CPU发出允许接管信号后,负责对总线的控制,进入DMA方式;

     3. 能对存储器寻址及能修改地址指针,实现对内存的读写操作;

     4. 能决定本次DMA传送的字节数,判断DMA传送是否结束

     5. 发出DMA结束信号,使CPU恢复正常工作状态。

    为了减少CPU对快速设备入出的操作,可以通过把这 批数据的传输过程交由一块专用的接口卡(DMA接口)来控制,让DMA卡代替CPU控制在快速设备与主存储器之间直接传输数据,其大概工作的机制是在DMA模式下,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据的传送,数据传送完毕再把信息反馈给CPU,这样就很大程度上减轻了 CPU资源占有率

    内核空间的ZONE_DMA的范围是0~16M,该区域的物理页面专门供I/O设备的DMA使用。之所以需要单独管理DMA的物理页面,是因为DMA使用物理地址访问内存,不经过MMU,并且需要连续的缓冲区,所以为了能够提供物理上连续的缓冲区,必须从物理地址空间专门划分一段区域用于DMA。


  • CPU查询与中断

    一个微机系统中有多个外围设备采用查询式I/O方式交换信息时,CPU应采用分时控制方式,逐一查询,逐一服务,其工作原理如下:每个外围设备提供一个或多个状态信息,CPU逐次读入并测试各个外围设备的状态信息,若该外围设备请求服务(请求交换信息),则为之服务,然后清除该状态信息。否则,跳过,查询下一个外围设备的状态。各外围设备查询完一遍后,再返回从头查询起,直到发出停止命令为止。但是在查询式I/O方式下,CPU要不断地读取状态字和检测状态字,不管那个外围设备是否有服务请求,都必须一一查询,许多次的重复查询,可能都是无用的,而又占去了CPU的时间,效率较低。为了提高CPU的效率和使系统具有良好的实时性,可以采用中断控制I/O方式。采用中断方式CPU就不必花费大量时间去查询各外围设备的状态了。而是当外围设备需要请求服务时,向CPU发出中断请求,CPU响应外围设备中断,停止执行当前程序,转去执行一个外围设备服务的程序,此服务程序称为中断服务处理程序,或称中断服务子程序。中断处理完毕,CPU又返回来执行原来的程序。

    查询方式:主要用于CPU不太忙且传送速度不高的情况下。无条件传送方式作为查询方式的一个特例,主要用于对简单I/O设备的控制或CPU明确知道外设所处状态的情况下。 
    (2) 中断方式:主要用于CPU的任务比较忙的情况下,尤其适合实时控制和紧急事件的处理 
    (3) DMA方式(直接存储器存取方式):主要用于高速外设进行大批量数据传送的场合。


    中断方式是在数据缓冲寄存区满后,发中断请求,CPU进行中断处理
    DMA方式则是以数据块为单位传输的,在所要求传送的数据块全部传送结束时要求CPU进行中断处理,大大减少了CPU进行中断处理的次数
    中断方式的数据传送是由设备到CPU再到内存,或者相反。
    DMA方式的数据传送则是将所传输的数据由设备直接送入内存,或是由内存直接送到设备

    http://www.linuxidc.com/Linux/2014-03/98013.htm 内核中断处理