Linux实验系统整体架构理解当前实验环境组成Linux系统不是一个程序Kernel负责什么Kernel为什么不能直接使用bzImage、vmlinux关系编译过程vmlinux是什么bzImage是什么initramfs 和 rootfs详细理解为什么需要rootfsrootfs是什么initramfs制作过程kernel启动rootfs过程BusyBox详细理解为什么使用BusyBoxinit程序详细分析为什么必须有init当前init解析
Windows 11
|
|
v
WSL2 Ubuntu 24.04
|
|
v
Docker Ubuntu 12.04
(编译环境)
|
|
+----------------+
| |
v v
Linux源码 BusyBox源码
|
|
v
bzImage
|
|
v
QEMU虚拟机器
|
|
v
Linux Kernel
|
|
v
initramfs
|
|
v
BusyBox
|
|
v
Shell
Linux 系统完整结构:
+--------------------------------+
| 用户程序 |
| |
| ls ps bash vim |
+--------------------------------+
|
|
v
+--------------------------------+
| 用户空间 |
| |
| BusyBox |
| glibc |
| init |
+--------------------------------+
|
|
v
+--------------------------------+
| Linux Kernel |
| |
| 调度 |
| 内存管理 |
| 文件系统 |
| 网络 |
| 驱动 |
+--------------------------------+
|
|
v
+--------------------------------+
| 硬件 |
+--------------------------------+
Linux Kernel主要负责:
CPU管理/进程管理:进程调度kernel/sched.c
内存管理:虚拟地址->页表->物理地址 mm/
文件系统:cat test.txt cat->系统调用->kernel->文件系统模块->磁盘驱动->硬件
设备管理:键盘->驱动->kernel->应用程序 drivers/
网络
编译产物:bzImage。
启动:QEMU-> kernel启动
命令:ls -> command not found
原因:kernel里面没有 ls bash cat ps 用户空间程序,所以需要Busybox。BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。
源码
|
|
v
大量.o文件
|
|
v
vmlinux
|
|
v
压缩
|
|
v
bzImage
未压缩Linux Kernel。包含符号信息,调试信息,函数名称,变量地址。
给机器启动使用的kernel镜像。
BIOS
|
bootloader
|
bzImage
|
解压
|
真正kernel
zjy@DESKTOP-NHUJSDK:~/kernel-lab/linux/linux-2.6.39/arch/x86/boot$ file bzImage
bzImage: Linux kernel x86 boot executable bzImage, version 2.6.39 (root@00a10c33df0a) #1 SMP Sun Jul 12 04:02:18 UTC 2026, RO-rootFS, root_dev 0X87, A
zjy@DESKTOP-NHUJSDK:~/kernel-lab/linux/linux-2.6.39$ file vmlinux
vmlinux: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=2b1d76e48a572b98adb70c69224a130b673f3cf1, with debug_id
kernel启动以后需要运行init,kernel没有init所以需要root filesystem。
实际上就是linux跟目录.
rootfs
|
+--bin
| |
| +--ls
|
+--etc
|
+--proc
|
+--sys
|
+--init
# 制作命令:find . | cpio -o -H newc | gzip > rootfs.img
# 获取所有文件 ./init ./bin/busybox ./etc
# cpio打包类似tar
# gzip压缩最终rootfs.img
QEMU
|
|
启动kernel
|
|
kernel初始化内存
|
|
加载initramfs
|
|
解压到内存
|
|
切换根目录
|
|
执行/init
|
|
用户空间启动
普通linux
/bin
ls 500KB
cat 300KB
cp ...
mv ...
sh ...
# 每个都是程序。
# 嵌入式系统,空间有限。BusyBox设计提供多个命令
# /bin/busybox
main()
|
|
判断argv[0]
|
|
调用对应功能
Linux启动后第一个用户空间程序。PID=1。
启动关系:
kernel
|
kernel_init()
|
execve()
|
/init
|
PID 1
如果/init不存在,kernel panic No init found/Attempted to kill init.Linux认为用户空间无法启动。
一个复杂操作系统必须有一个“用户空间根节点”,负责启动、组织和回收整个用户空间。
Kernel 负责“提供运行环境”,init 负责“启动和管理这个环境中的所有用户程序”。
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
echo"Linux 2.6.39 Boot Success"
exec /bin/sh
# 第一步启动shell解释器
# 第二步挂载proc
# 第三步挂载sysfs
# 第四步启动shell