Linux内核如何装载和启动一个可执行程序
-
BIOS/UEFI阶段:
- BIOS(Basic Input/Output System): 在传统的 BIOS 系统中,计算机开机后首先加载 BIOS,然后 BIOS 将控制权传递给引导设备上的引导扇区(boot sector)。
- UEFI(Unified Extensible Firmware Interface): 在现代系统中,通常使用 UEFI 替代 BIOS。UEFI启动的过程与BIOS类似,但有一些关键的不同之处。
-
引导加载程序阶段:
- GRUB(GRand Unified Bootloader): 在许多 Linux 系统中,GRUB 是常用的引导加载程序。它的任务是加载操作系统内核。GRUB 被安装在引导分区的引导扇区上,它能够理解文件系统并定位并加载内核。
-
Linux内核启动:
- 内核镜像: GRUB 会加载操作系统内核的镜像,通常是位于文件系统中的
/boot
目录下的vmlinuz
文件。 - 初始化内核: 内核开始执行,并初始化硬件、文件系统等必要的组件。
- 启动初始化进程: 内核在启动时会启动一个用户空间的初始化进程,通常是
init
或者现代系统中的systemd
。
- 内核镜像: GRUB 会加载操作系统内核的镜像,通常是位于文件系统中的
-
用户空间初始化:
- 系统初始化: 初始化进程负责启动系统中的其他进程和服务。
- 用户登录: 一旦系统初始化完成,用户登录界面就会出现,用户可以登录到系统中。
程序编译
程序从源代码到可执行文件的步骤:预处理、编译、汇编、衔接--以hello.c为例。
预处理: gcc -E hello.c -o hello.i -m32
编译:gcc -S hello.i -o hello.s -m32
汇编:gcc -c hello.s -o hello.o -m32
默认衔接(动态库):gcc hello.o -o hello -m32
衔接静态库:gcc hello.o -o hello.static -m32 -static