1、重庆科技学院操作系统原理课程设计报告重庆科技学院课程设计任务书设计题目:微型操作系统的设计 学生姓名课程名称操作系统原理课程设计专业班级计科应08地 点I524起止时间2011年6月12日-2011年6月16日设计内容及要求(1) 配置操作系统编写的所需的环境(虚拟机的建立和相应环境建立),以准备相关的必须工具的准备,并学会相关工具的使用,为以后编写一个微操作系统奠定基础和准备平台。(2) 学习NASM汇编器在本次设计中的使用。(3) 学习裸机启动的过程,消化操作系统引导程序的结构,在此基础上,完成在实模式下从软盘引导计算机的程序编写。(4) 学习本次设计需要的实模式到保护模式切换的相关知识。
2、理解GDT在保护模式的工作机理(5) 编写在保护模式下的引导程序,并用C语言模拟写一个“内核”,并实现在保护模下通过引导程序启动计算机并将该“内核”加载到内存中。最后切换到内核。设计参数(1) 写出编写一个操作系统所需的环境和操作说明书。(2) 总结计算机启动顺序和具体过程。(3) 实现在实模式下系统引导程序的编写。(4) 理解消化实模式到保护模式切换原理以及相关的数据结构和工作过程,并实现之。(5) 完成保护模式下的引导程序,并完成“内核”的加载,并使“内核”运行起来。附加要求:请在设计的课后完成具有进程调度和管理的内核的编写。进度要求6月12日布置任务,对各个任务的基础知识进行讲解6月12
3、日 安装环境,并熟悉相关工具的使用。6月13日完成实模式下引导程序的编写。6月14日完成实模式与保护模式的切换代码的设计。6月15日完成实模式引导程序和内核加载程序编写。6月16日完成答辩和报告撰写。参考资料随任务布置的相关电子文档。其它说明.本表应在每次实施前一周由负责教师填写二份,院系审批后交院系办备案,一份由负责教师留用。.若填写内容较多可另纸附后。3.一题多名学生共用的,在设计内容、参数、要求等方面应有所区别。教研室主任: 指导教师: 摘要操作系统是用于控制和管理计算机系统内各种软硬件资源、合理有效地组织协调计算机系统的工作流程提供友好的用户接口以方便用户使用计算机的程序集合。本次设计
4、主要基于在实模式下系统引导程序的编写,理解消化实模式到保护模式切换原理以及相关的数据结构和工作过程,并实现之,完成保护模式下的引导程序,并完成“内核”的加载,并使“内核”运行起来。所用到的设备有Windows XP系统PC机一台、装有Linux系统的PC机一台、VMware虚拟机一台、winhex以及NASM编译软件。 结合本身的实际情况,写出设计要求的操作系统。关键词:操作系统 引导 模式 内核 NASM目录摘要I1 需求分析11.1功能需求分析11.2 性能需求分析11.3 运行环境需求21.3.1 设备21.3.2 运行环境22系统设计42.1 引导程序和模式切换功能设计42.1.1 引
5、导程序设计42.1.2 模式切换功能设计52.2 内核设计82.3 映像文件的设计113系统测试12总结14致谢15参考文献16171 需求分析无论什么项目或者是软件,我们首先必需弄清它的需求分析,才能达到我们开发的目的,而不是在那盲目的开发,最后却不知道产品所需求的功能。1.1功能需求分析PC机开机后,CPU被设定为执行FFFF:0单元处的指令,此处有一条跳转指令。CPU执行该指令后,转去执行BIOS中的硬件系统测试和初始化程序。初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中。硬件系统检测和初始化完成后,调用int 19h进行操作系统的引导。
6、如果设为从软盘启动操作系统,则int 19h将主要完成以下工作:(1) 控制0号软驱,读取软盘0道0面1扇区的内容到 0:7C00(2) 将CS:IP指向0:7C00软盘的0道0面1扇区中装有操作系统引导程序。int 19h将其装入到内存0:7C00处后,设置CPU从0:7C00开始执行此处的引导程序,操作系统被激活,控制计算机。如果在0号软驱中没有软盘,或发生软盘I/O错误,则int 19h将主要完成以下工作:(1) 读取硬盘C的0道0面1扇区的内容到0:7C00 (2) 将CS:IP指向0:7C00由以上描述可知,若我们想要控制引导过程,只需: (1) 编写程序 (2) 将该程序代码写入软
7、盘或硬盘C的0道0面1扇区。 因为以上工作会破坏软盘或硬盘原有数据,因此本次实验,我们选择软盘存放我们自己的启动程序。1.2 性能需求分析该操作系统在性能上应达到如下要求:1)操作简单,界面友好:本系统是采用的虚拟机软盘映像文件驱动引导程序设计的启动模式,操作起来简单方便快捷;界面可以根据自己的喜好设成不同的格式和布局。2)环境稳定:该操作系统的设计主要是引导程序的引入、实模式下的运行、实模式到保护模式的转换以及保护模式下内核的加载运行,所以运行环境必须稳定可靠。3)可扩展性:系统在结构上应该具有很好的扩展性,便于以后系统功能的扩展与开发。1.3 运行环境需求1.3.1 设备基于Windows
8、环境平台下汇编编辑工具(EditPlus)或者基于Linux环境下的文本编辑器;NASM编译器;Winhex16进制编辑器;装有虚拟机的Windows XP系统PC机一台;Linux系统PC机一台。1.3.2 运行环境本次课程设计由于是通过虚拟机演示,主要用到虚拟机的软盘通过镜像文件引导加载程序,下面简单介绍一下运行平台上的工具以及文件。1)虚拟机VMware1)关于VMware几个重要概念1. VM(Virtual Machine)虚拟机,指由Vmware模拟出来的一台虚拟的计算机,也即逻辑上的一台计算机; 2.HOST指物理存在的计算机,Hosts OS指HOST上运行的操作系统; 3.
9、Guest OS指运行在VM上的操作系统。例如在一台安装了Windows NT的计算机上安装了Vmware,那么,HOST指的是安装Windows NT的这台计算机,其Hosts OS为Windows NT。VM上运行的是Linux,那么Linux即为Guest OS。2)软盘映像文件映像文件是将资料和程序结合而成的文件,它将来源资料经过格式转换后在硬盘上存成 与目的光盘内容完全一样的文件,然后我们可以将这个文件以一比一对应的方式刻入光盘中。 在制作映像文件之前建议先做硬盘的资料重整与磁盘扫描,除此之外,由于一个映像文件的大小相当于刻入光盘的全部内容,所以一定要预留超过这个容量的硬盘空间来存储
10、这个映像文件。3)映像文件合成工具WinHexWinHex 是一款以通用的 16 进制编辑器为核心,专门用来对付计算机取证、数据恢复、低级数据处理、以及 IT 安全性、各种日常紧急情况的高级工具: 用来检查和修复各种文件、恢复删除文件、硬盘损坏、数码相机卡损坏造成的数据丢失等。4)Linux下的GCC编译器Linux系统下的Gcc是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作之一。Gcc是可以在多种硬件平台上编译出可执行的超级编译器,其执行效率与一般的编译器相比平均效率要高20%30%。Gcc编译器能将C、C+语言源程序、汇程式化序和目标程序编译、连接成可执行文件,如果没有给
11、出可执行文件的名字,gcc将生成一个名为a.out的文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。5)NASM编译软件要将源文件demo.asm汇编为exe文件,可以在Command窗口输入如下命令:nasm demo.asm -o demo1.exe要汇编为32位Windows程序,可以在Command窗口输入如下命令:nasm -f win32 demo.asm -o demo2.exe要汇编为64位Windows程序,可以在Command窗口输入如下命令:nasm -f win64 demo.asm -o demo3.exenasm命
12、令的-o参数用于指定输出文件的文件名,-f用于指明文件格式,如果没有指明文件格式,则默认编译为bin格式,即纯二进制代码。所以,上面的demo1.exe实际上是个.com文件。2系统设计2.1 引导程序和模式切换功能设计2.1.1 引导程序设计首先通过一个小程序作为引导程序,引导程序的主要作用是起到引导的作用,它将一个字符串输出显示到屏幕上,其源代码如下。org07c00h ; 告诉编译器程序加载到7c00处movax, csmovds, axmoves, axcallDispStr; 调用显示字符串例程jmp$ ; 无限循环DispStr:movax, BootMessagemovbp, a
13、x ; ES:BP = 串地址movcx, 16 ; CX = 串长度movax, 01301h ; AH = 13, AL = 01hmovbx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)movdl, 0int10h; 10h 号中断retBootMessage:dbyangjing2008540330!times 510-($-$)db0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节dw 0xaa55 ; 结束标志2.1.2 模式切换功能设计在引导程序的基础上实现模式切换功能,实现实模式到保护模式的切换,具体实现的方式和方案如下:BITS 16
14、ORG 0x7C00 jmp main; -; 数据定义bootdrive db 0; -; GDT 定义,此处定义段及段描述符gdt: gdt_null: ; 这是CPU要求保留的,CPU要求第一个段必须是空段,不知它 ; 想用来干啥 dd 0 dd 0 ; 每个段的描述符是64位(8字节),空描述符的这64位全是0 gdt_code_addr equ $ - gdt ; 求得代码段在GDT表中的位置 gdt_code: dw 0xffff ; 段大小为4GB dw 0 ; 基地址(24位) db 0 db 10011010b ;属性描述位,指明此是代码段,可读可执行 db 11001111
15、b ;具体的每一位是代表什么可查Intel CPU编程手册 db 0 ;没有的可以去网上下,也可以找我要 gdt_data_addr equ $ - gdt ;求得数据段在GDT表中的位置 gdt_data: dw 0xffff dw 0 db 0 db 10010010b ; 指明此是数据段,可读可写 db 11001111b db 0 gdt_end: gdt_addr: dw gdt_end - gdt - 1 ;GDT 表的大小 dd gdt ; GDT 表的位置; -main: ; 引导程序从此处开始执行 mov bootdrive , dl ; 得到启动的驱动器号 xor ax ,
16、 ax ; 设置 DS mov ds , ax ; 清屏 ;mov ax , 3 ;设置清屏功能号 ;int 0x10 ; 调用 BIOS 10 号中断清屏 .ResetFloppy ;重置磁盘,不是必须的,主要是为了安全起见 mov ax , 0 ; 设置重置磁盘的功能号 mov dl , bootdrive ; 选择启动磁盘 int 0x13 ;调用 BIOS 13号中断重置磁盘 jc .ResetFloppy ; 如果出错则重试 .ReadFloppy ; 读内核到内存中 0000:9000 (es:bx)处,;为什么要读到9000处,这不是一定的,;你可以读到另外一个合适的地址;什么地
17、址合适?怎样知道一个地址合不合适?待会再说 xor ax , ax ;设置 es 寄存器 mov es , ax mov bx , 0x9000 mov ah , 2 ; 设置读磁盘功能号 mov dl , bootdrive ; 设置欲读驱动器号 mov ch , 0 ; 磁头号 mov cl , 2 ; 起始扇区号,从第二个扇区开始读, ;第一个扇区是引导扇区,第二个才是内核所在 mov al , 17 ;需读入扇区的数量,此处读了17个扇区 ; 是怕内核较大,读少了读不完 int 13h ;调用 BIOS 13 号中断开始读扇区, ; 此中断会将数据读到 es:bx 处 jc .Read
18、Floppy ; 如果出错则重试(ah中是错误号,为0则没错) mov dl , bootdrive ; 停止驱动器 mov edx , 0x3f2 mov al , 0x0c out dx , al cli ; 关中断 lgdt gdt_addr ; 载入 GDT 的描述符 mov eax , cr0 ; 下面三句设置 cr0 的第 0 位(PE位)为1, ; 表示进入保护模式 or eax , 1 mov cr0 , eax jmp gdt_code_addr:code_32 ; 跳入32位的代码段中BITS 32code_32: mov ax , gdt_data_addr ; 以下三句
19、设置 DS,ES,SS,FS,GS ; 为数据段描述表的位置 mov ds , ax mov es , ax mov ss , ax mov fs , ax mov gs , ax mov esp , 0xffff ; 设置堆栈的头指针 jmp gdt_code_addr:0x9000 ; 跳入内核,; gdt_code_addr是定义的代码段的描述符所在的索引; 由于我们先前是把内核读到了 0x9000的位置,; 因此我们现在就转到内核所在去执行,; 引导程序胜利完成历史使命!;- times 510-($-$) db 0db 0x55db 0xAA将此段代码存储为boot.asm文件,运用
20、NASM编译器编译为boot.img文件。2.2 内核设计内核设计是本次课程设计最重要也是最关键的一个步骤,下面给出内核设计的源程序。#includechar* msg = Hello Diqiu! ; void one();void two();void Sleep(int x);void main() int i; unsigned char* videomem = ( unsigned char* )0xb8000 ; /* 获得显存地址 */while( *msg != 0 ) *videomem+ = *msg+ ; /* 设置显示字符的ASCII码 */ *videomem+ =
21、0xfa ; /* 设置文字属性(背景色,前景色,是否闪烁等)*/ Sleep(5000);i+; one(); two(); for(;); void one() char* msg = 2008540330yangjing! ; unsigned char* videomem = ( unsigned char* )0xb80a0 ; /* 获得显存地址 */ while( *msg != 0 ) *videomem+ = *msg+ ; /* 设置显示字符的ASCII码 */ *videomem+ = 0xfb ; /*设置文字属性(背景色,前景色,是否闪烁等)*/ Sleep(5000
22、); void two() char* msg = Thank you! ; unsigned char* videomem = ( unsigned char* )0xb8140 ; /* 获得显存地址 */ while( *msg != 0 ) *videomem+ = *msg+ ; /*设置显示字符的ASCII码 */ *videomem+ = 0xfc ; /*设置文字属性(背景色,前景色,是否闪烁等)*/ Sleep(5000); /*void Sleep() int i; int n=10; for(i=1;i=n;i+) printf(%d,i); Sleep(5*1000*6
23、0); /这里修改延时时间*/void Sleep(int x) int i,j; for(i=0;ix;i+) for(j=0;j10000;j+) 将以上编写好的代码保存为yangjing.c形式的C语言文件,将保存好的C文件拷贝到Linux环境下的通过gcc编辑成yangjing.bin文件。2.3 映像文件的设计关于映像文件的设计其实很简单,就是将两个映像文件合并城一个映像文件,用前面所介绍的WinHex专用编辑工具来实现。首先将WinHex编辑器打开,打开boot.img文件,再打开yangjing.bin文件,将yangjing.c文件的二进制码拷贝到boot.img文件的二进制码
24、的末尾,最后另存一个Img文件即可。3系统测试打开虚拟机,新建一个虚拟机如下图3.1所示。图3.1 新建虚拟机新建一个虚拟机后,选择Floppy软盘读取映像文件,如下图3.2所示。图3.2 软盘读取再打开虚拟机电源即可运行映像文件,下面运行第一个引导程序映像,如下图3.3所示。图3.3 引导程序运行界面图3.4 内核运行结果总结操作系统原理在本学期第一次接触到,期末进行了为期一周的课程设计,让我们自己切身的感受和实际动手写操作系统。让我学习到如何在操作系统中编写和运行引导程序,如何在实模式下切换到保护模式,如何加载内核,如何在保护模式下运行内核。由于只有一周的时间,我只能是做些简单的程序引导和内核加载,我相信通过课后更多的时间我会设计出更完美的操作系统引导程序和内核加载,还会增加更多的功能。致谢在本次课程设计能得以顺利完成,在这里感谢各位老师的指导,同时感谢各位同学的帮助。参考文献1陆丽娜,齐勇,白恩华主编,计算机操作系统原理与技术,西安:西安交通大学出版社,19952李大友主编,操作系统,北京:机械工业出版社,20003王万森等. 计算机操作系统原理. 北京: 高等教育出版社, 2001