Linux系统RISC-V架构启动流程分析之概述


典型的linux系统启动流程如上,但本文主要探讨的是OS的启动流程,opensbi,uboot暂不涉及。主要围绕arch/riscv/kernel/head.S进行分析。

_start
  j _start_kernel

_start_kernel
  arch init //关中断,关浮点检测,挑选一个主hart启动初始化序列
  clear bss//清除BSS
  setup_vm//为打开MMU做准备,fixmap映射,内核粗粒度映射,fdt映射
fixmap mapping
trampoline mapping
early Kernel mapping
映射的页表:粗粒度映射,只使用到PMD,不会用到PTE
            early_pg_dir[PTRS_PER_PGD]
trampoline_pmd[PTRS_PER_PMD]
early_pmd[PTRS_PER_PMD * NUM_EARLY_PMDS]

fixed mapping for fdt
虚拟地址是FIX_FDT, 将DBT的物理地址到填充fixmap_pte[PTRS_PER_PTE]

  Relocate
     使能MMU,切换到虚拟地址运行

  parse_dtb //解析设备树
     early_init_dt_scan
  start_kernel
start_kernel
   setup_arch
      setup_bootmem
     paging_init()
   trap_init //异常初始化
   mm_init //kernel 内存初始化
   sched_init //调度初始化
   early_irq_init //irq初始化
   init_IQR
   tick_init
   init_times //timer初始化
   hrtimer_init
   softirq_init
   time_init
   arch_call_rest_init
     rest_init
       pid = kernel_thread(kernel_init, NULL, CLONE_FS); 
         kernel_init
           kernel_init_freeable(); 
             prepare_namespace
               mount_root() //挂载根文件系统
         run_init_process(execute_command) //启动第一个应用进程

系统初始化的时候,有一个关键环节是使能MMU,而使能MMU就需要使用虚拟地址,那么就会遇到以下问题,如何解决了?
1.内存管理没准备好。
2.需要分配页表。
3.开了MMU后,分配的页表能够用虚拟地址访问,否则访问不了页表无法填充。
4.开了MMU后,要能够用虚拟地址访问内核代码,无法无法运行。
5.开了MMU后,能够用虚拟地址访问设备树,无法读取内核内存的相关信息。