操作系统课程设计 引导启动.doc

上传人:PIYPING 文档编号:10817231 上传时间:2021-06-05 格式:DOC 页数:22 大小:656KB
返回 下载 相关 举报
操作系统课程设计 引导启动.doc_第1页
第1页 / 共22页
操作系统课程设计 引导启动.doc_第2页
第2页 / 共22页
操作系统课程设计 引导启动.doc_第3页
第3页 / 共22页
操作系统课程设计 引导启动.doc_第4页
第4页 / 共22页
操作系统课程设计 引导启动.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《操作系统课程设计 引导启动.doc》由会员分享,可在线阅读,更多相关《操作系统课程设计 引导启动.doc(22页珍藏版)》请在三一文库上搜索。

1、操作系统课程设计 第 1 页 目目 录录 概述概述 .1 一一.课设分析的具体内容课设分析的具体内容 .3 二二.分析的具体目标分析的具体目标 .4 三三BOOOTSECT.S 源代码分析基础源代码分析基础.5 1磁盘参数.5 2BIOS 的 INT 13H 调用.5 3根文件系统的命名方式及设备号的计算.7 4.串传输指令.7 四各模块源代码的分析四各模块源代码的分析 .8 1.BOOTSECT将自身从目前段位置 0X07C0 移到 0X9000 处.9 2.将SETUP模块读到 0X90200 开始处.9 3.获得磁盘驱动参数.10 4.显示LOADING SYSTEM. .11 5.将系

2、统模块加载到 0X10000 处.12 6.检查要使用哪个根文件系统设备.12 7.保存设备号,并跳转到 0X9020:0000 处.14 分析研究体会分析研究体会 .17 自我评价自我评价 .20 参考文献参考文献 .21 操作系统课程设计 第 2 页 概述概述 Linux 作为一个优秀的操作系统,其原因之一应归属于开放 的内核源代码。说起内核源代码,我们不得不存着敬畏的心理。 它在 Linux 中的地位好像心脏在我们身体中的地位一样重要,它 是整个操作系统的灵魂。因此要更好的了解 Linux,分析他的源 代码是非常必要的。在这次课程设计中我选择分析的是 Linux 0.11 的 Boot.

3、s 的引导块源代码分析。 首先我们粗略的看一下计算机内开机过程:通电后,CPU 完 成自检和初始化,设置寄存器内的初值,而后执行第一条指令。 该指令的地址是 CS*16+IP,即 0 xFFFF0,该地址是 BIOS 的入 口地址。BIOS 对整个机器系统完成自检后,将有关系统配置的 基本信息记录在内存的 BIOS 数据区中,然后把引导盘的第一个 扇区读入内存的 0 x7C00 处。转到该处,把控制权交给引导程序, 最后引导程序把操作系统读入内存中,并把控制权交给操作系统 内核。 我们再来看看引导启动程序目录 Boot。Boot 目录中含有三 个汇编语言文件,是内核源代码中最先被编译的程序。这

4、 3 个程 序完成的主要功能是当计算机加电时引导内核启动,将内核代码 加载到内存中,并做一些进入 32 位保护运行方式前的系统初始 化工作。其中 bootsect.s 和 setup.s 程序需要使用 as86 软件来编 译,使用的是 as86 的汇编语言格式(与微软的类似) ,而 head.s 需要用 GNU as 来编译,使用的是 AT将检查过的设备号保存起来 Jmpi 0,setupseg;跳转到 0 x9020:0000(setup.s 程序开始处) 综上所述,bootsect.s 主要要完成的工作就是按上面的 7 个步 骤来执行的,对应的整体流程图如下: 操作系统课程设计 第 16

5、页 开始 定义了6个全局表识符 初始化 setup程序的扇区数,bootsect的 原始地址,bootsect移动到的地址, setup程序的开始地址等信息 将源地址置为 ds:si=0 x07c0:0 x0000 目的地址 es:di=0 x9000:0 x0000 Bootsect.s的程序长度256字-cx 移动1个字 Cx=0? Y N 将ds,es和ss都置为0 x9000 将堆栈指向0 x9000:0 xff00处 给出被访问的第1扇区所在的磁盘物 理地址和访问的扇区数 调用13H中断 获得磁盘驱动器的参数 显示Loading system. 将system模块加载到0 x1000

6、处 检查是否已指定了设备? Y 保存检查过的设备号 跳转到0 x9000:0000 setup.s 程序的开始处 判断磁道扇区数是否为15 N Y 判断磁道扇区数是否为18 N Y 开始 N 图 4.7 boosect.s 整体流程图 在整个过程中内存的变化属最大了,理清内存的变化也是我 们分析的重点。 从 PC 电源加电后,进入实模式,这时候内存大小为 1MB.下 图为从加电开始到 Bootsect.s 执行结束内存的变化:(具体的一些 操作系统课程设计 第 17 页 内存移动的原因在分析研究体会中做了解释) PC加电 从0 xFFFF0开始执行代码(ROM BIOS中 的地址) 在物理地址

