操作系统课程设计引导启动_第1页
操作系统课程设计引导启动_第2页
操作系统课程设计引导启动_第3页
操作系统课程设计引导启动_第4页
操作系统课程设计引导启动_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、操作系统课程设计第 1 页目目 录录概述概述 .1一一.课设分析的具体内容课设分析的具体内容 .3二二.分析的具体目标分析的具体目标 .4三三boootsect.s 源代码分析基础源代码分析基础.51磁盘参数.52bios 的 int 13h 调用.53根文件系统的命名方式及设备号的计算.74.串传输指令.7四各模块源代码的分析四各模块源代码的分析 .81.bootsect将自身从目前段位置 0x07c0 移到 0x9000 处.92.将setup模块读到 0x90200 开始处.93.获得磁盘驱动参数.104.显示loading system. .115.将系统模块加载到 0x10000 处

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

3、程:通电后,cpu 完成自检和初始化,设置寄存器内的初值,而后执行第一条指令。该指令的地址是 cs*16+ip,即 0 xffff0,该地址是 bios 的入口地址。bios 对整个机器系统完成自检后,将有关系统配置的基本信息记录在内存的 bios 数据区中,然后把引导盘的第一个扇区读入内存的 0 x7c00 处。转到该处,把控制权交给引导程序,最后引导程序把操作系统读入内存中,并把控制权交给操作系统内核。 我们再来看看引导启动程序目录 boot。boot 目录中含有三个汇编语言文件,是内核源代码中最先被编译的程序。这 3 个程序完成的主要功能是当计算机加电时引导内核启动,将内核代码加载到内存

4、中,并做一些进入 32 位保护运行方式前的系统初始化工作。其中 bootsect.s 和 setup.s 程序需要使用 as86 软件来编译,使用的是 as86 的汇编语言格式(与微软的类似) ,而 head.s需要用 gnu as 来编译,使用的是 at&t 格式的汇编语言。我主要研究的是 boot.s 的引导块源代码分析。所以对 setup.s 和操作系统课程设计第 3 页head.s 不做详细解释。setup.s 程序主要是读取机器的硬件配置参数,并把内核模块 system 移动到适当的内存位置。head.s 程序被编译连接到 system 的最前部分,主要进行硬件设备的探测设置

5、和内存管理页面的初始化设置工作。bootsect.s 代码是磁盘引导块程序,驻留在磁盘的第一个扇区中(引导扇区,0 磁道(柱面) ,0 磁头,第 1 个扇区) 。在 pc机加电 rom bios 自检后,引导扇区由 bios 加载到内存0 x7c00 处,然后将自己移到内存 0 x9000 处。该程序的主要作用是首先将 setup 模块从磁盘加载到内存,紧接着 bootsect 的后面位置(0 x9200) ,然后利用 bios 中断 0 x13 取磁盘参数中当前启动引导盘的参数,接着在屏幕上显示”loading system.”字符串,再者将 system 模块从磁盘上加载到内存 ox100

6、0 开始地方。随后确定根文件系统的设备号。若设备指定,则根据所保存的引导盘的磁道扇区数判别出盘的类型和种类并保存起设备号于root_dev(引导块的 0 x508 地址处) 。最后长跳转到 setup 程序开始处(0 x90200)执行 setup 程序。一一.课设分析的具体内容课设分析的具体内容由于 linux 内核是一种单内核模式的系统。因此,内核中的所有程序都有密切的联系,他们之间的依赖和调用关系非常密切。所以我们先来看看源代码的目录结构,从目录结构中我们就可以看到我所分析的源代码所处的位置了(图转第 2 页) 。我所分析的则是 linuxboot 下的 bootsect.s 汇编源程序

