Linux内核学习——内核启动流程
Linux 内核源码版本:6.6LTS
总体而言,内核的启动可以概括为下面几个步骤:
- 实模式的入口函数
_start:在header.S中,这里会进入main函数,它复制bootloader的各个参数,执行基本硬件设置,解析命令行参数。 - 保护模式的入口函数
startup_32:在compressed/header_32.S中,这里会解压bzImage内核映像,加载vmlinux内核文件 - 内核入口函数
startup_32:在kernel/header_32.S中,这就是所谓的进程0,它会进入体系结构无关的start_kernel函数,即Linux内核启动函数。start_kernel会做大量的内核初始化操作,解析内核启动的命令行参数,并启动一个内核线程来完成内核模块初始化的过程,然后进入空闲循环 - 内核模块初始化的入口函数
kernel_init:在init/main.c中,这里会启动内核模块,创建基于内存的rootfs、加载initramfs文件或者cpio-initrd,并启动一个内核线程来运行启动的\init脚本,完成真正的根文件系统的挂载 - 根文件系统挂载脚本
/init:这里会挂载根文件系统、运行\sbin\init,从而启动进程1。 - init进程的系统初始化过程:执行相关脚本,以完成系统初始化,例如设置键盘、字体、加载模块、设置网络等,最后运行登陆程序
flowchart TD
A[CPU上电]--> B[从CS:IP=FFFF:0000入口处载入BIOS]
B --> C[载入GRUB到0x07C00处
通过中断0x19]
C --> D[载入内核镜像vmlinuz]
D --> E[实模式入口函数
head.o偏移512处
arch/x86/boot/header.S:_start]
E-->F[实模式main函数:arch/x86/boot/main.c:main
arch/x86/boot/pm.c:go_to_protected_mode
arch/x86/boot/pmjump.S:protected_mode_jump]
F-->G[保护模式内核入口函数 0x100000处
/arch/x86/boot/compressed/head_32.S:startup_32
/arch/x86/kernel/head_32.S:startup_32
arch/x86/kernel/head_32.c:i386_start_kernel]
G-->H[Linux 内核启动函数 体系结构无关
init/main.c:start_kernel]
H-->I[创建内存rootfs
fs/dcache.c:vfs_caches_init
fs/namespace.c:mnt_init]
I-->J[内核初始化函数
init/main.c:reset_init
init/main.c:kernel_init]
J-->K[载入RAM磁盘
init/initramfs.c:populated_rootfs]
K-->L[cpio-initrd]
L-->M[init]
M-->N[运行/init脚本
init/main.c:init_post\n init/main.c:run_init_process]
K-->O[image-initrd]
O-->P[init/do_mounts.c:prepare_namespace]
P-->Q[linuxrc]
Q-->R[检测并挂载procfs, sysfs: /proc/mounts
读取/proc/cmdline
启动udev:udevd-daemon]
N-->R
R-->S[从/etc/fstab挂载硬盘各个分区
挂载真正根文件系统启动用户空间的/sbin/init]

浙公网安备 33010602011771号