注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

My Unix World

不要迷恋Unix,Unix只是计算世界很小的一部分!

 
 
 

日志

 
 

【Learn】对扩展机器的思考  

2008-12-13 17:16:29|  分类: L-Kernel |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
声明:这篇文章只是为自己理解一些知识而勾勒粗略轮廓,其中很多说法或者大多数说法都不严谨,只是提供一种思路,这篇文章只具备启发意义,作为抛砖引玉之用,不具备借鉴、学习价值。另 外,语句结构不通顺,因为目标只是自己能看懂。没有设为私有,是为不登陆也能看比较方便。特此声明。文章无版权,随便转载,但不提倡,因为并没有多少转载的价值。
========================================================================================
扩展机器主要由芯片+Kernel构成,也包括BIOS和BootLoader,BIOS用于扩展硬件,而BootLoader则是用于弥补Kernel的引导。也可以这样理解:扩展机器=芯片组合(硬件)+Kernel+连接件(BIOS和BootLoader)。
从扩展机器的视角看,计算机硬件只是一些芯片和总线的组合。提供能量的部件暂且不考虑。这是PC,即普通的通用计算机的逻辑架构。这其中也包括一些嵌入式系统,特别是通用性比较强的嵌入式系统,比如手机、路由。除此之外,为专门用途定制的专用芯片和专用软件,比如,加密专用芯片、加密机、交通控制专用芯片。。。这些芯片与PC上的专用途芯片有完全相同的原理----都是利用硅片电路逻辑,实现一些特定的用途。这些专用途芯片,也可以提供一些简单的指令,在上面实现一些灵活的逻辑控制和定制应用(也就是软件)。
专用硅电路逻辑(如硬盘控制芯片、加密机)其实与软实现的工具(例如bc、Emacs)很有可类比之处,它们有相似的本质,都是依靠硅电路,实现一定用途。软实现的工具,其本质,是通过重新组织和有选择的使用通用处理器的指令,间接地构成一套虚拟的硅逻辑电路。而通用处理器则更类似于类库,它们都是建立在一定逻辑基础之上,提供一定的通用调用接口,允许用户按照自己需要的方式,重新组织和使用这些指令或者类库接口,实现自己的功能。这些建立在指令或者类库接口之上的实现,将它们记录在硬盘或者内存中,就称之为程序,它们运行起来,称之为进程或者线程。它们的生产过程,初始阶段,称之为源代码,源代码与程序逻辑没多少关系,它们只是文本文件,它是用户层面的东西,只是普通的用户数据。在学些这些的时候,应该将源代码数据抛弃,只看系统的东西。
计算机系统,在本质上,其实是图灵机模型,这里面发生的一切,也只是在文法理论范围之内的应用。
这里的一切,可以用两个知识点来覆盖:1,形式语言、自动机和计算理论。2,硅电路基础。如果再加上一点,那就是工程思想、设计结构及算法(对应于软件,那就是软件结构和算法,对应于芯片,那就是芯片设计体系,对应于系统开发,那就是设计模式和工程)。它们的关系是,硅电路是计算机系统的物理基础,如果哪一个科技发展了,完全可以在其他物理基础上构建计算机系统,比如量子、DNA、大分子、光子计算机,而自动机理论和计算理论仍然适用。严格来讲,硅基础不能算作计算系统的一部分。但是,这里需要用的是硅逻辑,比如触发器。
关于形式语言、自动机、以及计算理论的知识,需要以后补充,现在对这些知识一片空白。
逻辑工具,不管是硬实现还是软实现,都可以用自动机的观点去审视,因为它们的本质是逻辑自动机。
从由逻辑构成功能的先后看,可以对计算逻辑划分为一些层次:
1,硬件实现功能,比如加密芯片,它由硅逻辑直接实现某个功能。它有很强的专用性和很强的实时效率,这种专用逻辑一般只需要比较少量的晶体管单元。
2,硬件提供基本指令,由软件实现功能。典型的就是嵌入式系统。硬件提供一个相对通用的平台,在这基础上,重新组织这些机器指令,实现一些虚拟逻辑,完成所需要的各种功能。
3,硬件提供通用指令(CPU、GPU),软件补充管理计算机系统(Kernel),软件封装一层类库,由软件实现功能。比较典型的例子是PC中使用Linux、windows系统。
4,硬件提供通用指令(CPU、GPU),软件补充管理计算机系统(Kernel),软件封装一层类库,软件提供通用平台,在这个基础上实现用户功能。典型的例子是PC中的虚拟平台技术,.NET,Perl,Python,JVM,等等。它们对资源有强劲的消耗。与它们对应的人机交互工具,也更加职能,例如根据系统设计自动完成编码。除虚拟平台之外,还有一些工具平台,如基于Firefox的插件扩展,基于Emacs的插件扩展等。经过这么多层的包装,这些Emacs扩展,或者Firefox扩展都已经看不到底层数字逻辑的蛛丝马迹了。在万丈高楼之上,它们享受功能应用的快乐。
5,另外,从横向看,有超级计算机和分布式系统、网格系统。它们整合更多的资源,完成海量的数据存储、处理。
接下来思考,关于GPU的出现,对扩展机器的影响,在分布式系统中,Kernel与硬件的关系问题。

