怎样用c语言开发操作系统

怎样用c语言开发操作系统

ID:14268064

大小:45.50 KB

页数:19页

时间:2018-07-27

怎样用c语言开发操作系统_第1页
怎样用c语言开发操作系统_第2页
怎样用c语言开发操作系统_第3页
怎样用c语言开发操作系统_第4页
怎样用c语言开发操作系统_第5页
资源描述:

《怎样用c语言开发操作系统》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、怎样用C语言开发操作系统怎样用C语言开发操作系统尽管我的题目是“用C语言写操作系统”,但是,仅仅使用C语言是写不出操作系统的。现代操作系统的主体部分是用C语言写的。我是在Windows环境下开发的,而不是大多数人选择的Linux环境。开发工具也是Microsoft公司的开发工具:masm615和VC15。微软公司的masm流传甚广,大家应该不陌生。对vc15可能较陌生,vc15堪称开发DOS程序的最“高档”编译器(尽管有很多BUG)。如果实在找不到这些开发工具,使用TASM、TurboC或者BorlandC++都是可以的

2、。所给出的例子以masm615和vc15为准,转移到TASM、TC或BC平台,应该不难。有一条原则需要注意,在这里,源码必须使用TINY模式编译,也就是说,必须生成实模式代码。1.建立开发环境将masm613和vc15的压缩包分别解压到e:masm615和e:msvc15目录下。你也可以放到其他目录下,根据自己的情况而定,但是下面用到的编译命令需要作相应的修改。也不需要添加或修改任何的环境变量。2.IBMPC的启动及当时的内存使用情况这一部分内容已经是老生常谈了,但又不能不说。我们只说从硬盘引导的情况。当BIOS经过

3、POST(PowerOnTestSelf)后,将硬盘MBR读到内存0x0000:0x7C00的位置,然后从这里开始执行。一般的情况,MBR将选择活动分区进行操作系统的启动。在MBR开始执行时,内存使用的情况如下图所示,地址数据用16进制表示:这已经是老掉牙的内容了,但是,在20年前却十分流行。如果想更详细的了解这方面的内容,找本讲解DOS的书看看吧。我们自己的操作系统将被加载到0x1000:0x0100。这不是必需或者必然的,是人为选择的,你也可以将其放在0x4321:1234等其他地方。但是,上图中注明有其他用途的内存

4、区域,应该保留,否则,你会后悔的。3.开发操作系统我们自己的操作系统运行在实模式环境下。即使你的电脑是P4的CPU,刚启动时,也只相当于主频较高的8086而已。首先,使用汇编语言写一个框架,文件名是entry.asm:;;entry.asm;.MODELTINY,C.386poptionexpr32optioncasemap:nonecmainPROTONEARC.CODEORG0100h;偏移地址_start:jmpbeginnopDB'TianXiangYuan',0begin:climovax,csmovds,ax

5、moves,axmovss,axmovsp,0FFFFhsticallcmain;调用C语言写的主函数movax,4c00h;调用DOS的功能(为了调试),与我们自己的操作系统无关int21h已经说了,操作系统将从0x1000:0x0100加载,说是无心,实则有意。我们知道,TINY模式的程序,在DOS下运行时,其起始地址就是0x0100,前面的256Byte是参数部分。如果直接将操作系统在系统启动时加载到0x1000:0x0100,调试时非常麻烦。我们将其起始地址设为0x0100,使其可以在DOS下运行(这也是在程序的

6、最后包含int21h指令的原因),确认正确无误后,再进行下一步的开发。下面再看C语言的代码,文件名是main.c:……staticvoidInitShell(){}voidcmain(){InitShell();TermShell();}顾名思义,其中实现了一个简单的shell。因为该程序本身是操作系统的一部分,所以,平时经常使用的一些C库函数,在这里就不能使用了。总之,一切都要自己动手实现。幸好,在实模式下,几乎所有的设备的驱动都包含在BIOS中了,我们可以直接使用。否则,连从键盘读一个键值这样的事都需要自己写键盘的驱

7、动程序,实在太难了。也是这个原因,我们自己的操作系统没有将CPU转到保护模式下,有心之人可以试试。下面的事情几乎都可以使用C语言实现了。第一,初始化显示模式。系统启动时,显卡已经被初始化成3模式了,就是80X25的彩色模式(除非你的显示器是单色显示器)。当然,你也可以将显卡设成VGA甚至SVGA模式,只要你的BIOS和显卡支持。第二,实现一个具有简单交互功能的shell。代码不全,请自己补齐。/**从键盘读一个字符,如果没有输入,则等待;返回值的低字节为asii码,高字节为键盘扫描码*/staticintgetch(){

8、intchr=0;__asm{movah,00hint16hmovchr,ax}returnchr;}/**使用TTY模式向屏幕输出一个字符*/staticvoidputch(unsignedcharkey){__asm{movbh,0moval,keymovah,0Ehint10h}}#defineKEY_BACK

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。