7、。bootsect.s 程序是磁盘引导块程序,编译后会驻留在磁盘的第一操作系统课程设计第 4 页个扇区。在 pc 加电 rom bios 自检后,将被 bios 加载到内存0 x7c00 处进行执行。图 1.1 linux 源代码的目录结构二二.分析的具体目标分析的具体目标通过分析一个早期的 linux 内核,加深对操作系统各个组成模块具体实现机制的理解,同时也为今后从事底层的研究开发增加一些实践经验。通过对 bootsect.s 的分析,进一步了解 linux的启动过程,明白计算机从开始加电后做了什么?进一步认识引导程序,通过 bios 读磁盘扇区的方法以及 bios 的中断处理。同时也可以

8、巩固汇编的一些知识和 80 x86 的系统结构,熟悉源代码的目录结构,了解文件从哪里调用,明白系统在加电后进入实操作系统课程设计第 5 页模式后内存的分布情况等。三三boootsect.s 源代码分析基础源代码分析基础1 1磁盘参数磁盘参数我们在研究磁盘参数方面主要考虑这三部分chs(cylinder/head/sector).即磁头数(heads) 、柱面数(cylinders)、扇区数(sectors).其中:磁头数(heads) 表示磁盘总共有几个磁头,也就是有几面盘片, 最大为 255 (用 8 个二进制位存储);柱面数(cylinders) 表示磁盘每一面盘片上有几条磁道, 最大为

9、1023(用 10 个二进制位存储);扇区数(sectors) 表示每一条磁道上有几个扇区, 最大为 63 (用 6 个二进制位存储);每个扇区一般是 512 个字节(理论上讲这不是必须的, 但好象都取此值)。据此,磁盘最大容量为:255 * 1023 * 63 * 512 / 1048576 = 8024 mb ( 1m = 1048576 bytes )在 chs 寻址方式中, 磁头, 柱面, 扇区的取值范围分别为 0 到 heads - 1,0 到 cylinders - 1, 1 到 sectors (注意是从 1 开始)。2 2biosbios 的的 intint 13h13h 调用

10、调用bios 的 13h 中断功能是专门用来管理磁盘的。中断 13h 功操作系统课程设计第 6 页能每次处理的磁盘数据是若干个扇区,调用前要求用户给出访问的第 1 个扇区所在的磁盘物理地址(磁道号、扇区号、磁头号)和访问的扇区数。功能入口参数出口参数(ah)=0 磁盘复位(ah)=1 读磁盘状态(al)=状态字节(ah)=2 读指定扇区(dh)=面号(01)(dl)=驱动器号(03)(ch)=磁道号(039)(cl)=扇区号(19)(al)=扇区数(18)(es:bx)=数据缓冲区地址读成功:(ah)=0(al)=读出的扇区数读失败:(ah)=出错代码(ah)=3 写指定扇区同上写成功:(al

11、)=写入的扇区数,其余同上磁盘驱动程序13h(ah)=4 检查指定扇区同上,(es:bx)不设置成功:(al)=检查的扇区数,其余同上操作系统课程设计第 7 页(ah)=5 对指定磁道格式化(es:bx)=磁道地址同(ah)=4 的出口参数3 3根文件系统的命名方式及设备号的计算根文件系统的命名方式及设备号的计算linux 老式硬盘命名方式,具体值含义如下:设备号=主设备号*256+次设备号(主设备号:1内存,2磁盘,3硬盘,4ttyx,5tty,6并行口,7非命名管道)0 x300 /dev/hd0 代表整个第 1 个硬盘0 x301 /dev/hd1 第 1 个盘的第 1 个分区0 x30

12、2 /dev/hd2 第 1 个盘的第 2 个分区0 x303 /dev/hd3 第 1 个盘的第 3 个分区0 x304 /dev/hd4 第 1 个盘的第 4 个分区0 x305 /dev/hd5 代表整个第 2 个硬盘0 x306 /dev/hd6 第 2 个盘的第 1 个分区其它的依次类推。在 linux 中软驱的主设备号是 2,次设备号=type*4+nr,nr 为03 分别对应软驱 a,b,c,或 d,type 是软驱的类型(2-1.2m 或 7-1.44m 等)。因为 7*4+0=28,所以/dev/ps0(2,28)指的是 1.44m a 驱动器,其设备号是 0 x021c,同

