我和操作系统(一)

来源:互联网 发布:自动读英语软件 编辑:程序博客网 时间:2024/04/29 20:56
我与操作系统的经历得从上大学开始说起。2001年,我以不怎么好的成绩成功考入西安一所二流大学。过来

的人都知道,在二流大学的好处就是考试不及格没关系,毕业只要你能找到工作,其他的好说。这为我争取

了几乎整整3年的时间,潜心下来自学学了操作系统。我这样不是鼓励大家不要上学校的课,只是告诉你们

要利用好自己的时间。

我学的是信息与计算科学专业,这是计算机与数学相结合的专业。由于我高中时就有了台PentiumII的PC,所以

刚开始进入大学,也算是“计算机比较牛”的啦,很多同学还没自己的电脑呢!大一开始,我比别人先意识到

要学好计算机,那时完全没有方向,什么东西都学,每个星期到图书馆借一堆书,什么VB,

HTML,ASP,Javascript,还有什么局域网的搭建,等等。还一度幻想靠自己学的那点HTML开个网站,估计很多学

过它的人都有同样的想法吧!杂七杂八学了一年,不过那时的我已经可以用VB编个计算器,或者通过操作注

册表删除CS游戏中设置密码,等等在当时的系里已经小有名气。终于在学期末,在这样的计算机大海里撞

见了C语言,这个一直让我听而却步的东东。

紧接着第二年,我和大家第一次接触C语言一样,在DOS下的Turbo C上疯狂的自己练习了很多小程序。自以

为有了小成,因为按照学校课程安排,我比其他人提前1年学习了C语言。当时恰好linux的呼声比较高,也在

网上听见了“内核黑客”的字眼,听起来让人很兴奋,也很羡慕。就到图书馆借了本linux内核分析的书,打印

出的代码里面有很多我看了像C语言,但是我又没见过的代码行。还有ax,bx什么的,我确认那是汇编,但确

出现在.c的文件中,我好是奇怪。随便浏览了一下,这本书就还了。也就是从此时起,我意识到,如果我懂

得了操作系统,那么我就懂得了计算机的来龙去脉,我发誓我要弄懂它。

我开始制定学习计划。问自己---能看懂linux内核需要哪些条件?

C语言,肯定要精通,当时算学了,精通那就等一边看代码,一边进步吧。

,而且是32位的,好像还要懂AT&T格式的。哦,32位比我们在学校学的所谓“IBM汇编”,要多了很多新

概念,什么实模式,保护模式,MMU,cache,write buffer,段,页等等。记得当时我借了本狂厚的intel的书

,后来才得知那就是intel CPU的说明书的中文版。等我把这些难以理解的概念弄懂,时间已经过了半年,也

就是说,整个大二我已经过了一半了。

不行呀,连linux都没玩过,怎么可能看懂linux内核。我的PC中的一部分硬盘开始被linux占用,开始学习很多

工具的使用,vi,grep,find,tar,...,接着又学习了samba,apache,vsftp,ssh,mysql...各种服务器的安装和配置,这时

我的机器可以通过这些途径和宿舍其他机器通讯了,甚至还用iptable+两块网卡拿我的旧机器为整个宿舍的

电脑路由。用apache+mySQL在宿舍建了个小网站,有C语言写了其中的CGI程序,这也算第一个写的比较实用

的C程序。

终于,我第一次打开Linux内核源代码,整个源代码树里面有很多除了.c,.s文件以外的文件,他们是做什么用

的。我的问题又来了,生成整个内核,用到的都是gnu的工具,这些工具,我需要一个把他们的文档看过,

make,gcc,ld,nm...同时我练习配置内核,make image,了解了bootloader和OS的关系,但是离我的目标还是很远。

。。

听说Linux的鼻祖linus是赐教了minix的内核源代码,在他大四毕业的时候,写得linux。我也决定先走这条路。

《操作系统的设计与实现》真正带我步入了linux内核源代码的天堂,我看着代码,认识到了“C语言原来是可

以这样使用的”,强制类型转换使C变得可以为所欲为,也许这就是写操作系统会用C的原因。gcc的内联汇编

使得汇编和C的融合如此高效与完美,我经常将写得C程序编译生成汇编,看看哪怕一句if是如何被编译器翻

译过来的,另外再加上gcc的优化编译参数O1,O2。。看看到底有什么优化。我感受到机器语言的魅力,感

叹很久以前只用汇编和机器语言的时代的程序员的水平之高超。终于赐予我看内核源代码的所有先决条件,

我意识到,是时候开始了。此时大二已经到了结尾。

操作系统源代码树如此之大,我该如何开始。那么先弄清楚,那行代码最先执行吧,bootloader是答案。我知道

了MBR中的代码也包含在内核中,我在代码中用心领略世界黑客的精神,虽然bootloader代码我是看了,但是

感觉不相信它能运行,我决定试一试,我融会贯通的用masm编译了一段打印一个'o'在屏幕上的启动程序,

历时一周,第一次写这种程序真不容易,bootloader code讲究设计和安排的精巧,稍有不慎,全盘崩溃。最

后我看见了,直接让我兴奋了几天,我明白从此和以前不同。作为扩展训练我决定实现自己的库函数printf,

同时可以学学不定参数的使用,这样我的bootloader可以打印些数字在屏幕上。之后又完成了很多功能的添

加,我抽屉中的12张软盘的0扇区就这样被我玩坏掉了。事后很久才知道,其实可以用虚拟机,再不用进行

复杂的调试过程了---写扇区,重启动,看效果,编辑,编译,写扇区。。。成本大大减低。

bootload一个jump,到了内核,所以该看真正的内核源代码了。所有的c语言代码在得到执行权之前,又会有

一段汇编来导入,它建立堆栈,然后call。哦,对,这个问题我给我们的C语言老师提了出来,说main函数不

是最先执行的代码,她当场否决了我,全系的同学用诧异的眼光看着我和老师,我没有继续争下去。。。

GNU的ld真的很灵活,它可以控制安排甚至每个函数的驻留地址,这是操作系统开发者的厚礼。int 0x80,时钟

中断,进程hardware context的切换。。。linux操作系统就这样运行起来了。

大三的下学期,我决定要亲身经历操作系统的开发过程,为自己的PC写一个多任务内核。

原创粉丝点击