热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《linux内核完全剖析》第六章引导启动程序笔记

1、简介引导启动程序部分主要在boot子目录下,该目录包含三个汇编代码文件bootsect.S、head.S和setup.S。由于目前没有对汇编进行系统的学习&#x

1、简介


引导启动程序部分主要在boot/子目录下,该目录包含三个汇编代码文件bootsect.S、head.S和setup.S。由于目前没有对汇编进行系统的学习,所以本文不对代码细节实现做讲解,主要描述代码的功能。


2、操作系统启动执行流程


PC电源打开后,80x86结构CPU进入实模式,从地址0xFFFF0执行程序代码,这个地址通常是BIOS中的地址。随后BIOS开始执行系统检测,在物理地址0处开始初始化中断向量,然后BIOS将启动设备的第一个扇区读入内存绝对地址0x7C00处,并跳转到此处。

                                                                               从系统加电起所执行程序的顺序


3、bootsect.S程序功能描述


bootsect.S代码是磁盘引导块程序,驻留在磁盘的第一个扇区中,bootsect代码执行期间,它会将自己移动到内存绝对地址0x90000开始处并继续执行。该程序把从磁盘的第二个扇区开始的四个扇区的setup模块(setup.S编译而成)加载到内存紧接着bootsect后面位置处(0x90200),然后利用BIOS中断0x13取磁盘参数表中当前启动引导盘的参数,在屏幕上显示“Loading system...”字符串。再把磁盘上setup模块后面的system模块加载到内存0x10000开始的地方。随后确定根文件系统的设备号,如果没有指定,则根据所保存的引导盘的每磁道扇区数判别出盘的类型和种类并保存设备号于root_dev(引导块的508地址处)中最后长跳转到setup程序开始处(0x90200)去执行setup程序。磁盘上,引导块、setup模块和system模块的扇区位置如下。

                                                                    Linux 0.12 内核在 1.44MB 磁盘上的分布情况


4、setup.S程序功能描述


setup是一个操作系统加载程序,它利用BIOS中断读取机器系统数据并把数据保存到0x90000开始的位置(覆盖了bootsect程序的位置)。然后setup程序把system模块从0x10000~0x8ffff整块下移到内存绝对地址0x00000处。接下来加载中断描述符标寄存器(idtr)和全局描述符表寄存器(gdtr),开启A20地址线,重新设置两个中断控制芯片8259A,把硬件中断号重新设置为0x20~0x2f。最后设置cpu的控制寄存器CR0,进入32位保护模式运行,并跳转到位于system模块最前面部分的head.s程序继续运行。


5、head.s程序功能描述


head.s程序在被编译生成目标文件后会与内核其他程序一起被链接成system模块,位于system模块的最前面开始部分。从这里开始,内核完全都是在保护模式下运行了。这段程序位于内存绝对地址0处开始的地方。head.s程序功能单一,首先加载各个数据段寄存器,重新设置中断描述符表idt,共256项,并使各个表项都指向一个只报错误的哑中断子程序ignore_int。然后重新设置全局段描述符表gdt,只是修改gdt的段限长。接着使用物理地址0与1MB开始处的字节内容相比较的方法,检测A20地址线是否开启。接着设置管理内存的分页处理机制,把页目录表放在绝对物理地址0开始处,紧随后面放置共可寻址16MB内存的4个页表并设置它们的表项。最后head.s程序利用返回指令把预先放置在堆栈中的/init/main.c程序的入口地址弹出,去运行main()程序。


推荐阅读
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 本文探讨了Linux环境下线程私有数据(Thread-Specific Data, TSD)的概念及其重要性,介绍了如何通过TSD技术避免多线程间全局变量冲突的问题,并提供了具体的实现方法和示例代码。 ... [详细]
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • 本文通过分析一个具体的案例,探讨了64位Linux系统对32位应用程序的兼容性问题。案例涉及OpenVPN客户端在64位系统上的异常行为,通过逐步排查和代码测试,最终定位到了与TUN/TAP设备相关的系统调用兼容性问题。 ... [详细]
  • 对象存储与块存储、文件存储等对比
    看到一篇文档,讲对象存储,好奇,搜索文章,摘抄,学习记录!背景:传统存储在面对海量非结构化数据时,在存储、分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结 ... [详细]
  • Java中提取字符串的最后一部分
    本文介绍了如何使用Java中的substring()和split()方法来提取字符串的最后一部分,特别是在处理包含特殊字符的路径时的方法与技巧。 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • 本文分享了作者在使用LaTeX过程中的几点心得,涵盖了从文档编辑、代码高亮、图形绘制到3D模型展示等多个方面的内容。适合希望深入了解LaTeX高级功能的用户。 ... [详细]
  • 想把一组chara[4096]的数组拷贝到shortb[6][256]中,尝试过用循环移位的方式,还用中间变量shortc[2048]的方式。得出的结论:1.移位方式效率最低2. ... [详细]
  • 本文详细介绍了在 Red Hat Linux 系统上安装 GCC 4.4.2 的步骤,包括必要的依赖库的安装及常见问题的解决方法。 ... [详细]
  • 本文详细介绍了Linux系统中信号量的相关函数,包括sem_init、sem_wait、sem_post和sem_destroy,解释了它们的功能和使用方法,并提供了示例代码。 ... [详细]
  • 本文详细介绍了在Linux操作系统上安装和部署MySQL数据库的过程,包括必要的环境准备、安装步骤、配置优化及安全设置等内容。 ... [详细]
  • 本文介绍了在Linux环境下如何有效返回命令行状态、上一级目录及快速查找头文件和函数定义的方法。包括处理长时间运行命令、编辑器退出技巧、目录导航以及文件搜索策略。 ... [详细]
  • 汇编语言:编程世界的始祖,连C语言都敬畏三分!
    当C语言还在萌芽阶段时,它首次接触到了汇编语言,并对其简洁性感到震惊。尽管汇编语言的指令极其简单,但它却是所有现代编程语言的基础,其重要性不言而喻。 ... [详细]
  • Linux环境下MySQL的安装与配置
    本文详细介绍了在Linux系统上安装和配置MySQL的步骤,包括安装前的准备工作、下载和解压安装包、初始化数据库、配置文件编辑、启动服务以及设置开机自启动等。 ... [详细]
author-avatar
小文662502914775
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有