Linux内核驱动内存分配之kmalloc函数分析

一、kmalloc函数的原型及参数介绍

    #include 
    void *kmalloc(size_t size, int flags);
	参数:
        kmalloc的第一个参数是要分配的块的大小,第二个参数是分配标志。

	size参数:
	    用户空间malloc是基于堆内存分配,内核负责管理系统物理内存,物理内存只能按页面进行分配,
		因此,kmalloc是基于页进行分配。另外需要注意的一点是内核只能分配一些预定义的、固定大小的字节数组。
		kmalloc可以处理的最小的内存块是32或64,最大分配的内存大小为128K。

	flags参数:
        GFP_KERNEL 
		内核内存的通常分配方法,若暂时不能满足内存分配,则进程会睡眠等待页,即会引起阻塞。

		GFP_USER 
		用于为用户空间分配内存,可能会休眠。

		GFP_ATOMIC 
		用于在中断处理例程或其他运行于进程上下文之外的代码中分配内存,不会休眠。

		GFP_HIGHUSER
		用于为用户空间分配内存,指高端内存分配,可能会休眠。

		GFP_NOIO
		禁止任何I/O的初始化(主要在虚拟内存代码中使用)。

		GFP_NOFS
		分配不允许执行任何文件系统调用(主要在文件系统代码中使用)。

        ****************************************************************
		分割线以上的flag可以和分割线以下的flag “或”起来使用
		****************************************************************

		__GFP_DMA
		该标志请求分配发生在可进行DMA的内存区段中。

		__GFP_HIGHMEM
		该标志表明要分配的内存可位于高端内存。

		__GFP_NOWAPN 
		该标志使用的次数较少,它主要是避免内核在无法满足分配请求时产生警告信息。

		__GFP_COLD
		该标志表示请求尚未使用的“冷”页面。

		__GFP_HIGH 
		该标记标记了一个高优先级的请求,它允许为紧急状况而消耗由内核保留的最后一些页面。

        __GFP_REPEAT
		该标志表示在分配器在满足分配请求而遇到困难时,“努力再尝试一次”,它会重新尝试分配,但还是有失败的可能性。

		__GFP_NOFAIL
		该标志表示在分配器在满足分配请求而遇到困难时告诉分配器始终不返回失败。

		__GFP_NORETRY
		该标志表示在请求内存不可获得的时候会立即返回。
		
		__GFP_ZERO
		该标志表示在请求内存时,申请全部填充为0的内存页

		GFP前缀是由于在分配内存时总是调用get_free_page来实现实际的分配而得来的缩写。

二、函数相关

    1、在设备驱动程序或者内核模块中动态开辟内存,kmalloc ,vmalloc,或者用get_free_pages直接申请页。
	
	2、释放内存用的是kfree,vfree,或free_pages。
	
	3、kmalloc函数返回的是虚拟地址(线性地址)。
	
	4、kmalloc特殊之处在于它分配的内存是物理上连续的,这对于要进行DMA的设备十分重要,而用vmalloc分配的内存只是线性地址连续,物理地址不一定连续,不能直接用于DMA。
	

 

你可能感兴趣的:(Linux驱动开发笔记,嵌入式开发学习笔记,内存管理)