Linux内核学习——内核启动流程

Linux 内核源码版本:6.6LTS
总体而言,内核的启动可以概括为下面几个步骤:

  1. 实模式的入口函数_start:在header.S中,这里会进入main函数,它复制bootloader的各个参数,执行基本硬件设置,解析命令行参数。
  2. 保护模式的入口函数startup_32:在compressed/header_32.S中,这里会解压bzImage内核映像,加载vmlinux内核文件
  3. 内核入口函数startup_32:在kernel/header_32.S中,这就是所谓的进程0,它会进入体系结构无关的start_kernel函数,即Linux内核启动函数。start_kernel会做大量的内核初始化操作,解析内核启动的命令行参数,并启动一个内核线程来完成内核模块初始化的过程,然后进入空闲循环
  4. 内核模块初始化的入口函数kernel_init:在init/main.c中,这里会启动内核模块,创建基于内存的rootfs、加载initramfs文件或者cpio-initrd,并启动一个内核线程来运行启动的\init脚本,完成真正的根文件系统的挂载
  5. 根文件系统挂载脚本/init:这里会挂载根文件系统、运行\sbin\init,从而启动进程1。
  6. 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]
posted @ 2026-02-26 19:12  main_c  阅读(11)  评论(0)    收藏  举报  来源