1,kmalloc()函数和vmalloc()函数的区别:

kmalloc()函数分配的内存是物理上连续的,而Vmalloc()函数分配的内存仅仅是虚拟地址连续的,正常内核编程通常使用kmalloc(),这主要是处于性能的考虑,因为vmalloc()将物理不连续的页转换为虚拟地址空间上连续的页,必须专门建立页表项,vmalloc()仅仅在当需要使用大块的内存的时候才会使用,典型的如模块被动态插入内核的时候。另外很多硬件设备需要的是物理地址连续的页,因为很多硬件设备存在于内存管理单元(MMU)之外。另外vmalloc()函数可能睡眠,不能在中端上下文使用,而kmalloc加GFP_ATOMIC可以保证用在不能睡眠的地方。

如果希望代码在不同的平台有很好可移植性,则不应该分配大于128K的内存。

kmalloc对应于kfree,分配的内存处于3GB~high_memory之间,这段内核空间与物理内存的映射一一对应,可以分配连续的物理内存; vmalloc对应于vfree,分配的内存在VMALLOC_START~4GB之间,分配连续的虚拟内存,但是物理上不一定连续,vmalloc()分配的对应于高端内存~

 

2,如何防止频繁的malloc() free()操作造成的内存碎片

答:使用内存池技术。

内存池技术首先会分配一大块内存给程序,当程序需要分配内存的时候从内存池中去获得,而且不需要去释放内存,当内存池不在用的时候释放整个内存即可,只分配,不释放,大大减少了时间。

如何构建内存池

 

3,内核空间是否可以访问用户空间的内存

答:可以,比如copy_to_user()和copy_from_user()两个函数,

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. unsigned long copy_to_user(void __user *to,const void *from,unsigned long count)  

其中的参数 to就是代表用户空间指针,内核空间要访问用户空间内容,必须要用以上接口,因为在 Linux 中,用户内存和内核内存是独立的,在各自的地址空间实现,以上函数在实现的时候会做内存转换和用户空间地址的检查。copy_from_user的实现

posted on 2015-01-26 19:58  知了112  阅读(393)  评论(0编辑  收藏  举报