简述linunx内存管理初始化流程

本文基于linux-4.4.6 ,arm64平台

一:mmu和kernel image的映射 

    在汇编阶段,需要完成identity map和kernel image map两个工作,假设arm64 使用48位虚拟地址,4级translation table :9(level 0 or PGD) + 9(level 1 or PUD) + 9(level 2 or PMD) + 9(level 3 or PTE) + 12(page offset),页大小为4k,并且使用了section map机制,那么根据链接文件可知,在bss段之后分配了6个页作为translation table page使用,identity map和kernel image map各使用3个页面,因此对于物理地址、大小、虚拟地址都确定好的两个区域可以完成地址的映射。完成映射之后,就可以根据identity map的内容完成mmu的使能。

 

二:DTB的映射

    完成上述两个映射之后,第三个映射便是DTB。DTB的映射方式是fixmap,fixmap是虚拟地址固定的一段区域,用来映射到一段确定的物理地址空间。DTB的size不能超过2M,这是因为fixmap区域预留给DTB的大小为4M,需要考虑到section map和地址对齐,比如DTB大小为1.5M,物理地址位于3M~4.5M,那么实际映射的空间是2M~6M。如果超过2M,那么可能超出fixmap中DTB的区域大小。完成DTB映射的3个页表在bss段当中。此时kernel image map已经完成当然可以访问bss段了。

 

三:管理物理内存之memblock模块

    完成DTB映射之后,就是对其进行解析了。根据DTB中内存相关节点以及cmdline参数解析,可以了解整个物理内存布局:memory region、reserved memory、removed memory。此时内核是通过memblock模块来管理内存信息的,记录所有memory region和reserved memory。了解了内存布局,但是还需要完成映射才能进行访问,下面就是完成对这些内存的映射。映射过程借助了bss段之后那三个为kernel image map准备的translation table page,通过这三个页表,可以映射1G的物理空间,memblock只需要保证在建立映射时申请的内存(有需要时会通过memblock_alloc分配内存用来存放translation table)位于这1G范围以内,那么便可以正常映射,这之后所有可用的物理地址空间都完成了映射可以访问了。

 

四:建立sparse内存模型

    sparse指的是物理地址存在空洞并且支持内存热插拔。在arm64中,管理sparse内存模型的最小内存单元是section,每个section大小为1G。Linux内核中,通过一个全局的二维数组struct mem_section **mem_section来维护映射关系。同时,每个section都会分配一个usemap来管理页面压缩迁移等的bit位,一个section分为256个pageblock,每个pageblock需要4bit来标志一些flag,因此每个section需要为usemap分配256*4/8=125字节。之后需要遍历所有section,只要在位,就为该section所有物理页面struct page实例分配虚拟地址空间和物理页表内存,并完成映射,其中虚拟地址是从vmemmap开始的,每一个page对应一个struct page结构。

 

五:内存zone的初始化

    对于arm64 UMA来说,整个内存被看成一个node,该node内根据宏定义可分为ZONE_DMA、ZONE_NORMAL(arm64没有高端内存)等,在zone_sizes_init()函数中,会统计node和各个内存域所跨越的内存size和实际使用的内存size(region之间可能存在空洞)。这样把所有的页框纳入管理,同时还会初始化zone的各类锁,初始化usemap,初始化伙伴系统中使用的free_area[],初始化struct page数据结构等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
Linux的启动流程是一个复杂但有序的过程,主要分为几个关键步骤: 1. **BIOS/UEFI引导**:计算机开机时,硬件会先从BIOS(早期)或UEFI(现代)中加载操作系统引导程序,通常称为GRUB或Loader。 2. **加载启动加载器**:引导程序负责加载并执行操作系统的内核,如Linux kernel映像。 3. **内核初始化**:一旦内核被加载到内存,它开始执行,执行最初的启动脚本,初始化硬件,如CPU、内存、设备驱动等。 4. **模块加载和检测**:内核根据配置加载必要的模块,确保系统组件和服务可用。 5. **根文件系统挂载**:内核查找并挂载预定义的根文件系统(通常是ext4或btrfs),这提供了系统的实际运行环境。 6. **运行init进程**:在早期版本的Linux中,`init`进程是第一个运行的服务,现在的大多数系统使用`systemd`或`upstart`等初始化系统替换它,这些系统管理服务的启动和运行。 7. **启动脚本和服务管理**:初始化系统启动一系列服务,包括网络、日志、用户登陆管理等。用户可以通过登录界面访问系统。 8. **运行用户空间程序**:最后,shell(如bash)或其他登录管理工具出现,允许用户交互式地控制系统。 相关问题: 1. BIOS/UEFI引导过程如何确保引导的是正确的操作系统? 2. Linux内核在初始化期间都做了哪些核心设置? 3. 为什么要在启动过程中挂载文件系统?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值