Linux启动代码header.S研究
来源:互联网 发布:知党史跟党走征文500 编辑:程序博客网 时间:2024/05/17 10:06
http://blog.csdn.net/luomoweilan/article/details/6085426
Linux内核从2.4升级到2.6之后,内核的引导过程发生了许多变化,现在研究一下Linux内核2.6版本的主要引导过程。
(参考资料:
1、《深入理解Linux内核》附录A;
2、Linux源码自带文档http://lxr.linux.no/linux+v2.6.36/Documentation/x86/boot.txt、
3、Linux源码header.S代码http://lxr.linux.no/linux+v2.6.36/arch/x86/boot/header.S
)
Linux内核2.6版本系统引导步骤:
1、开机执行BIOS代码,主要就是POST过程和初始化硬件设备;
2、BIOS代码运行结束后,BIOS把MBR(http://en.wikipedia.org/wiki/Master_boot_record)中的LILO第一部分代码(http://en.wikipedia.org/wiki/LILO_(boot_loader))和分区表加载到内存地址0X00007c00,最后跳转到LILO第一部分代码;
3、LILO第一部分代码把自己加载到内存地址0X00096a00,并在内存地址0X00098000处设置实模式堆栈,然后LILO把自己的第二部分代码加载到内存地址0X00096c00,最后跳转到LILO第二部分代码;
4、LILO第二部分代码把header.S(http://lxr.linux.no/linux+v2.6.36/arch/x86/boot/header.S)代码,一共两个512字节(boot sector和setup)分别加载到内存地址0X00090000和0X0009200,同时把Linux小内核映像加载到内存地址0X00010000或者Linux大内核映像加载到内存地址0X00100000,最后跳转到header.S代码的setup代码(240行);
5、header.S代码的setup过程调用main函数(http://lxr.linux.no/linux+v2.6.36/arch/x86/boot/main.c)(301行),最后跳转到main函数代码;
6、main函数设置临时的IDT表、GDT表、调用go_to_protected_mode()(http://lxr.linux.no/linux+v2.6.36/arch/x86/boot/pm.c#L104)函数(177行)进入保护模式,最后跳转到startup_32函数(http://lxr.linux.no/linux+v2.6.36/arch/x86/boot/compressed/head_32.S);
7、startup_32函数调用decompress_kernel()(http://lxr.linux.no/linux+v2.6.36/arch/x86/boot/compressed/misc.c)函数(151行)解压Linux内核映像到内存地址0X00100000,最后跳转到startup_32函数(http://lxr.linux.no/linux+v2.6.36/arch/x86/kernel/head_32.S);
8、startup_32函数为第一个进程0设置执行环境,包括初始化段寄存器、初始化内核页表、设置内核堆栈、加载GDT表、加载IDT表等,最后跳转到start_kernel()函数(http://lxr.linux.no/linux+v2.6.36/init/main.c#L536);
9、start_kernel函数完整的初始化了所有Linux内核,包括进程调度、内存管理、系统时间等,最后调用kernel_thread()(http://lxr.linux.no/linux+v2.6.36/arch/x86/kernel/process.c#L273)函数(437行)创建init进程;
10、init进程加载开机登录画面。
PS:
Linux内核2.4版本中内核自带引导程序bootsect.S文件,其作用相当于LILO,但是在2.6内核中,引导程序统一由LILO或GRUB等来管理系统的引导,所以在2.6内核中就没必要自带引导程序了,所以在2.6内核中把bootsect.S文件和setup.S文件合成一个文件header.S文件,header.S文件被编译成1K的代码,用来保存Linux/x86 boot protocol数据(参考Linux源码自带文档http://lxr.linux.no/linux+v2.6.36/Documentation/x86/boot.txt文件对Linux/x86 boot protocol的介绍),以及Linux内核代码的入口函数start_of_setup,这个入口函数由LILO指定跳转到start_of_setup函数。
- Linux启动代码header.S研究
- Linux启动代码header.S研究
- Linux Kernel 2.6.37 启动过程笔记 :Header.S
- Linux代码阅读之header.S(一)
- Linux启动代码boot.s理解
- ARM-----启动代码研究
- ARM启动代码研究
- linux-1.2.13之启动代码head.S
- linux 0.11 version 启动代码分析(bootsect.s)
- 【转】ARM启动代码研究
- mini2440init.s启动代码注释.
- startup_LPC11xx.s启动代码分析
- LPC2000 启动代码Start.s
- startup_stm32f10x_hd.s启动代码分析
- 在研究ARM Linux启动代码的时候顺手翻译了一下:
- linux内核启动head.s
- linux启动优化:mdev -s
- linux 内核代码研究-开篇
- qt creator inpaint 方法结果比较小工具
- 【iOS】iOS之viewcontroller详解
- Linux访问windows共享文件
- 浏阳河估值遭减半
- 数根
- Linux启动代码header.S研究
- Android底部弹出的View,可自定义布局
- 代码规范
- MFC 静态库链接 路径问题
- c语言学习注意
- 旧年人物之——王老虎
- 一些常见有用的图像视频资源链接
- android开发如何在不知道接口时,获取url---工具Fiddler
- Android标题栏上添加多个Menu按钮