文章目录

  • 介绍
  • 一、Bootloader
  • 1.总体流程
  • 二、Linux内核
  • 1.总体流程
  • 2.具体流程
  • 总结



介绍

Arm Linux 系统启动流程可分为四个部分:
1.引导加载程序(bootloader)
2.启动Linux 内核
3.挂载文件系统
4.等待应用程序执行

一、Bootloader

1.总体流程

Bootloader是系统上电后运行的第一段程序,主要做一些初始化任务,之后会将Flash中的Linux 内核拷贝到 RAM 中去,然后跳转到内核的第一条指令处继续执行,从而启动 Linux 内核.
大致步骤是初始化RAM->初始化串口->检测处理器类型->设置linux启动参数->调用Linux内核映像

二、Linux内核

1.总体流程

大致步骤流程:查找处理器内核类型和处理器类型->建立页表->跳转到 start_kernel()函数开始内核的初始化工作->调用 rest_init()函数创建系统的init 进程->挂载根文件系统->用cpu_idle()函数来使系统处于闲置(idle)状态并等待用户程序的执行

2.具体流程

Linux 内核的入口位于文件/arch/arm/kernel/head-armv.S 中的 stext 段。
该段的基地址就是bootloader的跳转地址。
该程序通过查找处理器内核类型和处理器类型调用相应的初始化函数(即获得处理器的 ID 号,RAM基地址,IO基地址等),
再(即将 RAM 基地址开始的 4M 空间的物理地址映射到 0xC0000000 开始的虚拟地址处),最后跳转到 start_kernel()函数开始内核的初始化工作

start_kernel是内核初始化的入口函数,它主要完成与硬件平台相关的初始化工作,该函数所做的具体工作有:
1.调用 setup_arch()函数进行内存结构的初始化,调用paging_init()开启 MMU,创建内核页表,映射所有的物理内存和 IO空间。
2.创建异常向量表和初始化中断处理函数;
3.初始化系统核心进程调度器和时钟中断处理机制;
4.初始化串口控制台(serial-console);
5.创建和初始化系统 cache,为各种内存调用机制提供缓存,包括;动态内存分配,虚拟文件系统(VirtualFile System)及页缓存。
6.初始化内存管理,检测内存大小及被内核占用的内存情况;
7.初始化系统的进程间通信机制(IPC);
8.调用 rest_init()函数创建系统的init 进程
9.Init 进程进行一系列的硬件初始化,然后通过命令行传递过来的参数挂载根文件系统。最后 init 进程会执行用 户传递过来的“init=”启动参数执行用户指定的命令
10.调用cpu_idle()函数来使系统处于闲置(idle)状态并等待用户程序的执行

总结

关于每个流程里面具体结构及做了什么事,可在具体的专栏中阅读