c++vstextouta怎么用_计算机自制操作系统(十二):用C语言开发内核,详析C语言机制...

0e9a84244e1af57b7998b31bb738aea6.png

一、为什么要用C语言

我曾经的理想是一直用汇编语言来编写操作系统,因为只有用汇编语言才能感觉到自己是下沉到计算机的最底层来控制它,一旦动用了其它的更高级的语言(如C语言),会让自己觉得自己的工作再也不那么“纯粹”了。因为高级语言是建立在已有操作系统和别的编译器基础之上的。我们的目标本来就是从0开始造一个操作系统,可是还没写出来之前就先用了别人的操作系统和工具了,这样的感觉让人感到气馁。

但是,换个角度想就完全有不同的感受了。难道用汇编语言来写操作系统就没有建立在别人的工作基础之上吗?一样的需要汇编语言汇编器啊,别人同样为你做了很多的工作。我们在前面写汇编语言编写操作系统的过程中,用了无数的工具、软件和API(如BIOS中断)等,这些全都是建立在别人的工作基础上的。哪怕是你用纯粹的机器代码来写操作系统,最后把机器代码写进启动设备的时候,还得借用别人做好的工具呢。就算你有办法把机器代码弄进设备里面,计算机识别机器代码并正确执行还需要硬件电路支持呢;硬件电路需要数字电路,数字电路需要电子设备,电子设备需要半导体,半导体需要物理材料......因此,你究竟觉得应该从哪里做起才叫从0开始呢?这显然是没有止境的。

但是,这个世界确实有只用汇编语言来编写的操作系统。大名鼎鼎的MenuetOS就是:

MenuetOS​www.menuetos.net

而且这个操作系统的优秀让人吃惊:像WINDOWS一样的一个包含各种功能的视窗操作系统,它的安装镜像全部加起来只有一张软盘(1.44MB)大小,所以汇编语言的优势是十分明显的。虽然仅用汇编语言编写且容量如此渺小,但是这个操作系统可以打游戏、办公、上网、看电影等,是两个国外的牛人坚持了数10年之久完成的杰作。惊叹于他们的这份毅力和坚持,是我一直崇拜的偶像。从某种程度上讲,此专栏的诞生就是受到他们的启发而作。

但是,我在自制操作系统进入到32位之后,坚持用汇编语言的想法却一下就改变了。在16位的实模式下,操作系统主要涉及MBR启动、磁盘读写、BIOS中断、内核装载LOADER、进入保护模式等流程,这些都是汇编语言的强项,因此操作系统在进入32位保护模式前,用汇编语言是最好的选择。但是在进入32位之后,重点的工作就是开发操作系统内核了,开发内核涉及的工作就太多了。保护模式下,BIOS中断再也不能使用了,一切计算机硬件设备的控制都需要自己来编程,硬件涉及显卡、键盘、鼠标、硬盘......软件涉及进程、任务、调度。这些工作的完成如果再用汇编语言的话,工程量就太大了。

这是因为汇编语言最大的劣势是缺乏足够的封装,一切的运算和操作都需要自己来设计,这就要求开发人员必须要非常的熟悉处理器的指令手册(比如INTEL系列CPU指令手册),一份指令手册动辄就是几百个指令集。说实话,要不是长期做CPU底层方面的特殊开发工作,普通的计算机学习和应用者又会有几人能很专业的掌握呢。

比如现在我们需要一个计算:a=x/y;b=x%y的过程,用汇编语言实现,步骤的步骤如下:

1.查询INTEL系列CPU指令手册,手册上写的指令格式是:DIV r/m32。

2.放操作数:

2.1 x必须要放进EAX:mov eax,x

2.2 y可以有一些选择(如EBX、EDX),我们可以把它放进EBX:mov ebx, y

3.指令执行:DIV EBX。

4.取操作结果:

4.1 商必须要从EAX 中取: mov a,eax

4.2 余数必须要从EDX 中取: mov b,edx

