Linux内核API kmalloc

kmalloc函数功能描述:kmalloc( )分配在物理上连续的内存,虚拟地址自然也是连续的,它基于slab分配实际上存在的连续的内存。

kmalloc文件包含

#include<linux/slab.h>

kmalloc函数定义

在内核源码中的位置:linux-3.19.3/include/linux/slab.h

函数定义格式:

static __always_inline void *kmalloc(size_t size, gfp_t f lags)

kmalloc输入参数说明

  • size:是指要分配的内存的字节数。
  • flags:是分配标志,它提供了多种kmalloc( )的行为。其中分配标志(flags)的常见取值参考alloc_pages( )函数的分析。

kmalloc返回参数说明

kmalloc( )函数返回一个指向分配的内存块起始地址的地址指针。

kmalloc实例解析

编写测试文件:kmalloc.c

头文件及全局变量声明如下:

#include <linux/slab.h>
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
static int __init kmalloc_init(void);
static void __exit kmalloc_exit(void);

#define MEM_KMALLOC_SIZE 8092
char * mem_spvm;

模块初始化函数:

int __init kmalloc_init(void)
{
    mem_spvm = (char *)kmalloc( MEM_KMALLOC_SIZE, GFP_KERNEL);
    if(mem_spvm == NULL )
        printk("kmalloc failed! \n");
    else
        /*输出分配的内存空间的起始地址*/
        printk("kmalloc successfully! \naddr = 0x%lx\n", (unsigned long)mem_spvm);

    return 0;
}

模块退出函数:

void __exit kmalloc_exit(void)
{
    if(mem_spvm ! = NULL)
    {
        kfree(mem_spvm);
        printk("kfree ok! \n");
    }
    printk("exit ! \n");
}

模块初始化及退出函数调用:

module_init(kmalloc_init);
module_exit(kmalloc_exit);

实例运行结果及分析:

首先编译模块,执行命令insmod kmalloc.ko插入模块,然后执行命令dmesg -c,会出现如图所示的结果。

Linux内核API kmalloc

执行命令rmmod kmalloc.ko卸载模块,由命令dmesg -c显示系统信息如图所示。

Linux内核API kmalloc

结果分析:

插入模块时测试程序调用kmalloc( )函数,由字符指针mem_spvm接收kmalloc( )函数的返回值,即已分配的连续内存块的起始地址。由输出信息可知该起始地址为0xffff8800a5dec000。

卸载模块时调用kfree( )函数释放起始地址为0xffff8800a5dec000,大小为MEM_KMALOC_SIZE的内存块。

赞(1)
未经允许不得转载:极客笔记 » Linux内核API kmalloc
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址