您的位置:首页 > 其它

用人话讲内核1 - 开始跟硬件交谈

2014-08-23 06:03 155 查看
打算写一些操作系统的内容,不谈实现细节,主要谈概念和自己多年来学习的理解。供大家参考讨论。有误之处,多多指教。

要回答“操作系统是什么”的问题,可以先看看“为什么需要操作系统”,想想“没有操作系统世界会变成什么样”。所以让我们回到上古时代。。。。

现在有一台计算机,于是我们有了CPU,内存,硬盘,网卡,以及屏幕、键盘、鼠标等等各种设备。

我们想要使用这台计算机,完成一些功能,简单的比如屏幕上打出“hello world”,复杂的比如运行一个游戏,打开浏览器上网。但我们现在还在“石器时代”,我们目前只有硬件。那么我们怎么告诉硬件完成一件目标任务呢?我们需要设法跟硬件交流,告诉它我们的想法。所以我们得知道计算机硬件讲什么语言(Q1),怎么使用这门语言跟计算机交流(Q2),以及怎么把我们的想法转化成计算机听得懂的话(Q3),好让他执行我们让他执行的任务。就像我们有一个菲佣不讲中文,我们要让他买个小苹果,我们就得掌握菲佣讲的外语,然后告诉他买小苹果这件事。他可能不知道苹果是什么,哪里有卖,也不认识路,你就得用他听得懂的话一步一步解释出来。

Q1. 计算机硬件讲什么语言?

整个计算机其实可以想象成一个积木上边放另外一块积木搭起来的,每块个积木都给上面的积木提供了一些“接口”。所谓“接口”,就是把复杂的东西包装成黑盒子,只给你简单的控制按钮。比如给你一台汽车,尽快发动机、传动、制动很复杂,但是给人的“接口”只有方向盘,油门,刹车,档位。简简单单的接口,隐藏了背后复杂了实现细节。

那么计算机硬件的接口是什么?知道了这个接口,我们才知道怎么控制它。这个接口就是CPU的指令集。只要下载了Intel或者AMD或者ARM的CPU文档,就能获得其指令集。这就是计算机硬件讲的语言。当然,他的语言很简单。没有一条指令可以直接完成“在屏幕上打印hello world”这个功能。因为CPU很蠢的。。。他只能做a+b, a*b, 比较a,b等等这种动作。怎么把“打印hello world”这么复杂的任务翻译成a+b,a*b是后文要解决的一个问题。

Q2. 怎么让计算机看到我们想说的话?如何交流?

现在我们知道接口了,还不够。光会英文没用,别人用眼睛看,你就得写;别人用耳朵听,你就得说;别人用手摸,你就得用盲文。所以怎么跟计算机对话?答:CPU只从内存里读指令,所以指令放在内存里!内存一断电就没了,那内存里得指令哪里来?答:硬盘读进来。那第一条CPU指令怎么办?这个问题很关键啊,这是先有鸡还是先有蛋的问题。刚开机,内存一通电一片空白;CPU不支持直接执行硬盘中的指令,只能先把指令(蛋)加载到内存。但是从硬盘加载程序到内存的指令们(鸡)也在硬盘里啊。。。怎么办?于是,人们搞出了叫固件的东西,比如BIOS。其实就相当于一块断电了不会丢数据的内存。这样我们就可以把鸡放在里面了。这样CPU一上电先从BIOS拿指令,BIOS里放上初始化硬件和读硬盘的指令,把硬盘中的指令加载到内存,再让CPU开始执行新加载的指令。鸡生蛋,蛋生鸡。。。这样,我们只要在硬盘的特定位置放上我们想执行的指令,开机后CPU就会再BIOS得引导下执行我们预先放在硬盘里的指令。这个特定位置就是硬盘的MBR(master
boot record),硬盘的首512字节。里面有分区信息,和重要的引导器(bootloader)代码。至此,我们取得了CPU控制权!技能点get!

Q3.怎么把我们的想法转化成计算机听得懂的话?

在现在的情况下,只要我们在硬盘的正确位置放上正确的指令序列,计算机就会按我们的指令序列运行了!!放在50年前,这也就是人们使用计算机的方法了。要知道内存里放的实际是01序列,所以上古时代,大神们的编程语言是0和1。

好在科技在发展,时代在进步。人们发明了“高级编程语言”和“翻译器”。虽然大家都叫编译器,但编译器的本质就是把一个语言翻译成另一种语言,把人类写的高级编程语言,翻译成机器能看懂的a+b,a*b。注意,这个翻译不是直译,还包含了意思的解释。比如我说买个小苹果!计算机是看不懂“买苹果”的,也不知道哪买。编译器得翻译成,出门左转走500米,左转左转再左转,买小苹果,等等等,事无巨细,都要嘱咐道。因为CPU实在是太傻了。。。那么也许你会想,既然是翻译器,为什么不能把英文翻译成中文?理论上,应该做到这一点。但是由于人类语言变化多端,经常不按常理出牌,说话还经常带有歧义,连人都听不懂,别说程序了。所以,尽管从C到java到python,程序语言越来越靠近人类语言,但语法仍然是很规范的,定义很严格,不能乱写。这才保证了编译器能看懂。看不懂他还老报错不是?!反正你就得按它的写,它看不懂不是它的问题,而是你的问题。。。此处可以说脏话么?

说到哪了??

恩,现在我们了一门高级编程语言,一个编译器。这样只要我们把编译器放在硬盘的特定位置,CPU通电之后就能执行他。我们就让编译器翻译我们用高级编程语言写的程序,翻译完之后再跳转过去执行。这样,我们就获得了用高级编程语言控制计算机的能力!技能点get!!

好了,Q1-Q3 三个小问题解决了。好歹我们现在可以用高级语言编程计算机了。开发点啥好呢?中古时代的大神们就这样裸上了,哪要什么OS,用什么写什么就放进去跑。比如要解密,就写个解密程序,编译完了运行,然后出结果。要OS干嘛??

当然,随着科技的进步,人们日益增长的计算需求和日益下降的智商,催生了计算机软件体系结构的一次又一次革新。把大家都用的功能做成一个软件包,供大家共享,省时省力。这是出现OS的原因,也是出现各种各样软件框架,乱七八糟东西的原因。比如hadoop和map reduce的流行就是因为data scientist不知道如何高效对大量机器进行编程,于是擅长做并行编程的人发明了这个很简单好用的东西给大家使用。可以说是大家做自己擅长的事,也可以说大家脑子不都不够用。。。

下一篇,我们来谈谈OS吧。

我随便写些乱七八糟的,主要是觉得OS这东西我自己想了好久才理清楚,也还有很多没理清楚的地方。写出来给刚学习的参考,也可以产生一些讨论。大家有感兴趣的话题也可以说出来,我写写。以后可能会慢慢谈到虚拟化技术,资源管理,等等吧。东西很多,慢慢聊。

作者简介
欧阳马上毕业,匹兹堡大学在读博士生,研究方向操作系统,虚拟化。2013,2014年暑假作为实习生在美国VMware, Palo Alto ESX内核组从事CPU调度研发工作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内核