7、0处开始初始化中断 向量(共1KB大小) 将Bootsect.s读入到内存绝对地 址0 x7c00处 Bootsect.s将自己从0 x7c00移到0 x90000 将setup.s程序加载到0 x90200处 将system模块加载到0 x10000处 跳到0 x90200处继续执行setup.s程序 图 4.8 从开机到执行完 Bootsect.s 后内存变化图 因此,我们可以看一下,在计算机初始化时,1MB 的物理 内存的大致安排情况:低端 640KB 为基本内存(RAM),所以当 加载 Bootsect.s 后,执行过程中程序的移动和加载都在这个范围 内;A0000HBFFFFH 保留

8、给显示卡的显存使用(ROM); C0000HFFFFFH 保留给 BIOS(bios rom)使用,这样就可以解 释加电后的开始执行的地址为 0 xFFFF0 了。0 x000000 x00400 共 1KB 大小为 BIOS 中断向量表,这是由初始执行的 BIOS 程序 初始化到 RAM 中的。 最后,我们来看看开机初始化时,对堆栈的使用。当 bootsect.s 代码被 ROM BIOS 引导加载到物理内存 0 x7c00 处时, 操作系统课程设计 第 18 页 并没有设置堆栈段,当然程序也没有使用堆栈,直到 bootsect 被 移动到 0 x90000 处时,才把堆栈段寄存器 SS 设

9、置为 0 x9000,堆 栈指针 ESP 寄存器设置为 0 xFF00,也即堆栈顶端在 0 x9000:0 xFF00 处,参见 boot/bootsect.s 第 61,62 行。这就是系 统初始化时临时使用的堆栈。 分析研究体会分析研究体会 这次,我们分析的 Linux 0.11 源代码,因为以前都没怎么分 析过,所以选择从开始进行分析,于是选了 Bootsect.s 引导块程 序进行分析。 Bootsect.s 中的程序需要使用 as86 软件来编译,使用的是 as86 的汇编语言格式(与微软的类似) ,总共大小为 512 字节。 所涉及的语言仅汇编一种,没有 C 语言。对于汇编语言我们

10、在 大二上学期就已经学了,再加之这个学期刚学完单片机,对于这 部分代码要看懂他还是没问题。 一开始在有点汇编基础上加之源代码又有注释,觉得看起来 还挺顺的,好像没花多长时间就看完了。后来再具体分析阶段, 开始对每个模块进行分析画流程图时,问题慢慢就出来了。在第 一部分中就遇到了 rep movw 这两句到底是怎么用的呀,只知道 大概就是循环执行 256 次,画流程图时就出现了到底循环哪部分, 还有这源地址和目的地址有什么用呀。后来翻书才明白原来这是 串传输指令,把 SI 所指向的源串一个字传送到 DI 所指向的目的 串中,同时按照 DF 修改 SI 和 DI。当该指令与 REP 联用时,就 可

11、以将 bootsect.s 从 0 x07c0 处移到 0 x9000 处了。 操作系统课程设计 第 19 页 在汇编程序上的问题还有就是 Int 13H 号调用,具体的入口 参数,出口参数,及干什么用的不清楚。总不明白在 load_setup 为什么要调用两次中断,第一次,当然知道是使 setup 模块从第 2 个扇区开始读到 0 x90200 开始处,即调用中断的目的是读磁盘 扇区到内存,第二个调用在没翻书前就太清楚了。后面翻书后才 比较清楚了,第二次调用原来是磁盘复位。同样在显示Loading System同样有 Int 10H 号中断也不太清楚,看书后才明白了。 小问题解决了,就还存在

12、一个整体上的问题,那个 bootsect.s 程序干吗要移来移去,内存地址开始处为什么不从 0 开始呢,等 地址问题,有些搞不清楚,后面通过查阅资料终于能理清一些思 路了。 PC 电源打开后,进入实模式,并从 0 xffff0 开始自动执行程 序代码。这个地址通常是 ROM BIOS 中的地址,将执行某些系 统检测,并在物理地址 0 处开始初始化中断向量,此后,他将可 启动的设备的第一个扇区读入内存绝对地址 0 x7c00 处,并跳转 到这个地址。 计算机初始化启动时,CPU 默认是在实模式下开始寻址和执 行指令的。这时候 1MB 的物理内存是这样安排的:低端 640KB 被称为基本内存(RA

13、M),而 A0000HBFFFFH 要保留给显卡的 显存使用的(ROM),C0000FFFFFH 则被保留给 BIOS(bios rom) 使用,其中系统 BIOS 一般占用最后的 62KB 或更多一点的空间, 显示卡 BIOS 一般在 C0000HC7FFFH 处,IDE 控制器的 BIOS 在 C8000HCBFFFH.但这并不意味着 BIOS 中断向量表也在 ROM 中,这是由初始执行的 BIOS 程序初始化到 RAM 中的 (从物理地址 00000H 开始的 1KB) 。 操作系统课程设计 第 20 页 这两段使我明白了原来 bootsect.s 不是一开机就有了的,原 来是通过 RO