接下来这些关于Linux,重新对Linux进行思考。

Linux有一定的适用范围,并不是适用于所有的芯片和计算机系统,从这种分类上看,前两种并不需要操作系统,更谈不上Linux,而对于分布式系统,网格计算,我不清楚Linux是否能够胜任,而即使是可用范围之内,Linux也不一定是最佳的选择,实时系统,嵌入式系统,庞大规模服务器,可能需要修改后的Linux

Linux是一款优秀的内核,但并不代表它涵盖一切,无可挑剔。新硬件的诞生,GPU在通用计算领域的迅猛发展,对于不在核心级支持图形图像的Linux内核,是一个需要面对的问题。

当然,在它的可用领域之内,类Unix操作系统Linux,是一个优秀的选择。Unix思想+Linux高效实现+开源模式和社区建设,保证了这种优秀的系统的可用性,并且,在很大程度上可以认为,Linux是最佳的选择之一(同样优秀的备选方案还有BSDOpen Solaris等)。

Linux的应用也更加普及,全球Top500超级计算机名单中,有85%的机器使用Linux系统,而嵌入式系统中Linux的修改版同样高效可用。对于普通服务器和PC领域,Linux的优秀当然更是不容置疑的。

它代表丰富的工作机会。

Linux的知识,Unix的思想,是一生的财富。

Linux是我远离寂寞的伙伴和朋友。

Linux,是一个不错的选择,对我而言。我的兴趣所在,我喜欢她,我认同她,愿意跟她朝夕相处,喜欢把自己的时间和生命放在这上面。她不用让我琢磨不定,不会今天风和日丽,明天就是暴风骤雨,却不允许我有情绪。这是我的生命的表达,即使,用Linux找不到工作,又有什么关系呢。心里很苦,你知道吗???

此外,学Linux,可以借助这个机会,进一步了解计算机系统,计算理论,甚至人工智能方面的东西。作为一个计算机人,如果一生都掌握不了这些知识,甚至不知道计算机究竟是什么,也是一种悲哀。这也与工作无关。

融入到社区,找到一种归属感和认同感。

最好的工具。即使以后把计算机只是作为工具,Linux也是一个最优秀的工具,毫不客气地说。BSD同样优秀,可惜不是太流行,所以应用软件不是太丰富,这是它最大的弊端。Windows足够流行,可惜,这只是一款商业产品,并不是一个优秀的工具。

还有其他因素,但这些已经足够了。

至于不利因素,可能是Linux太迷人了,我会一发不可收拾吧。

