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研究相关推荐

  1. Linux内核如何装载和启动一个可执行程序-----实验7

    2015108 李泽源 Linux内核如何装载和启动一个可执行程序 理解编译链接的过程和ELF可执行文件格式,详细内容参考本周第一节: 编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程 ...

  2. 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 贡献 ...

  3. linux越狱amd卡代码,为Linux内核贡献27.5万行代码中:AMD意外泄漏下一代APU信息

    原标题:为Linux内核贡献27.5万行代码中:AMD意外泄漏下一代APU信息 AMD在不经意间泄露了自家下一代APU的信息,其代号"Van Gogh(梵高)". 据外媒报道称,A ...

  4. Linux入职基础-4.10_系统启动过程(3):Linux内核(vmlinuz)启动

    Linux系统启动过程(3):Linux内核(vmlinuz)启动 上节回顾:详解见上一篇<内核的引导程序>,内核模块在获取控制权后开始工作,内核(vmlinuz-2.6.18-238.e ...

  5. 编译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 ...

  6. 武汉linux内核好找吗,Linux内核入门

    Linux内核入门 收藏 如何获取Linux内核源代码 下载Linux内核当然要去http://www.kernel.org/了,网站提供了两种文件下载,一种是完整的Linux内核,另一种是内核增量补 ...

  7. 编译Linux内核没有zImage,Linux 编译系统的简单介绍与内核编译安装

    这里不只是讲怎样编译.安装Linux内核的,更主要的是介绍内核的编译系统和各个重要的文件.最后还利用学到的编译.安装Linux内核去修改Linux的01调度变成随机调度.如果你只是需要编译.安装内核的 ...

  8. linux 内核 课程,Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频教 ......

    课程名称 Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频 课程目录 (1)\1, 计算机是如何工作的?:目录中文件数:0个 (2)\2, 操作系统 ...

  9. linux内核单步调试,linux内核调试之KDB(1)

    说到linux调试人们第一想到的就是GDB,GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,想必大家都比较熟悉,但是在调试模块时缺少一些至关重要的功能,它可用来查看内核的运行情况,包括 ...

  10. 2021-10-16python笔记(Linux内核简介与Linux基础命令)

    前面的博文已经教会了大家如何下载和安装Linux操作系统,并且使用Xshell软件远程连接Linux服务器,这节课我们要进入真正的Linux基础学习中. 知识点概括: 1.Linux的心脏-Linux ...

最新文章

  1. 如何判断 cxgrid 双击了哪一列_唐卡的价值主要体现在哪 如何判断唐卡的价值
  2. Exchange2010SP1配置OWA下次登录时更改密码提醒
  3. 帝国cms后台模板编辑器辅助增强插件代码高亮格式化显示
  4. Android动态加载黑科技 动态创建Activity模式
  5. apache2启动和停止操作
  6. SpringBoot2.1.9 分布式锁ShedLock
  7. [Swift]LeetCode859. 亲密字符串 | Buddy Strings
  8. C/C++ 常见编程技巧!你学会了吗?
  9. Python基础学习篇-2-数值运算和字符串
  10. [Android疑难杂症]动态设置TextView的width不起作用
  11. sql server的数据同步
  12. 回溯算法与八皇后问题
  13. 2.妙用 register_shutdown_function和fastcgi_finish_request
  14. python谐音梗_谐 音 梗 生 成 器
  15. 计算机电路基础 - 1,计算机电路基础1.1.doc
  16. 亚马逊智能音箱无故发出笑声,多名用户被吓尿
  17. RabbitMQ安装后Web管理页面访问不了
  18. Spark2.x学习笔记:Spark SQL的SQL
  19. 反向代理和正向代理详解
  20. 阿诺德给物体加描边_【C4DtoA 27】Arnold渲染器: Toon shader 1/3

热门文章

  1. HttpWatch截取网页数据的工具以及介绍
  2. 面试之作用域链与闭包
  3. Kotlin难点解析:extension和this指针
  4. JSP具体条款——response对象
  5. 【TYVJ】1359 - 收入计划(二分)
  6. 关于伪静态网站的好处
  7. STM32F4读写内部FLASH【使用库函数】
  8. jsonp获取服务器数据的方式
  9. [Linux] 命令行工具
  10. 机器学习知识点(九)BP神经网络Java实现