#include
#include
#include
MODULE_LICENSE("GPL");
static int __init kzalloc_init(void);
static void __exit kzalloc_exit(void);
#define MEM_KZALLOC_SIZE 8092
char * mem_spvm;
模块初始化函数:
int __init kzalloc_init(void)
{
// 调用kzalloc分配一个内存空间
mem_spvm = (char *)kzalloc(MEM_KZALLOC_SIZE, GFP_KERNEL);
if(mem_spvm == NULL )
printk("kzalloc failed! n");
else
{
printk("kzalloc successfully! addr = 0x%lxn", (unsigned long)mem_spvm );
printk("the content of mem_spvm+2 is: %dn", *(mem_spvm+2));
printk("the content of mem_spvm+500 is: %dn", *(mem_spvm+500));
}
return 0;
}
模块退出函数:
void __exit kzalloc_exit(void)
{
if(mem_spvm ! = NULL)
{
kfree(mem_spvm); //释放由kzalloc( )所分配的内存空间
printk("kfree ok! n");
}
printk("exit! n");
}
模块初始化及退出函数调用:
module_init(kzalloc_init);
module_exit(kzalloc_exit);
实例运行结果及剖析:
首先编译模块linux内核内存分配,执行命令insmodkzalloc.ko插入模块,之后执行命令dmesg-cadobe air linuxlinux安装,运行结果如图所示。
结果剖析:
该测试文件调用kzalloc()函数分配一个大小为8092字节的显存空间,mem_spvm为对该显存空间引用。从输出结果可知,显存空间的起始地址为0xffffxffff88014818801481cc20002000。之后输出偏斜为2和偏斜为500的显存内容,均为0linux内核内存分配,说明kzalloc()在分配了显存空间以后,又这种显存空间初始化为0。
最后在模块退出时调用kfree()函数释放由kzalloc()分配的显存空间。