GPU和CPU的关系方面,可以预见,在未来,这将成为通用计算机中的双核心,甚至集成到同一个封装中,CPU负责通用运算,GPU变成MPU,专门负责数学运算,当然包括图形建模和渲染。随着GPU在通用计算领域内的发展,操作系统的内核必是否加入对GPU的支持,也许图形用户界面的绘制,仍然由X完成,但一部分原本在X中实现的功能下放到Kernel中。
不过即使仍然维持目前的体系架构,也是不错的,因为GPU只是用来做应用层面的运算,并不参与系统管理,干脆把这颗芯片交给应用程序,不管它们进行图形建模渲染或者通用科学运算,都是由它们自己支配。没有充分证据证明硬件的使用必须由操作系统来完成。更重要的是,GPU不参与系统管理。但一个无法回避的问题是X的效率。如大规模并行计算,很难理解怎样用目前的框架完成。另外一个问题是绕远路,在图形处理中,建模、渲染完成,完全可以直接输出,并且数据就在GPU中,不用再来回传输,但如果是目前的体系,或者改进后的体系,就需要重新处理。
我的理解是,维持目前的体系几乎不变,只是将GPU纳入内核的统一管理,由内核分配GPU的计算能力
我不是Kernel组的开发人员,不管Kernel组以后将怎样处理这个问题,但至少目前它是以这种方式存在的,并且BSD等各个Unix都是以这种方式工作。
似乎我的担心是多此一举。Linux有很好的机制应对扩展。/dev下面可以直接访问硬件,包括显示设备,包括CPU。
暂且相信,Linux已经圆满地解决了这个问题。
由此却可以看见,我对Kernel的了解,绝对不应该仅仅停留在表面,而应当很深入一些才好。如果有必要,可以阅读两个月的代码,从整体上把握它。我关心的是Kernel提供的外部view,必须非常清晰才行,不能错过任何一个细节,而掌握了外部view,对以后理解它的实现,是非常必要的。
因为我要学习的是Linux,对于芯片的分类以及CPU体系框架,就不需要了解。我对CPU的要求,并不太高,因为打交道的是Kernel,它已经对硬件有了一些封装了。
对于GPU,了解这些知识已经足够了,到需要的时候再去了解。我只是一个做软件的,人要有自知之明。
目前只研究X86,对于其他平台,暂时不做研究。
我接下来要做的,首先是拜读bootcore和Grub2的源代码,然后细致地学习Kernel的外部view。
呵呵,我的递归堆栈,终于开始往回退了。
在理解扩展机器的时候,就需要忘掉系统调用之上的一切,而将目光落到芯片、系统构成、Firmware、OS之上。关注它们的构成、职责、思考它们的关系。
在思考扩展机器的时候,把整个系统抽象为芯片的组合,以及如何把这个组合变成一个可用的系统。从这个视角看,计算机系统可以表述为:
1,芯片和内存,它们的组合构成系统。硬盘可以理解为一个接口,这个接口后面,有一个处理机,来完成数据的存储,至于具体是什么东西,根本不在关心的范围。当需要读写数据,先把地址送到接口上,然后发一个读或者写的指令,然后,就读或写到了数据。无论这个接口后面是一个硬盘或者其他的存储介质,这都不需要关心,都可以按照接口的定义,想象有一个逻辑上的存储器。所以,从这个视角看,芯片是构成计算机的基本组成部分,机器之中,只有芯片。把芯片连接起来,就构成计算机系统。计算机系统是且只是芯片的集合,而内存属于专门用于存储的芯片。人与机器的交互,可以等效地理解为人根据芯片的接口规范与计算机沟通。鼠标、键盘、显示器都是人的助理,沟通的两方面:计算机;人+外设。把人和外设看做一个整体,人+鼠标等价于一个光标操作芯片,对于计算机系统而言,两者没有任何区别。
计算机系统由且只有芯片的集合构成,计算机系统通过定义好的接口协议与外部芯片进行互动和沟通,外部芯片不属于计算机系统的一部分,人+外设完全等价于同样功能的芯片。
这有些程序员视角的韵味。这里对计算机系统的定义,一般而言,是指的一个应用和开发平台。
2,冯-诺依曼体系。
其实这是微机原理和接口技术这门课程涉及到的内容,它关心,单个的芯片怎样构成计算机系统。
继续从程序员的视角看,计算机可以进一步看作CPU和它的地址空间的集合。对于部分地址空间(对应于接口的那些),它们有特殊的用途。
对于多处理器的计算机系统,多个CPU共享地址空间。
多处理器的系统,在任何一个时间片内,都只有一个CPU有主控制权,也就相当于,其他处理器,只是一些运算芯片。这就是为什么GPU做为通用处理器兴起的原因。因为目前这些对称多处理,存在冗余。可以预见,在未来,计算机系统的构成,一般可能采用有限的控制处理器加大量的运算处理器。
计算机系统=处理器集合+可操作地址空间。
可操作地址空间的其实可以看做协议。不同的地址空间,遵循不同的协议,内存协议,硬盘协议,鼠标协议。每个协议,需要一定的程序进行封装,以便更方便的进行操作,这就是驱动。其实完全可以把OS中的内存管理看做内存驱动。
如果计算机有意识,其中的主体词“我”代表的就是CPU。它是计算机系统中的主体,可操作地址空间则是它的生存环境。
从程序员的视角看,计算机的世界其实是很狭小的,只是CPU们,加上可以访问的地址空间。这里面之所以丰富,靠的是大量指令和地址空间的组合。地址空间,既是计算机的最远可视范围,只是有一些有一些奇妙的地址空间,比如映射网卡的地址空间,从那里可以得到前所未有的新指令执行逻辑。
只要跨过了模糊记忆一个门槛,只要处理器能够识别内容,并以此来修改自己的逻辑。。。。
但是,从计算机系统,尤其是从扩展机器的观点看,事情就显著不同了。那些硬件,是机器的一部分。比如开机加电过程中,芯片要初始化,
3,BootStraper。
BIOS、Coreboot、Open Fireware。
4,Kernel
5,用户程序。
在这里,可以把建立在扩展机器之上的所有程序都称之为用户程序,而不需要关心类库和那些程序的层次结构。从扩展机器的视角看,它们只是建立在扩展机器之上的应用,对扩展机器而言,只是一些逻辑,跟本没有任何区别。扩展机器看来,它们的内容是没有意义的,扩展机器也不需要关心这些用户程序的具体逻辑,就像Unix中文件一样,具体内容,不是Unix所关心的,它知道的,这只是一个文件,至于文件的内容,无所谓。
从扩展机器的角度看来,一切东西,要么是机器码和系统调用的一些组合构成的逻辑,要么是一些用户数据。它们的内容对扩展机器来说是透明的。一切用户的东西,都属于这两类中的一类,非常简单。
  评论这张
 
阅读(279)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017