[linux内存]linux内存学习——常见问题
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()两个函数,
- unsigned long copy_to_user(void __user *to,const void *from,unsigned long count)
其中的参数 to就是代表用户空间指针,内核空间要访问用户空间内容,必须要用以上接口,因为在 Linux 中,用户内存和内核内存是独立的,在各自的地址空间实现,以上函数在实现的时候会做内存转换和用户空间地址的检查。copy_from_user的实现
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。