14、M BIOS 将 bootsect.s 读入到内存中的,之后才有 bootsect.s 的执行,在此期间他还要初始化中断向量。中断向量 占据着物理地址的低 1KB 字节,所以 bootsect.s 也不能读到 0 开 始的位置。 那为什么地址要移来移去呢,BIOS 加电后,会将 boot 加载 到 7c00H 上,这是不能改变的,而如果加载到这个地方,会让 system 加载时很尴尬,所以,要将引导程序向后移动。移动代 码本身的原因通常是因为内存地址重复。比如 MBR 会把自己从 0 x7c00 移动到别处,是因为后面的分区引导记录也会被装载到 0 x7c00 处,如果不移动,将会导致代码被覆

15、盖的情况发生,倘 若代码被覆盖,就不能被 CPU 正常执行。还有一中情况是为了 节省内存。 我想我们这里移动代码的原因还是第一种情况吧,第二种情 况是后面的将 System 又移动到 00000H 处的,这不是我所研究 的范围。至于前面说的会让 system 加载很尴尬,我想也可能是 因为后面要将 system 移到 00000H 处的原因吧。这个我不能确定, 因为后面的程序我还没看。 大问题总算解决了还有些小问题,如一会儿又是设备驱动器 号一会儿又是设备号,真是都快搞晕了。查了一下,好像是说调 用 BIOS 的 0 x13 中断,DL 中设置的入口参数是驱动器号,设备 驱动器号是 BIOS

16、设置好的,例如:00 表示磁盘,80 表示硬盘, 而设备号是 LINUX 系统编号。还有要知道根文件系统设备。哦, 好像明白了点是不是要加载 System,system 在文件系统下面, 所以要知道根文件系统设备。启动代码放在硬盘引导扇区中,这 操作系统课程设计 第 21 页 个代码会去加载一些其他代码并执行这些代码来从存放文件系统 的硬盘位置中读取内核代码,也即内核代码是作为一个文件存放 在文件系统中的。 我觉得这样将 linux 分成模块去分析,每个人都分析其中的 一小段模块比让大部分代码都一起分析更有效。一小段模块分析 首先从感觉上就更有信心,如果是分析大部分代码从第一反应就 是肯定分析

17、不出来,太多了。现在这样就不会觉得很多了,在看 完代码的情况下我们还有时间去研究其中的为什么,而不仅在表 面上的看懂代码。从这次课设的分析,我都更有信心分析后面的 代码了,这也为我以后分析后面的代码打下了良好的基础。 自我评价自我评价 这次课程设计完成的结果还比较满意。可能是由于自己分析 的 bootsect.s 这一块,全是汇编语言,不涉及 C 语言,程序相对 来说比较短,又由于他与其他模块的前后关联小,分析起来会比 较顺利。 但虽然说程序比较短并不代表在分析当中不会出现问题,其 实也会有很多问题。在初看程序中是觉得没什么问题,当开始仔 细分析时问题就出来了。然后我就开始把问题分为是自己在程

18、序 理解上的问题,还是对于程序的这种做法上的难以理解方面的问 题。 对于程序上的理解方面的问题是很好解决的,这主要是由于 很久都没接触汇编了对其中的一些不怎么经常用的指令忘了,翻 翻书,多看看就能解决了。而如果是对程序的某些做法的不理解, 操作系统课程设计 第 22 页 那就需要自己根据前后程序的关系慢慢想,还需要多了解一些关 于那方面的基础知识。对于已经不知道而现在又要分析的话,就 只能是多查阅资料,自己多想想,这样就会解决了。 有时候觉得题目大了的话,总感觉在应付了事。而这回则不 同,都是通过自己的分析理解,加之查阅资料来使自己更加的理 解,而在这其中又能学到一些其他自己还没分析方面的知识,为 以后的分析打基础。所以觉得这次课程设计还是比较满意的。 参考文献参考文献 1.赵炯 Linux 内核完全注释.2004.5.12 2.冯锐Linux 内核源代码分析. 机械工业出版社. 2000.6 3. 4. http:/www.oldlinux.org/oldlinux/forumdisplay.php?fid=9

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1