操作系统原理课程设计-微型操作系统的设计.doc_第1页
操作系统原理课程设计-微型操作系统的设计.doc_第2页
操作系统原理课程设计-微型操作系统的设计.doc_第3页
操作系统原理课程设计-微型操作系统的设计.doc_第4页
操作系统原理课程设计-微型操作系统的设计.doc_第5页
免费预览已结束,剩余15页可下载查看

下载本文档

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

文档简介

重庆科技学院重庆科技学院 课程设计报告课程设计报告 院(系):_电气与信息工程学院_ 专业班级: 计科普 2008-02 学生姓名: 学 号: 设计地点(单位)_ _ i515_ _ _ 设计题目:_ 微型操作系统的设计_ _ 完成日期: 2011 年 6 月 19 日 指导教师评语: _ _ _ _ _ _ _ _ 成绩(五级记分制):_ _ _ 指导教师(签字):_ _ _ 重庆科技学院重庆科技学院 课程设计任务书课程设计任务书 设计题目:微型操作系统的设计 学生姓名 课程名称操作系统原理课程设计专业班级计科普 08 地 点 i515 起止时间2011 年 6 月 12 日-2011 年 6 月 16 日 设 计 内 容 及 要 求 (1) 配置操作系统编写的所需的环境(虚拟机的建立和相应环境建立) ,以准备相 关的必须工具的准备,并学会相关工具的使用,为以后编写一个微操作系统奠 定基础和准备平台。 (2) 学习 nasm 汇编器在本次设计中的使用。 (3) 学习裸机启动的过程,消化操作系统引导程序的结构,在此基础上,完成在实 模式下从软盘引导计算机的程序编写。 (4) 学习本次设计需要的实模式到保护模式切换的相关知识。理解 gdt 在保护模式 的工作机理 (5) 编写在保护模式下的引导程序,并用 c 语言模拟写一个“内核” ,并实现在保 护模下通过引导程序启动计算机并将该“内核”加载到内存中。最后切换到内 核。 设 计 参 数 (1)写出编写一个操作系统所需的环境和操作说明书。 (2)总结计算机启动顺序和具体过程。 (3)实现在实模式下系统引导程序的编写。 (4)理解消化实模式到保护模式切换原理以及相关的数据结构和工作过程, 并实现之。 (5)完成保护模式下的引导程序,并完成“内核”的加载,并使“内核” 运行起来。 附加要求:请在设计的课后完成具有进程调度和管理的内核的编写。 进 度 要 求 6 月 12 日布置任务,对各个任务的基础知识进行讲解 6 月 12 日 安装环境,并熟悉相关工具的使用。 6 月 13 日完成实模式下引导程序的编写。 6 月 14 日完成实模式与保护模式的切换代码的设计。 6 月 15 日完成实模式引导程序和内核加载程序编写。 6 月 16 日完成答辩和报告撰写。 参 考 资 料 随任务布置的相关电子文档。 其 它 说 明 .本表应在每次实施前一周由负责教师填写二份,院系审批后交院系办备案,一 份由负责教师留用。.若填写内容较多可另纸附后。 3.一题多名学生共用的,在设计内容、参数、要求等方面应有所区别。 教研室主任: 指导教师: i 摘要 操作系统(operating system,简称 os)是一管理电脑硬件与软件资源的 程序,同时也是计算机系统的内核与基石,它为用户执行程序提供方便、最有 效的环境。 本设计任务是设计一个微型操作系统。该操作系统首先需要搭建虚拟机环 境,为编写一个微操作系统奠定基础。裸机启动的过程,实现实模式下从软盘 引导计算机的启动。完成保护模式下的引导程序,并完成“内核”的加载,并 使“内核”运行起来。 “内核”部分实现键盘中断,中断服务程序读取键盘值并 显示出来。 关键词:操作系统 虚拟机 裸机启动 键盘中断 ii 目目 录录 1 系统需求分析1 1.1 设计内容与目的 .1 1.2 设计的实现方案 .1 2.总体设计2 2.1 功能模块图 .2 2.2 计算机引导程序 .2 2.3 内核键盘中断实现 .3 3 详细设计6 3.1 启动程序实现 .6 3.2 内核键盘中断实现 .9 3.3 功能实现 11 4. 设计总结13 5 致谢.14 6 参考文献.15 1 1 1 系统需求分析系统需求分析 1.1 设计内容与目的 设计一个微型操作系统,在实模式下从软盘引导计算机启动,并在保护模 式下运行“内核” 。通过分析,该设计需要完成以下任务: (1)搭建虚拟机环境,为编写一个微操作系统奠定基础。 (2)利用 nasm 汇编器编译启动汇编程序。 (3)完成在实模式下从软盘引导计算机。 (4)学习本次设计需要的实模式到保护模式切换的相关知识。理解 gdt 在保护 模式的工作机理。 (5)编写在保护模式下的引导程序,并用 c 语言模拟写一个“内核” ,并实现 在保护模下通过引导程序启动计算机并将该“内核”加载到内存中。最后切换 到内核。 1.2 设计的实现方案 本设计完成一个真正意义上的操作系统引导,计算机启动程序将从计算机启 动时的 16 位的实模式转到现在通用的 32 位的保护模式下。现在的操作系统除 了最低层的部份之外,均由高级语言完成,在本设计中也将用高级语言来编写 内核。实现的一个内核是用 c 语言编写的。用汇编写的引导程序,把 c 语言写 的内核载入并执行,这就是本设计将要完成的主要任务。内核中的键盘中断设 计 intel 8259el 8259a 可编程中断控制器可以为 cpu 处理 8 位优先级中断, 而且,无须额外电路即可级联扩展至 64 位优先级中断处理。通过对 8259a 的 初始化和控制,可以实现在保护模式下的键盘中断。 2 2.2.总体设计总体设计 2.1 功能模块图 该设计的功能模块如下图所示: 图 2.1 功能模块图 2.2 计算机引导程序 本程序的主要功能是实现实模式和保护模式的切换。 (1)切换到保护方式的准备工作 在从实模式切换到保护模式之前,必须作必要的准备。需要建立合适的全局描述符表, 并使用 gdtr 指向该 gdt。因为在切换到保护方式时,至少要把代码段的选择子装载到 cs,所以 gdt 中至少含有代码段的描述符。 (2)由实模式切换到保护模式 在做好准备后,从实模式切换到保护模式原则上只要把控制寄存器 cr0 中的 pe 位置 1 即可。 mov eax ,cr0 ; 微型操作系统 实模式下从软盘 引导计算机 “内核”实现键盘 中断并显示键盘值 从 键 盘 输 入 值 中 断 响 应 显 示 3 or eax , 1 mov cr0 ,eax 实际情况要比这复杂些。执行上面的三条指令后,处理器转入保护模式,但 cs 中的 内容还是实模式下代码段的段值,而不是保护模式下代码段的选择子,所以在取指令之前 得把代码段的选择子装入 cs。为此,紧接着这三条指令,安排一条如下所示的段间转移指 令 jmp gdt_code_addr:code_32 ; 跳入 32 位的代码段中 这条段间转移指令 在实模式下被预取并在保护方式下被执行 。利用这条段间转移指 令可把保护模式下代码段的选择子装入 cs,同时也刷新指令预取队列。从此真正进入保护 模式。 2.3 内核键盘中断实现 要使用中断方式,就必须编写中断处理程序,通过 idt(中断描述符表) 让 cpu 知道此中断的中断处理程序在什么地方,此表的每一个表项对应一个中 断,每一个表项都指明此中断的中断处理程序在什么地方。因此首要的任务是 要构造一个中断描述符表。 中断描述符表一共可有 256 项,即 256 个中断。头三十二项,也就是 031 号中断,已经被 cpu 及硬件所占用了,因此只能从第三十三项即 32 号中断开始 构造中断及中断服务程序 。 可编程中断控制器(pic)功能上是中断驱动系统环境下的总管家,决定哪 一个输入优先级最高,确定输入请求是否拥有比当前服务级别更高的优先级, 并且将决定出的中断通知 cpu。 为了使中断系统起作用,需要对 pic(可编程的中断控制器)进行编程, pic 是可编程的中断控制器,它可以处理硬件中断请求,当硬件发生中断时, pic 把中断信号送到 cpu,然后 cpu 处理中断。实际上有两上 pic,第一个 pic1(端口号 0x200x21)处理 irq0irq7 的请求,第二个 pic2(端口号 0xa00xa1)处理 irq8irq15 的请求 cpu 只知道逻辑意义上的中断,不区分是 物理上的软件中断还是硬件中断,因此必须把 cpu 不知道的物理中断,映射为 cpu 知道的逻辑意义上的中断。在实模式下,这项工作由 bios 来做,在保护模 4 式下需要自己编程。 通过发送一些 icw(初始化命令字)来实现对 pics 的控制和初始化。 1. 发送 icw1 到 pic1(20h) 与 pic2(a0h) 中 2. 发送 icw2 到 pic1(21h) 与 pic2(a1h) 中 3. 发送 icw3 到 pic1(21h) 与 pic2(a1h)中 4. 发送 icw4 到 pic1(21h) 与 pic2(a1h)中 利用内嵌汇编发送一些 icw(初始化命令字)来实现对 pics 的控制和初始化, 实现代码如下: _asm_(“mov $0x11,%al;out %al,$0x20 n“); _asm_(“mov $0x11,%al;out %al,$0xa0 n“); _asm_(“mov $0x20,%al;out %al,$0x21 n“); _asm_(“mov $0x28,%al;out %al,$0xa1 n“); _asm_(“mov $0x04,%al;out %al,$0x21 n“); _asm_(“mov $0x02,%al;out %al,$0xa1 n“); _asm_(“mov $0x1,%al;out %al,$0x21 n“); _asm_(“mov $0x1,%al;out %al,$0xa1 n“); _asm_(“mov $0xfd,%al;out %al,$0x21 n“); _asm_(“mov $0xff,%al;out %al,$0xa1 n“); 初始化命令字格式初始化命令字格式 icw1 a0d7d6d6d4d3d2d1d0 0a7a6a51ltimadisnglic4 中断向量地址 a7- a5(仅用于 mcs- 80/85) 1:电平触发 0:边沿触发 地址调用间隔 1:4 间隔 0:8 间隔 1:单片模式 0:级联模式 1:需要 icw4 0 不需要 icw2 a0d7d6d6d4d3d2d1d0 1a15/t7a14/t6a13/t5a12/t4a11/t3a10a9a8 中断向量地址的 a15-a8(mcs-80/85) 中断向量地址 t7-t3 icw3(主片)(主片) a0d7d6d5d4d3d2d1d0 11:ir 输入有从片 0:ir 输入无从片 icw3(从片)(从片) 5 a0d7d6d5d4d3d2d1d0 100000id2id1id0 从片地址 icw4 a0d7d6d5d4d3d2d1d0 1000sfnmbufm/saeoi mpm 1:特殊全嵌套模 式 0:全嵌套模式 0x:无缓冲模式 10:缓冲模式/从片 11:缓冲模式/主片 1:自动 eoi 0:一般 eoi 1:8086/8088 模式 0:mcs-80/85 模式 pic1 处理的中断有: 0 系统时钟 1 键盘 2 重定向到 irq9 (pic2 的 irq1) 3 串口 1(com2/4) 4 串口 2(com1/3) 5 声卡 6 软驱 7 并行端口 pic2 处理的中断有: 0 实时时钟 1 来自 irq2 (pic1) 2 保留 3 保留 4 鼠标 5 数学协处理器 6 硬盘 7 保留 因此,我们只要打开 pic1 的 1 号键盘中断就可以实现实模式下的键盘中断功能。 通过这两条内嵌汇编:_asm_(“mov $0xfd,%al;out %al,$0x21 n“); _asm_(“mov $0xff,%al;out %al,$0xa1 n“); 就可以在保护模式下打开键盘中断。 6 3 3 详细设计详细设计 3.1 启动程序实现 bits 16 org 0x7c00 jmp main ; 数据定义 bootdrive db 0 ; - ; gdt 定义,此处定义段及段描述符 gdt: gdt_null: 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 11001111b 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 , ax ; 设置 ds 7 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)处, 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 .readfloppy ; 如果出错则重试(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 32 code_32: mov ax ,gdt_data_addr ; 以下三句设置 ds,es,ss,fs,gs ;为数据段描述表的位置 mov ds , ax mov es , ax mov ss , ax 8 mov fs , ax mov gs , ax mov esp , 0xffff ;设置堆栈的头指针 jmp gdt_code_addr:0x9000 ; 跳入内核, ; gdt_code_addr 是定义的代码段的描述符所在的索引 ; 由于我们先前是把内核读到了 0x9000 的位置, times 510-($-$) db 0 db 0x55 db 0xaa 分析:分析:用 nasm 对汇编代码进行编译:nasm load.asm -o load.bin 编译成功后的 load.bin 作为操作系统实模式下计算机的引导程序。 程序大体流程图如下: 图图 .1 引导程序流程图引导程序流程图 开始 定义段及段描述符, 并设置段及段描述 符的属性 选择启动磁盘 设置读磁盘功能号 第二个扇区开始读 是否出错? 关中断 载入 gdt 描述符 跳入 32 位的代码段 中 结束 是否 9 3.2 内核键盘中断实现 typedef struct unsigned long dword0 ; unsigned long dword1 ; segment_desc; unsigned char* videomem = (unsigned char*)0xb8000; segment_desc idt256; unsigned long idt_desc2; unsigned long idt_addr; unsigned long keyboard_addr; unsigned long idt_offset =0x8; void keyboard_interrupt(); int main() _asm_(“mov $0x11,%al;out %al,$0x20 n“); _asm_(“mov $0x11,%al;out %al,$0xa0 n“); _asm_(“mov $0x20,%al;out %al,$0x21 n“); _asm_(“mov $0x28,%al;out %al,$0xa1 n“); _asm_(“mov $0x04,%al;out %al,$0x21 n“); _asm_(“mov $0x02,%al;out %al,$0xa1 n“); _asm_(“mov $0x1,%al;out %al,$0x21 n“); _asm_(“mov $0x1,%al;out %al,$0xa1 n“); _asm_(“mov $0xfd,%al;out %al,$0x21 n“); _asm_(“mov $0xff,%al;out %al,$0xa1 n“); keyboard_addr = (unsigned long)keyboard_interrupt ; idt0x21.dword0 = (keyboard_addr _asm_( “lidt %0n “ “sti “:“=m “(idt_desc); while(1); return 0; void keyboard_interrupt() *videomem+ = c; *videomem+ = 0x1b; 10 分析分析: (1)在 linux 下编写好此 c 语言程序,输入以下命令进行编译: gcc -c xyb.c 其中 -c 表示只编译不链接 ld -o xyb -ttext 0x9000 -e main xyb.o 其中-o 表示输出文件名,-ttex 0x9000 表示程序基址定为 0x9000 -e main 表示从 main()开始执行 objcopy -r .note -r .comment -s -o binary xyb xyb.bin -r .note -r .comment 表示移掉 .note 与 .comment 段 -s 表示移出所有的标志及重定位信息 -o binary xyb xyb.bin 表示由 xyb 生成二进制文件 xyb.bin (2)代码用到了内嵌汇编,如: _asm_(“mov $0x11,%al;out %al,$0x20 n“); 代表的意思为:将 0x11 的值发送到 0x20 端口中。 (3)程序流程图: 图 3.2.1 内核程序流程图 实模式下引导计算机进入内核 发送 4 个 icw 对 pic 初始化 设定中断屏蔽字,只许键盘中断 设置键盘中断处理程序位置 获得整个 idt 的位置描述 用 lidt 指令载入 idt 表 进入 while(1)等待键盘中断 11 3.3 功能实现功能

温馨提示

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

评论

0/150

提交评论