就这简单的一个除法,就必须动用以上复杂的过程。其实倒不是说汇编语言有多么的烧脑和复杂,主要是它非常的繁琐,繁琐得你今天学会了这个除法写法,但后天就会忘记了,所以下次遇到还必须得重新重复以上过程。这样一来,用汇编语言编程,大量的时间和精力都会花在这些细枝末节上面,主体的工作反而会进展得非常的缓慢,这样就会逐渐消除编程者的信心和成就感,偏离我们的学习目标。

我们是在开发操作系统,编码量得多大啊。所以这个时候,C语言的优势体现就毫无疑问:上面的问题,只需两句语句a=x/y;b=x%y就解决,根本不需要开发者关心和掌握哪些寄存器参与了,然后从哪些寄存器取结果。这些过程,C语言编译器都替你完成了。

结论:以后的工作就必须要使用C语言了。

但我要再一次向坚持使用纯汇编语言的大神们致敬!

二、怎么使用C语言

先来回顾一下,到目前为止,我们的操作系统进展到什么程度:

fccd0241eff23bd724967b26dca06754.png

其中,Loader.asm和Kernel.asm的完整程序代码在前面的章节中已经贴出。目前由于开发工作遇到了效率瓶颈,现在我们就需要用C语言来继续进行我们的工作---操作系统内核的编写。其实,从上图中可以看到我们进入保护模式的时候,程序都不应该叫做内核,顶多叫做装载而已,名字明显起早了。但是,当时一步步的学习,不是有很多不懂的地方嘛,也没关系,就姑且这样吧。那我们以后的工作就是集中精力编写Kernel.c这个程序,终极目标就是让它变成一个完整的操作系统。

图中可以看出,操作系统完整的程序执行过程:Loader.asm--->Kernel.asm--->Kernel.c。那我们现在就只需要把Kernel.c在内存上顺序的布置在Kernel.asm的后面即可。那怎么才能把Kernel.c贴在Kernel.asm的屁股后面呢,方法就是把Kernel.asm编译成的二进制文件(Kernela.bin)和Kernel.c编译成的二进制文件(Kernelc.bin)连接在一起嘛:

copy /b Kernela.bin+Kernelc.bin Kernel.bin

这样得到新的Kernel.bin文件就可以利用Loader.asm进行装载了。Kernela.bin倒是非常的简单,直接一条NASM编译命令就可,前面都已经完成该项工作了,本章我们就来研究怎么才能得到Kernel.c编译之后的二进制文件。

  1. 传统的C编译器不适合

假设我们现在的任务是要在屏幕上显示一个红色的字母"C",汇编程序应该是这样写:

;保护模式下,此程序正常运行的前提是DS要先映射到物理地址:0Xb8000.
mov byte [00],'C'  ;显示字符
mov byte [01],0x0c;红色

将这段代码编译之后,机器码如下,我们需要记住这段机器码。

3fbcece827591832482839f34968ce7e.png

现在我们换成用C语言来编写,最小格式如下:

/* file:zh.c */

int main()
{
*(char *)(00) = 'C';
*(char *)(01)= 0x0c;
stop:goto stop;
return 0;
}

程序中,我们必须定义main函数,否则无法通过C编译器编译。最有名的C编译器无疑是GCC,某种意义上讲GCC是UNIX的代表,但是由于我这次一直是在WINDOWS的环境下开发的,没有借助于任何的UNIX系统,因此还需安装WINDOWS版本的GCC编译器---MinGW。用GCC编译上面程序:

e474e244496c4006f6e1d2876511ca16.png

就可以得到C语言编译之后的二进制目标程序:zh.o,我们打开该文件看看:

a8db43ab20db9fbd591913f4fb0ca36d.png

