码迷,mamicode.com
首页 > 系统相关 > 详细

[linux内存]linux内存学习——常见问题

时间:2015-01-26 20:38:06      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

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技术分享技术分享
 
  1. unsigned long copy_to_user(void __user *to,const void *from,unsigned long count)  

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

[linux内存]linux内存学习——常见问题

标签:

原文地址:http://www.cnblogs.com/zhiliao112/p/4251202.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!