c语言编程笔录

首页 >   > 笔记大全

笔记大全

Linux内存初始化怎么实现

更新时间:2023-07-15

Linux内存初始化实现分析

在Linux系统启动时,内核会将物理内存的初始状态进行初始化。这个过程主要包括两个方面:内核虚拟地址空间的初始化和物理内存的初始化。

内核虚拟地址空间的初始化

内核虚拟地址空间的初始化是指Linux内核在启动时会构建一个自己的虚拟地址空间,并把物理地址映射到该空间。此外,内核还会在虚拟地址空间中预留一些区域用于内核代码、内核数据、中断向量表等。虚拟地址空间的初始化是Linux内核在初始化其余部分之前首先进行的。

  /* x86架构下的内核虚拟地址空间初始化*/
  void __init setup_arch(char **cmdline_p)
  {
      /*
       构建内核页表,映射物理地址到对应的虚拟地址
      */
      paging_init();
      /*
       初始化中断向量表
      */
      trap_init();
  }
  

物理内存初始化

物理内存初始化是指Linux内核在启动时会对物理内存的信息进行收集和处理,包括检测可用内存的大小、检查内存类型(如VGA内存)、建立伙伴系统等。

  /*
   * 初始化物理内存信息,并建立伙伴系统
   */
  void __init mem_init(void)
  {
      /*
       * 检查BIOS提供的内存信息
       */
      meminfo_init();
      /*
       * 建立伙伴系统
       */
      buddy_init();
      /*
       * 建立内存管理的slab_allocator
       */
      kmem_cache_init();
      /*
       * 启用快速内存池回收算法,提高内存利用率
       */
      ipc_init();
  }
  

总结

Linux内核在启动时需要进行内存初始化,其中主要包括内核虚拟地址空间的初始化和物理内存的初始化。内核虚拟地址空间的初始化包括构建内核页表和中断向量表,而物理内存的初始化则包括建立伙伴系统、建立内存管理的slab_allocator等操作。这些操作都是在内核启动过程中进行的。