可以看出,这个和汇编语言NASM编译出来的机器代码并不一样,我们只找到了JMP $这条指令对应的机器代码,但是我们能隐约地感觉到前面两句应该就是我

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
网页文学空间程序作业 <html> <head> <title>我的日记</title> </head> <body> <style type="text/css"> body,td,th { font-size: 20px; color: #F0F; font-style: italic; } body { background-image: url(Mypsd_13870_201102141734070002B.jpg); } .b1{border:5px solid blue} .b2{border:2px solid green} </style> <center> <h2>我的日记</h2> </center> <img class=b2 src="50da81cb39dbb6fda57034890924ab18972b3772.jpg"width="100px" height="100px"alt="broadview banner"> ■<a href="登录成功.html"><input name="button" type="button" value="主页"></a> ■<a href="我的小文库.html"><input name="button" type="button" value="我的小文库"></a> ■<a href="我的相册.html"><input name="button" type="button" value="相册"></a> <hr> <marquee onmouseover="this.stop()"onmouseout="this.start()" direction="up" scrollamount="4"> <a href="日记1.html"> 读《谈艺录》之“诗分唐宋”、“神韵”、“长吉诗”一.诗分唐宋 1.“所谓古今之别,非谓时代,乃言体制”(顾复);“性情原自无今古,格调何须辨唐宋”(戴昺)——这话非常通透、恰切。但至今诗仍以时代划分,主要是因为容易且方便,毕竟时代是划定了的,而性情则是仁者见仁,主观色彩太多,不可能有一个统一的标准。 2.“初、盛、中、晚…犹之乎春、夏、秋、冬…四序之中,各有良城美景…不得谓夏劣于春,冬劣于秋也…”(黄周星)——如陈眉公所言:黄花红树,春不如秋,白雪青松,冬亦胜夏,春夏园林,秋冬山谷。各有风致,不必厚此薄彼,只可以说个人自由偏爱。本人仍爱以“丰神情韵”擅长的唐诗,然后是宋诗的江湖派,汉诗,不喜清诗。 六.神韵 1.“上学、中学、下学”(《文子.道德篇》)与艾克哈特之“学分上、中、下”之论——王国维之“肉秀、骨秀、神秀”是也。京剧名家论声音最下者发于声,中者发于心,上者发于头脑,概也来源于《文子.道德篇》。 2.“体格声调,兴象风神”(胡元瑞)——二者的关系像是魂魄与精神,前者有质无形,后者有形无质。《史记.太史公自序》中论形神之语最透彻:神为形之本,形为神之具。 七.李长吉诗 1.“世间安得有奇…”(姚羹湖)之言——世间确有奇,且未必事事都可解,不可解处不必强解,不能解未必是无知。马未都先生论收藏曾言此,杨琪老师讲梵高曾言此。 2.“考据家不足与言诗”(张箦斋)——就像读史必究语出何处,见“管锥编.左传正义.杜预序”。又像牵强附会者,如读鲁迅读红楼必要把一字一词都说成有所隐喻。又像看一些意大利、法国新浪潮电影,非要说成性是拯救孤独空虚的不二法门,其实只是导演的意淫而已。有些人便摸准了这种观者的脾性,写一些、画一些、拍一些只代表自己意淫,甚至连意淫都没有的,或者是如支棋者的“哑谜”、反讽富家子之类的垃圾,因为他们深知,这些垃圾一定会被那些观者看出许多连自己都不知道的深意。 3.“行布拉杂,凌乱,重叠”——为辞而写,联句可也,成诗未免低级。 4.“若必经此境,始能道此语,则其为才也隘矣”(李仁卿)——正是未必经此境,却能道此语,方为天才,不止诗家如此。 八.长吉诗境 1.“唐人作唐人诗序,亦多夸词”(贺贻孙)——今人作今人书序,夸词亦多,若为尚且健在之人作序,夸词则多多,若为尚且健在且相识之人作序,则夸词如韩苏之文,“长江秋注”、“万斛泉源”。 九.长吉字法 丁敦龄乃无耻,苏曼殊乃知识有限,一为刻意,一为无意,但二者均起到了相同的作用:误导。若想不被误导,最好的办法就是自己读原文,不要“于卖花担子上看桃李”。世人以“诗仙”、“诗圣”、“诗鬼”等词赞众诗人,欧言苏曼殊竟以此眼光看拜伦雪莱太白长吉,可当“失明”。 “于文字海中飘零,未尝得筏登岸”——连边还没摸着呢。 一〇.长吉曲喻 “二物相似,以此喻彼,然彼此相似,只在一端,非为全体,苟全体相似,则物数虽二,物类则一”——“酽茶”与“黄酒”。 一一.长吉用啼泣字 1.“彼此有合,故乐”——有共鸣才乐。又可见人是群居动物,期许外物与己身心相合,渴望沟通、理解,即“情契”。 2.“宜诗不宜画”、“文字语言之特长,非他艺所可几及”——想象的空间。 3.“风景即心境”——人的心境多少都有所“载”,“虚”谈何容易。“载”或可看朱成碧,但正是因为有“载”,才会有自己的特点,而非原样复制。 一二.长吉用代字 “只知有花草蜂蝶,而不知世间一切皆诗”(张戒)——李贺诗类似唯美主义绘画,又不完全像,他比唯美主义多了许多诡异,又像日本动漫,精美第一,如果精美不够,就添些诡异,以奇取胜。不知平淡甚至丑陋中皆有美存焉。屡见喜欢所谓唯美的人不能欣赏“窃听风暴”、“僵尸肖恩”。看来此二者难以兼容,因一旦爱“尽俗能雅”者不会再被表象的精美吸引。一言以蔽之,李贺奇才,但小器,“化腐为奇,尽俗能雅”的苏韩乃大器。 一三.长吉与杜韩 李贺李白性情迥异,诗既源于性灵,李贺断写不出太白风骨。“突兀”二字极贴。李贺仅于个别用字上模仿了些李白的形罢了,李白诗乃自然流露,李贺似太白处乃雕琢而出。 一四.长吉年命之嗟 “茫茫来日愁如海,给予羲和快着鞭”——与次韵中“更酌羲和一杯酒,劝停征辔莫加鞭”同看。心境不同,辞与意全然相反。 推崇黄仲则诗有李白风,更以“前后观潮”诗为最者,不知作何想法。前后观潮好则好矣,但其与太白相比,远失灵动飘逸、浑然大器,频繁换韵更是缺少太白之“飞流直下三千尺”之流畅。或许与其本人诗风相比这两首算是豪迈磅礴,但就如小孩耍大锤,耍倒是耍动了,却让人看着吃力。哪里有他的《绮怀》十六首顺溜 </a> </marquee> <hr class=b1> <marquee diretion="right"> 我的好友::<a href="李刚.html" >李刚</a>::<a href="王城.html" >王城</a>::成龙::巴菲特::马云::李彦宏::马化腾::奥巴马::普京、、 </marquee> <hr> <marquee onmouseover="this.stop()"onmouseout="this.start()" direction="left"> <a href="李刚.html" ><img src="4b90f603738da97757032aa4b051f8198618e315.jpg"width="100px" height="100px"alt="broadview banner"></a> <a href="王城.html" ><img src="908fa0ec08fa513de7b5295e3d6d55fbb2fbd917.jpg"width="100px" height="100px"alt="broadview banner"></a> <img src="b64543a98226cffc640b0c42b9014a90f603ea19.jpg"width="100px" height="100px"alt="broadview banner"> <img src="b8014a90f603738d9120f788b31bb051f819ec36.jpg"width="100px" height="100px"alt="broadview banner"> <img src="a8014c086e061d95cb995db47bf40ad163d9ca5b.jpg"width="100px" height="100px"alt="broadview banner"> <img src="72f082025aafa40fdadb9b51ab64034f78f01918.jpg"width="100px" height="100px"alt="broadview banner"> <img src="7a899e510fb30f24403f3cf3c895d143ac4b039c.jpg"width="100px" height="100px"alt="broadview banner"> <img src="dcc451da81cb39db44f4baa6d0160924ab18300e.jpg"width="100px" height="100px"alt="broadview banner"> <img src="42a98226cffc1e1791905fc14a90f603738de917.jpg"width="100px" height="100px"alt="broadview banner"> </marquee> <hr> <audio src="老男孩.MP3" controls="controls" loop="loop"> </body> </html>
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值