zoukankan      html  css  js  c++  java
  • [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的实现

  • 相关阅读:
    刷题柱 -- 暂封
    模板重搭建計劃
    思路与好题记录与小技巧
    错误记录
    随便记点东西……
    图床
    杂碎的小技巧
    hnsdfz -- 6.21 -- day7
    hsdf -- 6.21 -- day6
    hnsdfz -- 6.20 -- day5
  • 原文地址:https://www.cnblogs.com/zhiliao112/p/4251202.html
Copyright © 2011-2022 走看看