深入解析Linux内核初始化过程

5星 · 超过95%的资源 需积分: 0 495 下载量 47 浏览量 更新于2024-07-31 8 收藏 1.4MB PDF 举报
"疯狂内核之——内核初始化" 在深入探讨Linux内核初始化的过程中,我们需要了解从硬件上电到操作系统完全启动的整个流程。本文主要分为五个部分,详细阐述了内核从创建到运行的各个关键阶段。 1. **引子**: - **上电**:计算机电源开启后,硬件开始进行自检(POST),然后进入基本输入输出系统(BIOS)。 - **BIOS时代**:BIOS执行硬件初始化,并根据用户设置加载启动设备的引导程序。 - **内核引导程序**:引导程序负责加载内核映像到内存并准备执行,如GRUB或LILO。 2. **内核映像的形成**: - **Makefile预备知识**:介绍了Makefile的书写规则、变量、条件判断、函数以及隐含规则和模式规则,这些都是构建内核的构建工具KBuild的基础。 - **KBuild体系**:讲解内核目标、主机程序和编译标志,以及如何通过Makefile进行递归编译、链接内核镜像(vmlinux)和制作可引导的bzImage。 3. **实模式下的内核代码**: - **内核映像内存布局**:内核映像在内存中的分布,包括不同部分如引导扇区、初始化数据等。 - **header.S**:实模式下的汇编代码,包括无用的bootsect代码,初始化头变量,为C语言环境做准备。 - **main函数**:实模式下的主要入口点,涉及复制初始化头变量,初始化堆,CPU支持检查,BIOS模式设置,内存检测,键盘配置,系统环境表填充,IST信息设置和视频模式设置。 - **go_to_protected_mode**:转换到保护模式的关键函数,包括禁止中断,打开A20线,安装临时GDT,以及第一次启动保护模式。 4. **保护模式下的内核代码**: - **32位x86保护模式**:内核解压缩前期工作,解压缩内核,第二次启动保护模式,首次启用分页管理和初始化0号进程。 - **向start_kernel进发**:涉及中断描述符表初始化,第三次启动保护模式,启动x86虚拟机。 5. **走向现代:start_kernel函数**: - **初始化同步与互斥环境**:包括中断屏蔽,大内核锁,时钟通知链,激活第一个CPU,地址散列,打印版本信息。 - **setup_arch**:拷贝可用内存区信息,计算总页面数,建立永久内核页表,二次启动分页,构建内存管理架构,以及其他初始化工作。 - **设置每CPU环境**,初始化内存管理区列表,使用early_res分配内存,初始化虚拟文件系统,异常服务,内存管理,调度程序,中断处理系统,包括APIC中断,本地软时钟,软中断,定时器中断等。 - **后start_kernel时代**:创建1号进程,子系统初始化,启动shell环境等,完成内核初始化的最后步骤。 本文详细阐述了从硬件启动到Linux内核完全初始化的复杂过程,涵盖从低级的实模式转换到保护模式,再到内核的高级功能初始化,为理解Linux内核的工作原理提供了深入洞察。对于想要深入研究操作系统内核设计和实现的读者来说,这是一份非常有价值的参考资料。