基于Intel X86平台的32位多任务操作系统的实现.docx
- 文档编号:10509128
- 上传时间:2023-02-17
- 格式:DOCX
- 页数:71
- 大小:897.76KB
基于Intel X86平台的32位多任务操作系统的实现.docx
《基于Intel X86平台的32位多任务操作系统的实现.docx》由会员分享,可在线阅读,更多相关《基于Intel X86平台的32位多任务操作系统的实现.docx(71页珍藏版)》请在冰豆网上搜索。
基于IntelX86平台的32位多任务操作系统的实现
某某学校
毕业论文(设计)
基于IntelX86平台的32位多任务操作系统的实现
学生姓名:
XXXX学号:
K030841305
系别:
信息工程系专业:
计算机科学与技术
指导教师:
XXXX评阅教师:
论文答辩日期
答辩委员会主席
摘要
操作系统是计算机系统的核心和灵魂,是计算机系统必不可少的组成部分。
计算机发展至今,无论个人计算机还是巨型计算机,都无一例外的配置一种或多种操作系统。
操作系统为人们建立各种应用环境奠定了坚实的基础。
本文详细阐述了在ubuntu环境下以gcc和nasm作为编译工具、以kate作为编辑工具、以bochs作为运行以及调试工具、最终实现一个简单的基于X86平台的多任务操作系统。
本系统主要分为boot启动模块,loader加载模块,内核,FS文件系统,TTY输入输出系统,MM内存管理系统等六大模块。
在操作系统启动后以文件系统为核心实现各个系统的交互,以求达到响应输入输出操作、进程运行等操作系统核心任务以及对硬件资源的管理。
关键词:
操作系统,GCC编译器,X86平台,内核,编辑工具
Abstract
Theoperatingsystemisthecoreandsoulofcomputersystem,computersystemisanessentialcomponent.Nomatterthepersonalcomputerorhugecomputerallconfigoneormoreoperatingsystems,whichlaysthesolidfoundationtoestablishvariousapplicationenvironmentforpeople。
ThispaperpresentsindetailwithubuntuenvironmentnasmforcompilationandGCCtools,toKateaseditingtools,tobochsasoperationanddebuggingtools,finallyrealizeasimplebasedontheX86platformmultitaskingoperatingsystem.
Thissystemmainlydividedintobootstartmodule,loaderloadingmodule,thekernel,FSfilesystem,TTYinput/outputsystem,MMmemorymanagementsystemandsoonsixbigmodules.Intheoperatingsystemwiththefilesystemstartedasthecoreofthesystemrealizedeachinteraction,toachieveresponseinput/outputoperation,processoperation,suchasthecoretaskandoperatingsystemtothehardwareresourcesmanagement.Keywords:
Operatingsystem,GCC,platformofX86,Kernel
目录
摘要I
AbstractII
1绪言1
1.1课题背景1
1.2国内外现在以及发展方向1
1.3开发环境及开发工具3
2系统运行流程以及相关技术简介4
2.1系统运行流程4
2.2相关技术简介5
2.2.1boot加载loader5
2.2.2loader加载kernel5
2.2.3Kernel调整到正确内存位置5
2.2.4内存的读取5
2.2.5分页机制6
3系统设计与模块交互7
3.1系统设计7
3.1.1系统总体结构7
3.1.2BOOT的设计7
3.1.3LOADER的设计8
3.1.4内核的设计11
3.1.5TTY系统25
3.1.6硬盘驱动28
3.1.7文件系统31
3.2模块之间的交互35
3.2.1内核与TTY模块的交互35
3.2.3内核与内存管理系统的交互35
3.2.4文件系统与TTY的交互36
3.2.5文件系统与内存管理系统的交互36
3.2.6文件系统与硬盘驱动的交互36
4系统实现37
4.1程序运行截图37
4.2关键代码42
5总结与展望49
致谢50
参考文献51
附录英文缩写词53
1绪言
本文阐述了操作系统的研究背景,研究的目的及意义,现状以及发展方向,以及开发工具以及开发环境。
1.1课题背景
操作系统并不是与计算机硬件一起诞生的,它是在人们使用计算机的过程中,为了满足两大需求:
提高资源利用率、增强计算机系统性能,伴随着计算机技术本身及其应用的日益发展,而逐步地形成和完善起来的[1]。
操作系统从无到有,从人工操作阶段到管理程序阶段到批处理系统躲到程序系统再到分时系统实时系统以及现在的通用操作系统。
在短短的几十年内操作系统取得了长足的发展,并且在未来操作系统还将不断的完善和创新以适应各种硬件换件和特殊用途。
在如今技术高速发展的今天,操作系统也存在于我们每一个人的身边。
在我们使用的pc机上装着Windows/Linux/Mac等操作系统。
其实不仅是我们的pc机上装有操作系统,在手机以及其他各种移动终端设备上也装有操作系统。
操作系统的使用不仅在生活上而且军事上等等各种领域都有广泛的应用。
综上,操作系统做为一个管理硬件提资源利用率增强计算机系统性能的软件用于我们的各种设备之中。
1.2国内外现在以及发展方向
现在世界上的主流操作系统有Windows,Unix,Linux,MacOs,IOS以及Android等几大操作系统。
(1)Windows
Windows作为一款通用操作系统由美国微软公司推出。
从16位、32位到64位操作系统一路升级。
从最初的windows1.0到大家熟知的Wwindows95、WindowsNT、Windows97、Windows98、Windows2000、WindowsMe、WindowsXP、WindowsServer、WindowsVista,Windows7.以及刚刚推出的Windows8。
微软早期开发的Windows实际只是基于Dos系统之上的一个图形应用程序,并通过Dos来进行文件操作。
直到Win2000的发布,Windows才彻底的摆脱了Dos,成为真正独立的操作系统。
至Wwindows已经开始推出Windows8操作系统[2]。
(2)Unix
Unix操作系统,是美国AT&T公司于1971年在PDP-11上运行的操作系统。
具有多用户、多任务的特点,支持多种处理器架构,最早由肯·汤普逊(KennethLaneThompson)、丹尼斯·里奇(DennisMacAlistairRitchie)和DouglasMcIlroy于1969年在AT&T的贝尔实验室开发。
1978年,对Unix而言是革命性的一年;因为学术界的老大柏克利大学(UCBerkeley),推出了一份以第六版为基础,加上一些改进和新功能而成的Unix。
这就是著名的“1BSD(1stBerkeleySoftwareDistribution)”,开创了Unix的另一个分支:
BSD系列。
同时期,AT&T成立USG(UnixSupportGroup),将Unix变成商业化的产品。
从此,BSD的Unix便和AT&T的Unix分庭抗礼,Unix就分为SystemIV和4.xBSD这两大主流,各自蓬勃发展。
(3)Linux
Linux是一种自由和开放源码的类Unix操作系统。
目前存在着许多不同的Linux,但它们都使用了Linux内核。
Linux可安装在各种计算机硬件设备中,从手机、平板电脑、路由器和视频游戏控制台,到台式计算机、大型机和超级计算机。
Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。
严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。
Linux得名于计算机业余爱好者LinusTorvalds。
Linux操作系统的诞生、发展和成长过程始终依赖着以下五个重要支柱:
UNIX操作系统、MINIX操作系统、GNU计划、POSIX标准和Internet网络。
Linux作为一款自由软件其体现了“自由”和“开放”的思想。
在全世的计算机爱好者通过internet参与开发使其迅速发展[3]。
(4)MacOs
Mac系统是苹果机专用系统,是基于Unix内核的图形化操作系统。
一般情况下在普通pc上无法安装的操作系统。
由苹果公司自行开发。
苹果机现在的操作系统已经到了OS10,代号为MACOSX(X为10的罗马数字写法),这是MAC电脑诞生15年来最大的变化。
新系统非常可靠;它的许多特点和服务都体现了苹果公司的理念。
另外,现在疯狂肆虐的电脑病毒几乎都是针对Windows的,由于MAC的架构与windows不同,所以很受到病毒的袭击。
MACOSX操作系统界面非常独,突出了形象的图标和人机对话[4]。
(5)IOS
IOS是由苹果公司开发的手持设备操作系统。
苹果公司最早于2007年1月9日的Macworld大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPodtouch、iPad以及AppleTV等苹果产品上。
iOS与苹果的MacOSX操作系统一样,它也是以Darwin为基础的,因此同样属于类Unix的商业操作系统。
原本这个系统名为iPhoneOS,直到2010年6月7日WWDC大会上宣布改名为iOS。
(6)Android
Android,中国大陆地区较多人使用安卓(非官方)或安致(官方)。
Android操作系统最初由AndyRubin开发,最初主要支持手机。
2005年由Google收购注资,并组建开放手机联盟开发改良,逐渐扩展到平板电脑及其他领域上。
Android的主要竞争对手是苹果公司的iOS以及RIM的BlackberryOS。
2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。
2011年11月数据,Android占据全球智能手机操作系统市场52.5%的份额,中国市场占有率为58%。
操作系统的发展往往是根据硬件设备的发展而发展的。
处于后pc时代,以及高度网络化的现在未来操作系统的发展我认为趋向于两个方向:
一个是分布式操作系统,另外一个是各种职能终端设备上的嵌入式操作系统。
1.3开发环境及开发工具
(1)操作系统
Ubuntu是一个以桌面应用为主的Linux操作系统,Ubuntu基于Debian发行版和GNOME桌面环境,与Debian的不同在于它每6个月会发布一个新版本。
Ubuntu的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。
Ubuntu具有庞大的社区力量,用户可以方便地从社区获得帮助。
(2)C语言编译器
GCC(GNUCompilerCollection,GNU编译器套装),是一套由GNU开发的编程语言编译器。
它是一套GNU编译器套装以GPL及LGPL许可证所发行的自由软件,也是GN计划的关键部分,亦是自由的类Unix及苹果电脑MacOSX操作系统的标准编译器。
(3)汇编编译器
NASM是一个为可移植性与模块化而设计的一个80x86的汇编器。
它支持相当多的目标文件格式,包括Linux和'NetBSD/FreeBSD','a.out','ELF','COFF',微软16位的'OBJ'和'Win32'。
它还可以输出纯二进制文件。
它的语法设计得相当的简洁易懂,和Intel语法相似但更简单。
它支持'Pentium','P6','MMX','3DNow!
','SSE'and'SSE2'指令集[5]。
(4)编辑器
Kate是linux下的一个多文档编辑器。
由ChristophCullmann等开发,基于GNULesserGeneralPublicLicense(LGPL)Version2许可发布。
Kate基于重写的kwrite版本,不仅提供kwrite的所有功能,还增加了很多独有的功能。
自从Kate2.2以来,它已经被移到KDE4的kdesdk包里,并且作为桌面的内建组成部分。
作为一个KDE原生程序,Kate当然与生俱来的具有网络透明性,并且整合了KDE的优秀特性。
Kate可以用来从konqueror浏览器查看HTML源代码、编辑配置文件、写新的程序或者做其他文本编辑任务。
Kate是一个多视点的编辑器。
可以对同一个文档打开多个编辑窗口,并且它们是同步的。
也可以同时打开多个文档以便参考或同时编辑。
(5)运行及其调试环境
Bochs是一个x86硬件平台的开源模拟器[7],它可以模拟各种硬件的配置。
Bochs模拟的是整个PC平台,包括I/O设备、内存和BIOS。
事实上,它可以在任何编译运行Bochs的平台上模拟x86硬件。
通过改变配置,可以指定使用的CPU(386、486或者586),以及内存大小等。
Bochs是电脑里的“PC”。
根据需要,Bochs还可以模拟多台PC。
2系统运行流程以及相关技术简介
2.1系统运行流程
本系统运行于bochs下,由软盘实现启动。
整个流程如下:
(1)bochs加电自检
(2)寻找启动盘(我们设置的是软盘启动)
(3)检查软盘的0面0刺刀1扇区,并检查它是不是以0XAA55结束
(4)若第三满足,则将启动扇区的内容装载到内存地址0000:
7c00处
(5)执行boot(被bios装载到内存7c00处,此扇区存放的内容就是我们的boot)
(6)Boot加载loader到内存
(7)跳到loader处执行loader
(8)初始化GDT全局描述符表
(9)初始化段选择子
(10)设置堆栈
(11)得到内存大小
(12)在软盘中寻找kernel内核并加载到内存
(13)关闭软驱马达
(14)跳入保护模式
(15)保存内存大小,内核物理位置等关键数据以待以后用
(16)打印出内存信息
(17)启动分页机制
(18)初始化内核
(19)正式跳入内核
(20)挪动堆栈
(21)取得gdt_ptr
(22)复制到新的GDT
(23)初始化中断相关
(24)加载新的GDT
(25)加载IDT
(26)加载TSS
(27)初始化进程相关,以及我们需要启动的进程
(28)处理器跳到第一个进程TTY进程开始执行系统任务和用户进程,至此,系统成功启动,并开始正常运行。
模块加载内存图如图2.1。
注意:
a.KERNEL是loader通过kernel.bin的信息加载到正确位置的
b.当boot加载loader后boot所占的内存就已经没用了在kernel加载入内存后
boot所占内存属于kernel。
图2.1模块加载内存图
2.2相关技术简介
2.2.1boot加载loader
我们使用的是软盘启动,boot,loader,kernel等都是存储于软盘之上。
Bios将boot加载到7c00h处后开始执行bott来加载loader。
软盘的文件系统是FAT12。
所以加载步骤是先在根目录区找到指定文件的文件名(此处是loader)然后对照FAT1来确定文件所占的扇区。
通过BIOS13号中断来把找到的每个扇区加载到指定内存里面。
2.2.2loader加载kernel
Loader加载kernel与boot加载loader是相同的操作,只是加载的文件不同。
2.2.3Kernel调整到正确内存位置
Loader将kernel加载到内存后,还必须将其调整到正确的位置上。
调整数据是由Loader完成的。
kernel是ELF文件。
所以loader根据ELF文件的程序头表(programheadertable)中的相关数据将内核加载到正确位置[8]。
2.2.4内存的读取
操作系统必须知道自己的内存有多大,这样才能根据内存的大小进行资源的分配。
在本系统中通过BIOS15号中断读取内存大小。
2.2.5分页机制
本的操作系统选择分页机制作为内存管理。
分页机制的启动在进入保护模式后跳入内存前启动分页机制。
通过读取内存的大小计算出有多少个PDE及其PTE。
来实现映射。
3系统设计与模块交互
3.1系统设计
3.1.1系统总体结构
如图3.1所示为系统总体结构图。
图3.1系统总体结构图
3.1.2BOOT的设计
BOOT的主要任务就是加载loader入内存。
但是BOOT本身由bios加载入7c00处所以在写BOOT的时候需要注意加上org7c00。
所以在进入boot后首先调用bios10号中断对屏幕清屏,然后在软盘的根目录下寻找loader.bin。
找到之后就找到了文件对应在FAT1中对应的位置。
然后根据FAT的数据读取指定软盘中的扇区,一直到读完即可。
图3.2为加载loader如内存流程图。
图3.3为FAT软盘结构图,我们就是按照这个格式来操作软盘的。
3.1.3LOADER的设计
图3.2加载loader入内存流程图
图3.3FAT12软盘格式
1.加载内核入内存
加载内核入内存与加载loader入内存相似。
2.得到内存大小
计算机需要知道自己硬件资源的多少以便进行硬件资源的管理和分配。
所以需要在进入保护模式前得到内存的大小,以在后面启动分页机制时作为其分页的根据。
进入保护模式前得到内存大小是因为BIOS中断只能够在实时模式下调用,进入保护模式后就无法调用。
首先初始化15号中断各项值,并且申请一块内存放地址描述符ARDS的缓冲。
最后不断的调用15号中断知道ebx的值为0且cf没有进位那么则表示地址读完。
在不断循环的同时我们保存循环的次数,也就是地址描述符的次数以便于通过ADRS等来计算内存的大小。
图3.4为其流程图。
图3.4得到内存流程图
3.跳入保护模式
在跳入保护模式前需要先做以下准备工作:
(1)准备GDT;
(2)用lgdt加载GDTPTR。
GDTPTR为一个数据结构占48位,前32位为GDT的基地址,后16位为界限;
(3)打开A20地址线。
因为历史遗留原因所以必须打开它;
(4)置cr0的PE位。
打开PE位,此位为0表示cpu运行于实时模式,为1表示运行于保护模式;
(5)跳转进入保护模式。
Jmp跳转。
4.启动分页机制
在跳入保护模式前需要启动分页机制。
首先通过已经计算出来的内存大小来计算出需要初始化多少页目录表,然后根据页目录表来初始化相应数量的页表,来实现分页映射[9]。
图3.5为分页机制流程图。
分页机制启动后其映射关系如图3.6所示。
图3.5分页机制流程图
图3.6分页映射物理内存图
5.调整内核到正确的内存位置
内核是ELF文件。
在loader将kernel.bin加载入内存后还需要根据kernel的ELF文件头的程序头表中的内容将kernel加载到正确的位置[10]。
图3.7为其流程图。
图3.7调整内核到正确位置流程图
3.1.4内核的设计
在loader中跳入保护模式并启动分页机制后跳入内核开始执行。
本系统内核是以微内核的模式来实现。
所以在内核中主要做以下三个任务:
处理中断,进程调度,进程间通信。
微内核相比于宏内核微内核的思想更加优雅,结构化更加好。
但在效率上与宏内核相比略有不足。
微内核[11]处理的任务简单,在本操作系统中内核仅仅处理了中断,进程调度以及进程间通信等三个任务。
反观宏内核,确实包办一切[12]。
1.处理中断
中断是用以提高计算机工作效率、增强计算机功能的一项重要技术。
最初引入硬件中断,只是出于性能上的考量。
如果计算机系统没有中断,则处理器与外部设备通信时,它必须在向该设备发出指令后进行忙等待(Busywaiting),反复轮询该设备是否完成了动作并返回结果。
这就造成了大量处理器周期被浪费。
引入中断以后,当处理器发出设备请求后就可以立即返回以处理其他任务,而当设备完成动作后,发送中断信号给处理器,后者就可以再回过头获取处理结果。
这样,在设备进行处理的周期内,处理器可以执行其他一些有意义的工作,而只付出一些很小的、切换上下文所引发的时间代价。
后来被用于CPU外部与内部紧急事件的处理、机器故障的处理、时间控制等多个方面,并产生通过软件方式进入中断处理(软中断)的概念[13]。
中断处理主要涉及下以下内容的处理:
(1)中断初始化
(2)中断框架的建立
(3)特权级转变
(4)中断重入问题的解决
(5)时钟中断
(6)键盘中断
(7)硬盘中断
在进入内核后,首先处理完从loader跳入内核的一些后续事情,比如替换堆栈,替换GDT等。
然后开始初始化中断。
在初始化中断之前需要先初始化8359A主从片,如图3.8所示。
8259A是中断机制中所有外围设备的代理,它不仅可以根据优先级在同时发生中断的设备中选择应该处理的请求,而且可以通过对其寄存器的设置来屏蔽盒打开中断。
所以在具体初始化中断之前,应该先初始化8259A从主片。
初始化8259A是通过向其端口写入ICW。
主82159A的端口是20h和21h,从8259A的端口是A0h,A1h。
整个过程如下:
(1)往端口20h(主片)或A0(从片)写入ICW1
(2)往端口21h(主片)或A1h(从片)写入ICW2
(3)往端口21h(主片)或A1h(从片)写入ICW3
(4)往端口21h(主片)或A1h(从片)写入ICW4
图3.88259A连CPU图
在8259A初始化好之后开始初始化中断(我们把所有的异常都按照中断来初始化)。
其实初始化中断很简单就是建立中断门描述符与中断例程的联系。
而中断门描述符通过中断向量来找到。
其流程如图3.9所示。
在介绍完中断初始化后下面介绍下本系统的中断框架。
图3.9中转跳转图
首先,简要介绍一下整个中断触发后的过程。
如图3.9所示触发80号中断。
虽然这是一个软中断的触发。
但其实硬中断和软中断的跳转过程基本是一样的只是中断源不同。
在触发80号中断后通过中断门(中断门在初始化的时候就已经初始化和中断例程相联系)跳转到对应代码位置。
其实完整的跳转过程是先通过中断门里面的选择子找到对应代码段的GDT然后通过GDT找到对应代码段,最后通过中断门中的偏移量找到对应代码段中的中断处理程序所在然后cpu开始执行中断例程[15]。
在发生中断后首先保存原寄存器的值然后判断是否中断重入来判断是否需要改变堆栈之后屏蔽当前中断,发送EOI允许继续接收中断(以屏蔽的中断除外),在调用相应的中断例程,处理完后恢复屏蔽中断跳出回到调用中断的位置[16]。
所以本系统的中断允许嵌套中断
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于Intel X86平台的32位多任务操作系统的实现 基于 Intel X86 平台 32 任务 操作系统 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)