13、理/dev/at0(2,8)指的是 1.2m a 驱动器,其设备号是 0 x0208.操作系统课程设计第 8 页4.4.串传输指令串传输指令movsbmovsw执行的操作:字节:(es:di)-(ds:si),(si)-(si)(1,(di)-(di)+或-1字:(es:di)-(ds:si),(si)-(si)(2,(di)cx将源地址置为ds:si=0 x07c0:0 x0000目的地址置为 es:di=0 x9000:0 x0000移动1个字cx=0?n跳到go中继续执行通过initseg指出跳转到的段地址y图 4.1 将自己移到 0 x9000 处操作系统课程设计第 10 页2.2.将

14、将 setupsetup 模块读到模块读到 0 x902000 x90200 开始处开始处其相应代码请参见linux 内核完全注释的 p53 页的代码注释,对应代码的 6877 行。对应于 load_setup 程序段用途是利用 bios 中断 int 13h 将 setup 模块从磁盘第 2 个扇区开始读到 0 x90200 开始处。int 13h 的使用方法如下:ah=0 x02 读磁盘扇区到内存; al=需要读出的扇区数;ch=磁道号的底 8 位; cl=开始扇区(05 位),磁道号高2 位(67)dh=磁头号; dl=驱动器号(如果是硬盘则位7 要置位)es:bx-指向数据缓冲区; 如

15、果出错则 cf 标志位置位。对应程序流程图如下:操作系统课程设计第 11 页置磁头号,驱动器号为0置磁道号为0,开始扇区为2置地址为initseg段中的0 x0200处置读磁盘扇区到内存的0 x0200处,需要读出的扇区数为4调用13h号中断cf=0?y跳入ok_load_setup继续执行置0 x0000-dx0 x0000-ax调用13h号中断n图 4.2 将 setup 读到 0 x90200 处3.3.获得磁盘驱动参数获得磁盘驱动参数其相应代码请参见linux 内核完全注释的 p54 页的代码注释,对应代码的 8390 行。对应于 ok_load_setup 程序段用于取磁盘驱动器参数

16、,尤其是每道的扇区数量。取磁盘驱动器参数 int 13h 调用格式和返回信息如下:ah=0 x08 dl=驱动器号(如果是硬盘位 7 为 1)返回信息:如果出错则 cf 置位,并且 ah=状态码ah=0,al=0; bl=驱动器类型(at/ps2)操作系统课程设计第 12 页ch=最大磁道号的低 8 位;cl=每磁道最大扇区数(05 位),最大磁道号高 2 位(67)dh=最大的磁道数; dl=驱动器数量es:di-软驱磁盘参数表置驱动器号为0置ah=0 x08调用13h号中断置最大磁道号的低8位为0保存每磁道扇区数将es重新置回0 x9000图 4.3 读磁盘驱动参数4.4.显示显示load

17、ingloading system.system.其相应代码请参见linux 内核完全注释的 p54 页的代码注释,对应代码的 94102 行。对应流程图如下:操作系统课程设计第 13 页读光标位置置页号为0调用10h号中断置共要显示的字符个数为24指向要显示的字符串写字符串并移动光标调用10h号中断图 4.4 显示loading system5.5.将系统模块加载到将系统模块加载到 0 x100000 x10000 处处其相应代码请参见linux 内核完全注释的 p54 页的代码注释,对应代码的 107110 行。对应流程图如下:置es=存放system的段地址读磁盘上system模块,es

18、为输入模块参数关闭驱动马达,这样就可以知道驱动器的状态了图 4.5 将 system 加载到 0 x10000 处6.6.检查要使用哪个根文件系统设备检查要使用哪个根文件系统设备上一步之后,我们要检查使用哪个根文件系统设备(简称根设备) 。如果已指定了设备(!=0)就直接使用给定的设备。否则就需要根据 bios 报告的每磁道扇区数来确定到底使用/dev/ps0(2,28) ,还是/dev/at0(2,8).操作系统课程设计第 14 页上面一行中两个设备文件的含义:在 linux 中软驱的主设备号是 2,次设备号=type*4+nr,nr 为 03分别对应软驱 a,b,c,或 d,type 是软

19、驱的类型(2-1.2m 或 7-1.44m 等)。因为 7*4+0=28,所以/dev/ps0(2,28)指的是 1.44m a 驱动器,其设备号是 0 x021c,同理/dev/at0(2,8)指的是 1.2m a 驱动器,其设备号是 0 x0208.其相应代码请参见linux 内核完全注释的 p5455 页的代码注释,对应代码的 117128 行。对应流程图如下:将根设备号-ax比较ax是否等于0n转入root_defined继续执行y取保存的每磁道扇区数将/dev/at0的设备驱动号0 x0208-ax比较bx是否等于15y将/dev/at0的设备驱动号0 x021c-ax比较bx是否等

20、于18ny死机n操作系统课程设计第 15 页图 4.6 确定根文件系统设备7.7.保存设备号,并跳转到保存设备号,并跳转到 0 x9020:00000 x9020:0000 处处其相应代码请参见linux 内核完全注释的 p55 页的代码注释,对应代码的 131139 行。即root_defined:seg cs mov root_dev,ax ;将检查过的设备号保存起来 jmpi 0,setupseg;跳转到 0 x9020:0000(setup.s 程序开始处)综上所述,bootsect.s 主要要完成的工作就是按上面的 7 个步骤来执行的,对应的整体流程图如下:操作系统课程设计第 16

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

22、备号跳转到0 x9000:0000 setup.s程序的开始处判断磁道扇区数是否为15ny判断磁道扇区数是否为18ny开始n图 4.7 boosect.s 整体流程图在整个过程中内存的变化属最大了,理清内存的变化也是我们分析的重点。从 pc 电源加电后,进入实模式,这时候内存大小为 1mb.下图为从加电开始到 bootsect.s 执行结束内存的变化:(具体的一些操作系统课程设计第 17 页内存移动的原因在分析研究体会中做了解释)pc加电从0 xffff0开始执行代码(rom bios中的地址)在物理地址0处开始初始化中断向量(共1kb大小)将bootsect.s读入到内存绝对地址0 x7c0

23、0处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 保留给显示卡的显存使用(rom);c0000hfffffh 保留给 bios(bios rom)使用,这样就可以解释加

24、电后的开始执行的地址为 0 xffff0 了。0 x000000 x00400共 1kb 大小为 bios 中断向量表,这是由初始执行的 bios 程序初始化到 ram 中的。最后,我们来看看开机初始化时,对堆栈的使用。当bootsect.s 代码被 rom bios 引导加载到物理内存 0 x7c00 处时,操作系统课程设计第 18 页并没有设置堆栈段,当然程序也没有使用堆栈,直到 bootsect 被移动到 0 x90000 处时,才把堆栈段寄存器 ss 设置为 0 x9000,堆栈指针 esp 寄存器设置为 0 xff00,也即堆栈顶端在0 x9000:0 xff00 处,参见 boot

25、/bootsect.s 第 61,62 行。这就是系统初始化时临时使用的堆栈。分析研究体会分析研究体会这次,我们分析的 linux 0.11 源代码,因为以前都没怎么分析过,所以选择从开始进行分析,于是选了 bootsect.s 引导块程序进行分析。bootsect.s 中的程序需要使用 as86 软件来编译,使用的是as86 的汇编语言格式(与微软的类似) ,总共大小为 512 字节。所涉及的语言仅汇编一种,没有 c 语言。对于汇编语言我们在大二上学期就已经学了,再加之这个学期刚学完单片机,对于这部分代码要看懂他还是没问题。一开始在有点汇编基础上加之源代码又有注释,觉得看起来还挺顺的,好像没

26、花多长时间就看完了。后来再具体分析阶段,开始对每个模块进行分析画流程图时,问题慢慢就出来了。在第一部分中就遇到了 rep movw 这两句到底是怎么用的呀,只知道大概就是循环执行 256 次,画流程图时就出现了到底循环哪部分,还有这源地址和目的地址有什么用呀。后来翻书才明白原来这是串传输指令,把 si 所指向的源串一个字传送到 di 所指向的目的串中,同时按照 df 修改 si 和 di。当该指令与 rep 联用时,就可以将 bootsect.s 从 0 x07c0 处移到 0 x9000 处了。操作系统课程设计第 19 页在汇编程序上的问题还有就是 int 13h 号调用,具体的入口参数,出

27、口参数,及干什么用的不清楚。总不明白在 load_setup为什么要调用两次中断,第一次,当然知道是使 setup 模块从第2 个扇区开始读到 0 x90200 开始处,即调用中断的目的是读磁盘扇区到内存,第二个调用在没翻书前就太清楚了。后面翻书后才比较清楚了,第二次调用原来是磁盘复位。同样在显示loading system同样有 int 10h 号中断也不太清楚,看书后才明白了。小问题解决了,就还存在一个整体上的问题,那个 bootsect.s程序干吗要移来移去,内存地址开始处为什么不从 0 开始呢,等地址问题,有些搞不清楚,后面通过查阅资料终于能理清一些思路了。pc 电源打开后,进入实模式

28、,并从 0 xffff0 开始自动执行程序代码。这个地址通常是 rom bios 中的地址,将执行某些系统检测,并在物理地址 0 处开始初始化中断向量,此后,他将可启动的设备的第一个扇区读入内存绝对地址 0 x7c00 处,并跳转到这个地址。计算机初始化启动时,cpu 默认是在实模式下开始寻址和执行指令的。这时候 1mb 的物理内存是这样安排的:低端 640kb被称为基本内存(ram),而 a0000hbffffh 要保留给显卡的显存使用的(rom),c0000fffffh 则被保留给 bios(bios rom)使用,其中系统 bios 一般占用最后的 62kb 或更多一点的空间,显示卡 b

29、ios 一般在 c0000hc7fffh 处,ide 控制器的 bios在 c8000hcbfffh.但这并不意味着 bios 中断向量表也在rom 中,这是由初始执行的 bios 程序初始化到 ram 中的(从物理地址 00000h 开始的 1kb) 。操作系统课程设计第 20 页这两段使我明白了原来 bootsect.s 不是一开机就有了的,原来是通过 rom bios 将 bootsect.s 读入到内存中的,之后才有bootsect.s 的执行,在此期间他还要初始化中断向量。中断向量占据着物理地址的低 1kb 字节,所以 bootsect.s 也不能读到 0 开始的位置。那为什么地址要

30、移来移去呢,bios 加电后,会将 boot 加载到 7c00h 上,这是不能改变的,而如果加载到这个地方,会让system 加载时很尴尬,所以,要将引导程序向后移动。移动代码本身的原因通常是因为内存地址重复。比如 mbr 会把自己从0 x7c00 移动到别处,是因为后面的分区引导记录也会被装载到0 x7c00 处,如果不移动,将会导致代码被覆盖的情况发生,倘若代码被覆盖,就不能被 cpu 正常执行。还有一中情况是为了节省内存。我想我们这里移动代码的原因还是第一种情况吧,第二种情况是后面的将 system 又移动到 00000h 处的,这不是我所研究的范围。至于前面说的会让 system 加载很尴尬,我想也可能是因为后面要将 system 移到 00000h 处的原因吧。这个我不能确定,因为后面的程序我还没看。大问题总算解决了还有些小问题,如一会儿又是设备驱动器号一会儿又是设备号,真是都快搞晕了。查了一下,好像是说调用 bios 的 0 x13 中断,dl 中设置的入口参数是驱动器号,设备驱动器号是 bios 设置好的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论