admin 管理员组

文章数量: 1087135


2024年6月9日发(作者:java 生成pom)

Linux Kernel学习笔记——启动

启动

当PC启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFFF0

处的代码,也就是ROM-BIOS起始位置的代码。BIOS先进行一系列的系统自检,然后初

始化位于地址0的中断向量表。最后BIOS将启动盘的第一个扇区装入到0x7C00,并开

始执行此处的代码.这就是对内核初始化过程的一个最简单的描述。

最初,Linux核心的最开始部分是用8086汇编语言编写的。当开始运行时,核心将

自己装入到绝对地址0x90000,再将其后的2k字节装入到地址0x90200处,最后将核心

的其余部分装入到0x10000。

当系统装入时,会显示信息。装入完成后,控制转向另一个实模式下的

汇编语言代码boot/Setup.S。Setup部分首先设置一些系统的硬件设备,然后将核心从

0x10000处移至0x1000处。这时系统转入保护模式,开始执行位于0x1000处的代码。

接下来是内核的解压缩。0x1000处的代码来自于文件Boot/head.S,它用来初始化

寄存器和调用decompress_kernel()程序。decompress_kernel( )程序由

Boot/inflate.c, Boot/unzip.c和Boot/misc.c组成。解压缩后的数据被装入到了

0x100000处,这也是Linux不能在内存小于2M的环境下运行的主要原因。

解压后的代码在0x1010000处开始执行,紧接着所有的32位的设置都将完成: IDT、

GDT和LDT将被装入,处理器初始化完毕,设置好内存页面,最终调用start_kernel过

程。这大概是整个内核中最为复杂的部分。

[系统开始运行]

Linux kernel最早的C代码从汇编标记startup_32开始执行

|startup_32:

|start_kernel

|lock_kernel

|trap_init

|init_IRQ

|sched_init

|softirq_init

|time_init

|console_init

|#ifdef CONFIG_MODULES

|init_modules

|#endif

|kmem_cache_init

|sti

|calibrate_delay

|mem_init

|kmem_cache_sizes_init

|pgtable_cache_init

|fork_init


本文标签: 装入 代码 开始 系统 执行