• [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()两个函数,

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

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

  • 相关阅读:
    【转】比较全面的讲解 APS.NET MVC
    WebCast中的WCF视频教程
    【转】Linq Lambda学习
    RSA算法和习题分析。
    图片处理渐变
    Sql Server 和 Access 操作数据库结构Sql语句
    MSDN目录结构摘要
    C#开发一个如上的工业仪表盘控件
    NET Reflector 是反编译.NET 源码
    asp.net实现Bar图
  • 原文地址:https://www.cnblogs.com/zhiliao112/p/4251202.html
Copyright © 2020-2023  润新知