在学习内存管理的时候遇到了kmalloc,第一感觉,更malloc有点像,想了下,malloc是在用户态申请空间用的,估计kmalloc就是在内核态申请空间用的吧,k即是kernel的意思。
linux的内存管理使用页表机制,进行整页的内存空间申请使用get_free_page(),这是申请大内存,而申请就用kmalloc(),这在驱动开发中很常用,因为那就是对内核空间进行操作。kmalloc是在页的基础上申请128K不到的空间,其中有16字节的空间被页描述符占用。
由于内核空间在3G-4G 之间,所以kmalloc的空间必在此范围内。
kmalloc申请的空间是物理地址,但此函数返回的却是虚拟地址(仅能大概看懂,不能描述清),所以需要进行下述转换:
extern inline unsigned long virt_to_phys(volatile void * address)
{
return __pa(address);
}
__pa是个宏,定义在include\asm-i386\io.h中。
下面给个我写的测试模块:
代码
1 #include <linux/module.h>
2 #include <linux/slab.h>
3 #include <linux/vmalloc.h>
4 #include <linux/kernel.h>
5
6 unsigned char *pagemem;
7 unsigned char *kmallocmem;
8 unsigned char *vmallocmem;
9
10 int __init mem_module_init(void)
11 {
12 /*/*get_free_page
13 if((pagemem = (unsigned char *)get_free_page(0)) == NULL)
14 {
15 printk("get free page error!\n");
16 }
17 else
18 {
19 printk("<1> pagemem addr = %x\n",pagemem);
20 }
21 /*kmalloc */
22 if((kmallocmem = (unsigned char *)kmalloc(100,0)) == NULL)
23 {
24 printk("kmalloc error!\n");
25 }
26 else
27 {
28 printk("<1> kmallocmem addr = %x\n",kmallocmem);
29 }
30 if((vmallocmem = (unsigned char *)vmalloc(1000000)) == NULL)
31 {
32 printk("vmalloc error!\n");
33 }
34 else
35 {
36 printk("<1> vmallocmem addr = %x\n",vmallocmem);
37 }
38 return 0;
39 }
40
41 void __exit mem_module_exit(void)
42 {
43 // free_page(pagemem);
44 kfree(kmalloc);
45 vfree(vmalloc);
46 printk("<1> exit the mem_moudle......\n");
47 }
48
49 module_init(mem_module_init);
50 moudle_exit(mem_module_exit);
51 MODULE_LICENSE("GPL");
该模块在卸载的时候出现了 ERROR:device or resource busy. 上网看了下,说是可能是内存泄露的问题,但不知道问题出在哪。暂时还不知道如何解决,说是要重启。 再看看吧。