本文参考了时光如刀的博客。https://blog.youkuaiyun.com/marshal_zsx/article/details/80225854
1、概述
本文从Linux内核启动开始分析,uboot部分只粗略讲解下。同时基于Mstar 平台系统。Android 8.0 Linux4.9.9。
Uboot:上电后通过汇编指令加载uboot引导程序,uboot将内核镜像从ROM 拷贝RAM后并加载。
Linux 启动过程中生成了三个重要的进程:idle进程(pid=0)、init进程(pid=1),kthreadd进程(pid = 2)。这三个进程是Linux内核的基 础,后面的所有进线程都是基于这个三个进程创建的。
idle进程是Linux系统第一个进程,也是init进程,kthreadd进程的父进程。
init进程是用户空间的第一个进程,也是用户空间所有进程的父进程。
kthreadd进程是内核一个守护进程,也是内核所有线程的父进程。
2、idle进程
idle进程的启动是有汇编编写的。文件是Kernel\arch\arm64\kernel\head.S
#ifdef CONFIG_RANDOMIZE_BASE
tst x23, ~(MIN_KIMG_ALIGN - 1) // already running randomized?
b.ne 0f
mov x0, x21 // pass FDT address in x0
mov x1, x23 // pass modulo offset in x1
bl kaslr_early_init // parse FDT for KASLR options
cbz x0, 0f // KASLR disabled? just proceed
orr x23, x23, x0 // record KASLR offset
ldp x29, x30, [sp], #16 // we must enable KASLR, return
ret // to __primary_switch()
0:
#endif
b start_kernel //b 跳转 start_ke