百科问答小站 logo
百科问答小站 font logo



Linux的内核为什么一定要映射到所有的物理内存? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

具体没研究过Linux的行为,但其实所有操作系统的行为都差不多,先映射一大块物理内存(建立页表),这个大小远远大于内核需要的内存,然后内核起来以后再做进一步拆分。

原因概括一下就是方便管理。

对于操作系统来说,内存的页管理(Page Management)和内存池管理(主要是堆,Heap)是分开的,内核映射足够多的页,但并不一定都交给内存池直接使用,可能是给cache,给shm设备等。

页管理是多多益善,最好是把所有内存都占满,但这些内存页仍然可以交给用户使用的,因为一个物理地址可以映射给多个虚拟地址。只要这些页没有分配给指定的内存池,就仍然可以被用户使用,甚至同时被用户空间和内核空间使用(比如为了零拷贝)。

内核先占用了足够多的内存,这样就不用再做二次页分配的动作了,能保证内核的流畅性。如果内核一开始只占用比较小的内存区域,那么每次加载新的模块,就需要扩展这个内存区域,效率低不说,还可能有内存碎片的风险。

对于用户程序来说,因为用户程序一开始都是在磁盘上的,需要一点点的加载到内存上,甚至可以边运行边加载,所以没必要一下映射足够多的内存,因为可能在整个用户程序的生命周期了,某些内存一直都用不上,完全分配太浪费了。

对于某些大型程序来说,任何操作系统都推荐一次性的从页管理器里直接申请足够多的内存,而不是使用编译器库函数或者操作系统提供内存池API去访问,因为后者的效率比较低,并不适用于某些特定的场景。




  

相关话题

  如何评价 mimalloc? 
  如何看待华为称其对 Linux 贡献全球第一,Linux 内核审核员呼吁华为公司不要刷 KPI ? 
  Linode 里为什么 Ubuntu 最火呢? 
  学了三年的 Linux 了,我现在不能立马写出一个简单的 shell 脚本,怎么回事啊? 
  为什么 Windows 没有形成成熟的软件包和升级体系? 
  从操作系统内存管理来说,malloc申请一块内存的背后原理是什么? 
  为什么一般操作系统中应用程序的栈空间都要设最大值,不支持动态扩展? 
  我在Win11上运行虚拟机上的Linux出现这样的问题应该如何解决。? 
  如果把Linux kernel移植到新的平台,根据GPL协议,是否必须开放源代码呢? 
  实现一个http服务器需要怎样进行?需要哪些知识呢? 

前一个讨论
windows系统为什么不预留一点资源(cpu和内存占用),在执行繁重任务时以保证系统本身的流畅运行?
下一个讨论
CPU 的运行速度受光速影响吗?





© 2025-07-02 - tinynew.org. All Rights Reserved.
© 2025-07-02 - tinynew.org. 保留所有权利