kmalloc 学习

Posted on 2010-04-28 21:23  雅飞士  阅读(545)  评论(0编辑  收藏  举报

 在学习内存管理的时候遇到了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.  上网看了下,说是可能是内存泄露的问题,但不知道问题出在哪。暂时还不知道如何解决,说是要重启。  再看看吧。

Copyright © 2024 雅飞士
Powered by .NET 9.0 on Kubernetes