当前位置:首页>Linux>Linux实验系统整体架构理解

Linux实验系统整体架构理解

  • 2026-10-11 05:50:56
Linux实验系统整体架构理解

Linux实验系统整体架构理解

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系统不是一个程序

 Linux 系统完整结构:

+--------------------------------+
|          用户程序               |
|                                |
|  ls   ps   bash   vim           |
+--------------------------------+

             |
             |
             v

+--------------------------------+
|          用户空间               |
|                                |
|  BusyBox                       |
|  glibc                         |
|  init                          |
+--------------------------------+

             |
             |
             v

+--------------------------------+
|          Linux Kernel           |
|                                |
| 调度                           |
| 内存管理                       |
| 文件系统                       |
| 网络                           |
| 驱动                           |
+--------------------------------+

             |
             |
             v

+--------------------------------+
|          硬件                   |
+--------------------------------+

Kernel负责什么

Linux Kernel主要负责:

  1. CPU管理/进程管理:进程调度kernel/sched.c

  2. 内存管理:虚拟地址->页表->物理地址 mm/

  3. 文件系统:cat test.txt cat->系统调用->kernel->文件系统模块->磁盘驱动->硬件

  4. 设备管理:键盘->驱动->kernel->应用程序 drivers/

  5. 网络

Kernel为什么不能直接使用

编译产物:bzImage。

启动:QEMU-> kernel启动

命令:ls -> command not found

原因:kernel里面没有 ls bash cat ps 用户空间程序,所以需要Busybox。BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。

bzImage、vmlinux关系

编译过程

源码

 |
 |
 v

大量.o文件

 |
 |
 v

vmlinux

 |
 |
 v

压缩

 |
 |
 v

bzImage

vmlinux是什么

未压缩Linux Kernel。包含符号信息,调试信息,函数名称,变量地址。

bzImage是什么

给机器启动使用的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

initramfs 和 rootfs详细理解

为什么需要rootfs

kernel启动以后需要运行init,kernel没有init所以需要root filesystem。

rootfs是什么

实际上就是linux跟目录.

rootfs

|
+--bin
|   |
|   +--ls
|
+--etc
|
+--proc
|
+--sys
|
+--init

initramfs制作过程

# 制作命令:find . | cpio -o -H newc | gzip > rootfs.img
# 获取所有文件 ./init ./bin/busybox ./etc
# cpio打包类似tar
# gzip压缩最终rootfs.img

kernel启动rootfs过程

QEMU

 |
 |
启动kernel

 |
 |
kernel初始化内存

 |
 |
加载initramfs

 |
 |
解压到内存

 |
 |
切换根目录

 |
 |
执行/init

 |
 |
用户空间启动

BusyBox详细理解

为什么使用BusyBox

普通linux

/bin
ls  500KB
cat 300KB
cp ...
mv ...
sh ...
# 每个都是程序。
# 嵌入式系统,空间有限。BusyBox设计提供多个命令
# /bin/busybox
main()

 |
 |
判断argv[0]

 |
 |
调用对应功能

init程序详细分析

Linux启动后第一个用户空间程序。PID=1。

启动关系:

kernel

 |

kernel_init()

 |

execve()

 |

/init

 |

PID 1

为什么必须有init

如果/init不存在,kernel panic No init found/Attempted to kill init.Linux认为用户空间无法启动。

一个复杂操作系统必须有一个“用户空间根节点”,负责启动、组织和回收整个用户空间。

Kernel 负责“提供运行环境”,init 负责“启动和管理这个环境中的所有用户程序”。

当前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

最新文章

随机文章