Linux的启动过程分析

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

嵌入式系统期中大作业题目:Linux的启动过程分析学院:信息工程专业:网络工程姓名:梁法成学号:2013240701282016.4.15共15页第1页目录1.从开机加电到执行main函数之前的过程..............................................................................................21.1启动BIOS,准备实模式下的中断向量表和中断服务程序.....................................................21.1.1BIOS的启动原理.............................................................................................................21.1.2BIOS在内存中加载中断向量表和中断服务程序.........................................................21.2加载操作系统内核程序并为保护模式做准备..........................................................................31.2.1加载第一部分内核代码——引导程序(bootsect)..................................................31.2.2加载第二部分内核代码——setup................................................................................31.2.3.加载第三部分内核代码——system模块.....................................................................51.3开始向32位模式转变,为main函数的调用做准备..............................................................51.3.1关中断并将system移动到内存地址起始位置0x00000.............................................61.3.2设置中断描述符表和全局描述符表..............................................................................61.3.3打开A20,实现32位寻址.............................................................................................71.3.4为保护模式下执行head.s做准备................................................................................71.3.5head.s开始执行.............................................................................................................72.从main到怠速.........................................................................................................................................92.1设备环境初始化及激活进程0.................................................................................................102.1.1与建立人机交互界面相关的外设的中断服务程序挂接............................................102.1.2初始化进程0...............................................................................................................102.1.3初始化硬盘..................................................................................................................112.1.4开启中断......................................................................................................................112.2进程1的创建及执行..............................................................................................................122.2.1进程0创建进程1.......................................................................................................122.2.2内核第一次做进程调度..............................................................................................122.2.3轮转到进程1执行......................................................................................................132.3进程2的创建及执行..............................................................................................................132.3.1、打开终端设备文件及复制文件句柄..........................................................................132.3.2、进程1创建进程2并切换到进程2...........................................................................132.3.3、加载shell程序..........................................................................................................132.3.4、实现系统怠速..............................................................................................................14共15页第2页1.从开机加电到执行main函数之前的过程从开机到main函数的执行分三步完成,目的是实现从启动盘加载操作系统程序,完成执行main函数所需要的准备工作。第一步,启动BIOS,准备实模式下的中断向量表和中断服务程序;第二步,从启动盘加载操作系统程序到内存,加载操作系统程序的工作就是利用第一步中准备的中断服务程序实现的;第三步,为执行32位的main函数做过渡工作。本章将详细分析这三步在计算机中是如何完成的,以及每一步在内存中都做了些什么。1.1启动BIOS,准备实模式下的中断向量表和中断服务程序问题:在RAM中什么程序也没有的时候,谁来完成加载软盘中操作系统的任务呢?答案是:BIOS。1.1.1BIOS的启动原理从硬件角度看,Intel80x86系列的CPU可以分别在16位实模式和32位保护模式下运行。为了兼容,也为了解决最开始的启动问题,Intel将所有80x86系列的CPU,包括最新型号的CPU的硬件都设计为加电即进入16位实模式状态运行。同时,还有一点非常关键的是,将CPU硬件逻辑设计为加电瞬间强行将CS的值置为0xF000、IP的值置为0xFFF0,这样CS:IP就指向0xFFFF0这个地址位置。1.1.2BIOS在内存中加载中断向量表和中断服务程序BIOS程序在内存最开始的位置(0x00000)用1KB的内存空间(0x00000~0x003FF)构建中断向量表,在紧挨着它的位置用256字节的内存空间构建BIOS数据区(0x00400~0x004FF),并在大约57KB以后的位置(0x0E05B)加载了8KB左共15页第3页右的与中断向量表相应的若干中断服务程序。中断向量表中有256个中断向量,每个中断向量占4字节,其中两个字节是CS的值,两个字节是IP的值。每个中断向量都指向一个具体的中断服务程序。1.2加载操作系统内核程序并为保护模式做准备从现在开始,就要执行真正的boot操作了,即把软盘中的操作系统程序加载至内存。对于Linux0.11操作系统而言,计算机将分三批逐次加载操作系统的内核代码。第一批由BIOS中断int0x19把第一扇区bootsect的内容加载到内存;第二批、第三批在bootsect的指挥下,分别把其后的4个扇区和随后的240个扇区的内容加载至内存。1.2.1加载第一部分内核代码——引导程序(bootsect)经过执行一系列BIOS代码之后,计算机完成了自检等操作(这些和我们讲的启动操作系统没有直接的关系,读者不必关心)。由于我们把软盘设置为启动设备,计算机硬件体系结构的设计与BIOS联手操作,会让CPU接收到一个int0x19中断。CPU接收到这个中断后,会立即在中断向量表中找到int0x19中断向量。接下来,中断向量把CPU指向0x0E6F2,这个位置就是int0x19相对应的中断服务程序的入口地址。这个中断服务程序的作用就是把软盘第一扇区中的程序(512B)加载到内存中的指定位置。这个中断服务程序的功能是BIOS事先设计好的,代码是固定的,与Linux操作系统无关。无论Linux0.11的内核是如何设计的,这段BIOS程序所要做的就是“找到软盘”并“加载第一扇区”,其余的它什么都不知道,也不必知道。按照这个简单、“生硬”的规则,int0x19中断向量所指向的中断服务程序,即启动加载服务程序,将软驱0号磁头对应盘面的0磁道1扇区的内容复制至内存0x07C00处。1.2.2加载第二部分内核代码——setupbootsect对内存的规划BIOS已经把bootsect也就是引导程序载入内存了,现在共15页第4页它的作用就是把第二批和第三批程序陆续加载到内存中。为了把第二批和第三批程序加载到内存中的适当位置,bootsect首先做的工作就是规划内存。通常,我们是用高级语言编写应用程序的,这些程序是在操作系统的平台上运行的。我们只管写高级语言的代码、数据。至于这些代码、数据在运行的时候放在内存的什么地方,是否会相互覆盖,我们都不用操心,因为操作系统和高级语言的编译器替我们做了大量的看护工作,确保不会出错。现在我们讨论的是,操作系统本身使用的是汇编语言,没有高级语言编译器替操作系统提供保障,只有靠操作系统的设计者把内存的安排想清楚,确保无论操作系统如

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功