Linux内核初始化详解:从合成映像到init线程

需积分: 16 3 下载量 73 浏览量 更新于2024-07-24 收藏 3.43MB PDF 举报
内核初始化是嵌入式操作系统中至关重要的一环,特别是在Linux内核中。本文档详细介绍了这个过程,旨在帮助初学者理解内核如何在系统启动时逐步建立和配置。首先,系统加电后,引导装载程序会接管处理器,执行基础硬件初始化,然后将控制权转移给Linux内核。这个阶段包括以下几个关键步骤: 1. 合成内核映像:引导程序完成后,Linux内核的映像通常通过piggybacking技术(利用现有固件或引导加载程序的基础设施加载)来合成,这是一种节省存储空间和简化加载过程的方法。 2. 初始化控制流:内核初始化时,控制流的设置开始,这涉及到设定初始化函数的顺序,确保关键任务如内存管理和中断处理得到正确的初始化。 3. 内核命令行处理:在这个阶段,内核解析命令行参数,这些参数可能包含系统配置选项或特定服务的启动请求。 4. 子系统初始化:核心子系统,如内存管理、进程管理、文件系统、网络等,按照预设的顺序进行初始化,确保操作系统的基本功能正常运行。 5. init线程:init进程,也称为守护进程或初始化进程,负责启动其他必要的服务和进程,它是系统启动过程中至关重要的组成部分,确保后续操作的顺利进行。 文章还讨论了Linux内核的结构,包括其作为操作系统的一部分,由内核、设备驱动程序、启动引导程序和用户界面等组件构成。内核作为核心部分,负责处理系统调用和底层硬件交互,而设备驱动程序则确保硬件设备与操作系统之间的无缝连接。此外,内核和用户空间之间的关系也得到了阐述,它们通过权限划分(内核空间和用户空间)以及系统调用机制来实现安全和高效的操作。 总结来说,内核初始化是一个复杂但有序的过程,涉及多个层次的协作,从硬件兼容性到功能模块的加载,再到核心服务的启动,都是为了构建一个稳定、可扩展的嵌入式操作系统环境。理解和掌握这个过程对于深入理解操作系统内部工作原理至关重要。
2011-05-30 上传
目录 1 引子 2 1.1 上电 2 1.2 BIOS时代 3 1.3 内核引导程序 5 2 内核映像的形成 8 2.1 MakeFile预备知识 9 2.1.1 Makefile书写规则 9 2.1.2 Makefile变量 10 2.1.3 条件判断 14 2.1.4 函数 17 2.1.5 隐含规则 17 2.1.6 定义模式规则 19 2.1 KBuild体系 23 2.1.1 内核目标 24 2.1.2 主机程序 26 2.1.3 编译标志 27 2.2 内核编译分析 28 2.2.1 编译配置 29 2.2.2 寻找第一个目标 32 2.2.3 prepare和scripts目标 38 2.2.4 递归编译各对象 41 2.2.5 链接vmlinux 44 2.2.6 制作bzImage 50 3 实模式下的内核代码 57 3.1 内核映像内存布局 58 3.2 实模式汇编代码header.S 60 3.2.1 无用的bootsect代码 60 3.2.2 初始化头变量hdr 63 3.2.3 准备实模式下C语言环境 64 3.3 实模式代码main函数 69 3.3.1 复制初始化头变量 71 3.3.2 初始化堆 74 3.3.3 确保支持当前运行的CPU 75 3.3.4 设置BIOS的x86模式 76 3.3.5 内存的检测 78 3.3.6 设置键盘属性 81 3.3.7 填充系统环境配置表 82 3.3.8 填充IST信息 83 3.3.9 设置Video模式 83 3.4 实模式代码go_to_proteced_mode函数 91 3.4.1 禁止可屏蔽和不可屏蔽中断 92 3.4.2 打开A20地址线 93 3.4.3 安装临时全局描述符表 99 3.4.4 第一次启动保护模式 101 4 保护模式下的内核代码 107 4.1 32位x86保护模式代码 107 4.1.1 内核解压缩的前期工作 108 4.1.2 解压缩内核 111 4.1.3 第二次启动保护模式 121 4.1.4 第一次启动分页管理 124 4.1.5 初始化0号进程 128 4.2 向start_kernel进发 131 4.2.1 初始化中断描述符表 132 4.2.2 第三次启动保护模式 137 4.2.3 启动x86虚拟机 141 5 走向现代:start_kernel函数 144 5.1 初始化同步与互斥环境 148 5.1.1 屏蔽中断 148 5.1.2 启动大内核锁 152 5.1.3 注册时钟通知链 153 5.1.4 激活第一个CPU 155 5.1.5 初始化地址散列表 160 5.1.6 打印版本信息 161 5.2 执行setup_arch()函数 166 5.2.1 拷贝可用内存区信息 171 5.2.2 获得总页面数 175 5.2.3 着手建立永久内核页表 177 5.2.4 第二次启动分页管理 181 5.2.5 建立内存管理架构 186 5.2.6 添砖加瓦 192 5.3 设置每CPU环境 206 5.4 初始化内存管理区列表 211 5.5 利用early_res分配内存 214 5.6 触碰虚拟文件系统 223 5.7 初始化异常服务 224 5.8 初始化内存管理 230 5.8.1 启用伙伴算法 230 5.8.2 初始化slab分配器 241 5.8.3 初始化非连续内存区 250 5.9 初始化调度程序 251 5.10 初始化中断处理系统 256 5.10.1 设置APIC中断服务 256 5.10.2 初始化本地软时钟 264 5.10.3 软中断初始化 268 5.10.4 初始化定时器中断 271 5.11 走进start_kernel尾声 273 5.11.1 初始化slab的后续工作 273 5.11.2 启动console 275 5.11.3 一些简单的函数 276 5.11.4 校准CPU时钟速度 279 5.11.5 创建一些slab缓存 282 5.12 安装根文件系统 287 5.12.1 创建VFS相关slab缓存 288 5.12.2 安装rootfs 291 5.12.3 安装proc文件系统 296 6 后start_kernel时代 298 6.1 创建1号进程 298 6.2 子系统的初始化 306 6.3 启动shell环境 309