linux内核 header.s,Linux启动代码header.S研究
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内核如何装载和启动一个可执行程序-----实验7
2015108 李泽源 Linux内核如何装载和启动一个可执行程序 理解编译链接的过程和ELF可执行文件格式,详细内容参考本周第一节: 编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程 ...
- linux内核5万行代码,[图]AMD为Linux内核贡献27.5万行代码 确认Van Gogh APU支持DDR5和VCN3...
原标题:[图]AMD为Linux内核贡献27.5万行代码 确认Van Gogh APU支持DDR5和VCN3 在本周五发布的补丁更新中,AMD 为下一代 Van Gogh APU 向 Linux 贡献 ...
- linux越狱amd卡代码,为Linux内核贡献27.5万行代码中:AMD意外泄漏下一代APU信息
原标题:为Linux内核贡献27.5万行代码中:AMD意外泄漏下一代APU信息 AMD在不经意间泄露了自家下一代APU的信息,其代号"Van Gogh(梵高)". 据外媒报道称,A ...
- Linux入职基础-4.10_系统启动过程(3):Linux内核(vmlinuz)启动
Linux系统启动过程(3):Linux内核(vmlinuz)启动 上节回顾:详解见上一篇<内核的引导程序>,内核模块在获取控制权后开始工作,内核(vmlinuz-2.6.18-238.e ...
- 编译3.0的linux内核,1-3-编译Linux内核
1-3-编译Linux内核 1.将Linux源码包拷贝到共享文件夹. 2.进入共享文件夹. 3.解压,命令#tar xvfj Kernel_3.0.8_TQ210_for_Linux_v2.2.tar ...
- 武汉linux内核好找吗,Linux内核入门
Linux内核入门 收藏 如何获取Linux内核源代码 下载Linux内核当然要去http://www.kernel.org/了,网站提供了两种文件下载,一种是完整的Linux内核,另一种是内核增量补 ...
- 编译Linux内核没有zImage,Linux 编译系统的简单介绍与内核编译安装
这里不只是讲怎样编译.安装Linux内核的,更主要的是介绍内核的编译系统和各个重要的文件.最后还利用学到的编译.安装Linux内核去修改Linux的01调度变成随机调度.如果你只是需要编译.安装内核的 ...
- linux 内核 课程,Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频教 ......
课程名称 Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频 课程目录 (1)\1, 计算机是如何工作的?:目录中文件数:0个 (2)\2, 操作系统 ...
- linux内核单步调试,linux内核调试之KDB(1)
说到linux调试人们第一想到的就是GDB,GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,想必大家都比较熟悉,但是在调试模块时缺少一些至关重要的功能,它可用来查看内核的运行情况,包括 ...
- 2021-10-16python笔记(Linux内核简介与Linux基础命令)
前面的博文已经教会了大家如何下载和安装Linux操作系统,并且使用Xshell软件远程连接Linux服务器,这节课我们要进入真正的Linux基础学习中. 知识点概括: 1.Linux的心脏-Linux ...
最新文章
- 如何判断 cxgrid 双击了哪一列_唐卡的价值主要体现在哪 如何判断唐卡的价值
- Exchange2010SP1配置OWA下次登录时更改密码提醒
- 帝国cms后台模板编辑器辅助增强插件代码高亮格式化显示
- Android动态加载黑科技 动态创建Activity模式
- apache2启动和停止操作
- SpringBoot2.1.9 分布式锁ShedLock
- [Swift]LeetCode859. 亲密字符串 | Buddy Strings
- C/C++ 常见编程技巧!你学会了吗?
- Python基础学习篇-2-数值运算和字符串
- [Android疑难杂症]动态设置TextView的width不起作用
- sql server的数据同步
- 回溯算法与八皇后问题
- 2.妙用 register_shutdown_function和fastcgi_finish_request
- python谐音梗_谐 音 梗 生 成 器
- 计算机电路基础 - 1,计算机电路基础1.1.doc
- 亚马逊智能音箱无故发出笑声,多名用户被吓尿
- RabbitMQ安装后Web管理页面访问不了
- Spark2.x学习笔记:Spark SQL的SQL
- 反向代理和正向代理详解
- 阿诺德给物体加描边_【C4DtoA 27】Arnold渲染器: Toon shader 1/3