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

My Unix World

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

 
 
 

日志

 
 

【Learn】理解扩展机器  

2008-12-11 14:46:56|  分类: L-Kernel |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1,Firmware, Device Driver, Linux Kernel
从单独的视角看,其实Fireware和设备驱动程序就是一个小小的OS,只是它的目的是调度和控制某个单一的设备,而OS Kernel则管理一系列资源。它们具有很强的可比性。(1)它们的根本职责都是扩展、控制、管理资源,处理资源使用请求。(2)它们提供简洁的对外接口,对外部用户而言,类似一个复杂的类库。(3)它们都相对独立,它们有自己明确的职责,很清晰的同其他功能进行区分。(4)它们都可以有版本升级的概念,以弥补硬件和以前版本的不足。(5)它们都是使用硬件定义的协议(机器语言或硬件语言)完成与硬件的互动,而它们与上层的互动仍然使用硬件定义的协议,但加上了自己的扩展。不同点:(1)Firmware和Driver允许用户使用特权模式,而OS Kernel独享特权模式。(2)为了适应不同的操作系统,需要为同一套硬件提供不同的驱动,以及驱动接口,而OS的SCI则是统一的。
从本质上理解,几乎每个外设或者数码产品、工控产品都含有一个专用处理芯片,每个设备都是一台小的专用途计算机,它的Firmware就是它的OS。
再扩展到更广阔的领域,软件工具与这些专用芯片颇为相似。它们的本质都是依靠一些逻辑聚合,实现一些在功能坐标系中的临近功能域的集合。所不同之处,只是软件是在CPU(功能强大的通用处理器)的支持下,虚拟了这么一个处理逻辑集合,它与硬件芯片并没有多少区别。
严格说来,OS并不是扩展了CPU,而是限制了cpu。操作系统只是建立在CPU特权模式之上的一个应用。CPU的特权模式下,这些指令的组合,可以在逻辑上构成无数种的逻辑芯片,操作系统内核只是这些无数中组合中其中的一种或几种,一个版本的内核,对应其中的一种组合。从这个角度看,OS非但没有扩展 CPU,反而彻底地限制了CPU,使得它从一款具有无线扩展能力的通用指令处理芯片,变成了一款专有芯片,只作为这个应用。如果说CPU的特权模式提供了一种机制,那么OS就是建立在这个机制之上的一个应用,一个策略。任何应用在获得专用性和特化性的优势的同时,也一定丧失通用性,而使得这件事物处于一个更受限制的范围。比如蜻蜓的眼睛。这是这个世界的一个基本定律,如果一个事物提供通用性,也意味着同时提供了麻烦,如果你想封装麻烦,你会连扩展性一块封装掉了。
如果没有OS,程序可以以任意的方式使用CPU和机器资源,虽然要付出事必躬亲的代价。OS虽然提供了应用上的方便,也因此彻底埋没了CPU的绝对控制能力,运行在OS之上的程序,只能看到虚拟的CPU,虚拟的内存,任何访问外设地址空间的访问,都需要请求OS帮助完成。
OS 是一个折中,它封装了计算机资源和进程管理的复杂性(比如对于每个外设都需要独立的外设访问协议进行,但如果有OS进行封装,显然使用起来方便地多),又尽可能对芯片的逻辑运算能力保持原封不动(用户程序还是使用原始的CPU指令,还是以原始的方式访问内存地址空间)。OS能取得这个成绩,是因为这属于两个不同的维度,芯片逻辑处理能力维度和计算机资源使用维度。OS主要对其中的一个维度进行完全的封装,尽量不影响另外一个维度。当然完全的不影响是不可能的,比如OS独占了特权模式,就意味着应用程序失去了使用这一特殊模式的能力,但这是一个折中,因为系统中存在多进程,任何进程如果占据特权模式都意味着对其他进程的侵权或者生命上的威胁。另一个消极意义就是那些本身以处理计算机资源为职责的程序,失去了直接操作计算机硬件资源的能力,而只能依赖于OS提供的服务,这在很大程度上限制了它们的能力。一款好的OS应该考虑到这个问题,它应该在封装外设接口空间的协议复杂性的同时,尽可能不封装外设地址空间的接口能力,或者同时提供对外设访问的服务和对外设原始的访问方式。Unix做的还是不错的,Root可以读写/dev/*下面的设备,就是提供了用户访问外设的能力。
当然OS对硬件的封装,积极意义还是大于消极意义的。
OS完成了对硬件的封装。
2,Unix机器
Kernel 源代码只是用户文件,只有编译安装、运行起来之后,才成为真正的操作系统。OS一词指的是运行中Kernel逻辑。OS实际上是把CPU的特权模式转化为一个应用,相当于一款具有OS功能的芯片。OS+CPU+可访问接口=一个虚拟的芯片,如果科技足够发达,完全可以把OS、CPU、接口做到同一个芯片上,这个芯片提供一些SCI,并通过SCI支持用户进程,管理用户资源。
可以把OS看作是,它对特权模式的通用逻辑,转化成了一个专有芯片逻辑,完成专用功能。也或者可以看作,OS对整个CPU及其可访问地址空间进行了封装,将整个计算机硬件转化为一个逻辑上的芯片,它可以提供SCI,并透过 SCI提供资源,以及透过SCI提供的服务建立虚拟逻辑芯片或者虚拟计算机(每个虚拟计算机对应一个进程,进程其实也就是虚拟逻辑芯片+逻辑内存)。
由此可以得到一个结论:在计算领域,任何功能性实现(如专用途芯片、也或者是软件工具,总之以实现一定功能为目的),归根结底于专用芯片逻辑电路,芯片逻辑可以是硬逻辑,也可以是软逻辑。前者指的是设计的专用途逻辑电路,这种电路是已经硬设计好的,功能比较单一,但效率较好。后者指的是设计通用性较强的芯片,这些芯片提供一些指令接口,然后对芯片提供的这些指令进行组合,其中的任何一个组合,都可以当做一款软芯片。也就是,设计了一款通用芯片,也就相当于设计了很多种软芯片,软芯片的种数即为这颗通用芯片所有指令的所有可能组合数。但由于存在大量没有意义的组合,一般可用的软芯片数目等于建立在这颗芯片上的软件工具数目。例如,对于通用处理器,如果采用Unix应用方式(OS是Unix或Unix兼容系统),目前大约有15000种相对成熟的软芯片(Debian大约有15000个软件包)。
由此可以得到另一个结论:软件开发只是芯片逻辑电路设计的自然延续,任何软件开发都不例外。软件开发的本质是利用CPU提供的基本接口,实现对CPU内部通用逻辑的专用途化组合,使之成为一款虚拟的专用途硅逻辑芯片。
另外还有第三个结论:软件工具在本质上是逻辑上的硅逻辑电路,它与专用硅逻辑芯片有完全相同的本质,而没有任何区别。在文件系统中存储的二进制可执行文件是一种思路和算法,它描述了怎样使用这款通用芯片就会达到把它改造成一款专用途芯片。进程则代表这款软实现的专用途芯片的运行,即一款处于运行状态的专用有限状态机。另外如果进程是在OS的支持下运行,一般情况下,在使用CPU时间片上,也可能是不连续的,但是当代硬件的性能已经极大提升,所以即使在多进程的系统的中,一般都会流畅使用。而早期的简单的操作系统,如DOS就只是单进程的操作系统,DOS的一个重要价值就是见证计算机的发展历程。从DOS到Unix的跨越,也只是从单进程单用户到多进程多用户的跨越。对这一点的影响,也即软芯片的虚化程度更高了一些,实现更复杂了一些。
结论之四:任何建立在芯片逻辑之上的软件,都无法超越芯片提供的接口所定义的逻辑组合范围,计算机是一个纯粹的可理解的逻辑体系,没有任何神秘之处。
再回到Unix平台,Kernel封装了所有硬件,并建立了一个虚拟的可用芯片。
从OS的观点看,用户文件、用户可执行程序、外设都属于在OS体系下的资源。
资源、OS、进程,三者作为三个要素构成了计算机系统的全部。当OS运行起来之后,从此再没有硬件的概念。资源在Unix中体现为文件,最流行的一句话“Unix中一切都是文件”,描述的就是Unix一切资源都是文件,都以文件的方式进行操作。在Unix中,没有设备、没有硬件、没有网络,有的只是文件。文件代表了计算机中的资源。
资源有几个种类。外设是计算机系统中的宝贵资源。用户二进制可执行文件,用于作为创建用户进程的模板,也即,OS根据用户二进制文件生成虚拟的软芯片逻辑,从而在OS的支持之下,虚拟出一系列的专用途硅逻辑芯片,因此,可以把用户二进制可执行文件作为资源,与外设有相同的性质,只是用途不同。Socket是资源。用户数据文件是资源,它属于用户资源,它们的使用方式由用户决定。/proc镜像是资源,它们是OS管理的进程的实体化。所以,所有文件都是资源。所有资源在Unix中以文件的方式存在。资源使用文件方式管理,有它的合理性。资源管理的关键包括:类型、权限、所有者、管理体系(目录管理体系),却同时不需要关心资源访问使用的协议。这正好抽象为文件,也许文件正是从这里起源的。每个文件的格式、解析文件的访问协议,由文件的使用者完成。用户二进制代码由OS识别解析,用户数据由用户识别解析,与计算机系统无关。/proc和/dev由OS识别。
所有的文件由OS存储管理,OS提供存储机制,用户只有通过SCI的服务请求,才能通过间接的操作,才能浏览、查看、操作。在常规认识中,常常认为OS是最底层,上面是类库,再上面是用户程序和用户数据,但是从系统的观点看,这是一个错误。所有的文件都是OS控制之下的文件体系机制,往系统中新建一个文件,实际上是往文件系统中插入一个文件,而OS的SCI提供这种支持。从OS内部的角度看,还不好说,但是从OS应用,也即把OS看作一个整体,从OS这个整体的表层看,所有的资源都是一些逻辑实体,或者说只是一些概念实体,并不一定是物理存在的,对所有的资源的访问,均通过SCI进行,由OS完成这个虚拟化的解析。进程无法直接操作资源,也无法看到资源。从本质上说,资源只是SCI提供的一种资源协议,OS在其内部维护这些逻辑上的资源,进程与资源的交互需要,需要通过SCI服务,也可以说,资源是一种OS提供的服务,它完全是一种逻辑上的存在,虚拟的存在。也许背后有真实的硬件或者文件,但是对于进程而言,不管OS的另一端的资源是真实的还是虚拟的,对进程不存在任何影响和区别,那是OS需要关心的事情。资源表现为文件,或者说,文件和资源是一回事。
Unix另一个经典之处在于,它允许用户进程定义文件的格式,或者说文件的使用协议。这使得计算机高度可用。完全可定制的进程使用完全可以定制的资源,这等同于完全的自由和无限的能力,同时也意味着一台Unix可以虚拟出无数台逻辑上的计算机。虚拟出来的计算机,包括由两部分组成,进程和文件。进程是逻辑部件,文件是档案、模板、数据部件,前者代表能力,后者代表资源。更重要的是,这种模式相当简单,只有两类成分,非常容易理解。当视角进入这一层次,OS就可以看做一个后勤司令部了。这是一个完全的用户视角,文件系统的规模、支持的存储样式、以及进程的能力,合起来,就代表Unix的能力。
这就是Unix的伟大之处,或者说Unix内核的伟大之处,它封装了机器的各种硬件资源,提供了进程和文件两种东西。多进程,意味虚拟了很多台计算机。
在Unix中,文件绝对不仅仅代表存储,还代表通信,代表交互,代表控制(如/dev/*),代表镜像,如/proc/*。
在所有的文件中,/proc和/dev最具备特殊性,/proc是一个镜像,它是当前主机的镜像,/proc是这台机器活着的象征。其他的文件都是死的,只有/proc镜像了运行中的OS和所有的用户进程。由此可见Unix有多么美!多么简单,有些难以置信的简单。说它巧夺天工,丝毫不为过!真想做一个进程,到Unix内核的世界去游玩一圈,看看这些美妙的设计都是怎么实现的!Intel的CPU真TMD幸运,这么烂的指令体系,居然可以跑上这么美妙的Unix,这世界没天理!Unix中的一切都是文件,准确的说法应当是:Unix用文件镜像一切!连进程和OS都被它镜像了!!!“用文件镜像一切,Unix由OS+文件+用户进程组成。”这就是Unix在用户层面的本质。另一方面,/proc只是一个镜像,由于文件无法代表芯片逻辑处理,所以/proc无法完全代表OS和进程,事实上,通过/proc看到的只是OS和进程的外部表象,它的存在,主要是方便用户查看OS和进程信息,并进行一些小数据量的通信和交互。/proc即使把内存中所有的信息都显示出来都不能代表OS和进程的本质,因为它们的本质是逻辑是运算是变换,而/proc只是文件,是资源。这是因为它们的本质山孤独不同。而/dev代表的是资源,所以完全可以用文件来镜像它。
其实对于计算机应用而言,真正重要的是进程,文件只是一种辅助方式,只有运行和使用中的时候,文件作为资源才是发挥它价值的时候,因为资源的价值在于使用。存储数据是一种价值,但存储的价值只有在使用的过程中才能体现出来。计算机系统的应用中,其实是进程的个性化应用过程。而数据结构和算法,归根到底,也是为了有效的组织进程的运行方式。进程不仅仅包括逻辑,还包括运行时候的数据,所以有“数据结构比算法重要”的说法。而软件工程和Unix设计艺术一书指出的那些设计理念,关注的则是,怎样构建一套文件,这套文件一般称之为一个工程Project,一个Project一般会生成一个软件包,一个软件包包含具有相近功能的一个或多个进程的模板。Unix设计艺术,是关于人使用Unix内核的艺术,与计算机无关,与Unix无关。Unix设计艺术,关注点其实是人。这与Windows的设计理念不谋而合,但是Windows关注的是忽悠,而Unix关注实实在在的做事情。

关于进程。在OS之上的计算机应用,其本质,其实是进程资源的应用。一般而言,进程也就是OS虚拟出来的那些虚拟的计算机。计算机应用也就是进程的应用。传统的概念中有一个误导,那就是系统的体系结构,硬件在最下面,然后是OS,再接下来是类库,然后是支撑工具和Shell,最上层是应用程序,人则站在应用程序的上方。这个体系结构无疑是一个伟大的创举,它把复杂的内部结构简单化,使得大多数人可以理解计算机的体系,这种图很流行,而且大多数情况下是很有效的,也是有意义的。但是,这只能作为一种抽象的简单理解,绝不可以把这理解为真实的计算机体系结构。站在系统的视角,计算机系统结构应该是OS+进程+文件,文件只是基础资源,文件的结构已经很明显了,那就是可以看见的树状结构。那么计算机系统的结构也就是进程的结构。与大多数理解不同,事实上,那种分层次的结构只是用来辅助理解依赖关系的,而不是真实的系统结构。真实的结构是居于平等地位的进程间的平等结构,不管类库是静态的或动态共享的,类库与用户进程处于同一个层次上,而不是居于用户进程的下面。以前的层次结构只是一个模糊的概念,它没有区分文件和进程。支撑工具、Shell、应用程序、类库、以及中间件平台如Perl、Python、TCL、VMware等等,其实位于同一层次,它们都是一些独立的进程,也即一些独立的虚拟计算机。它们相互独立、相互平等,没层次上的高下之分。
共享类库提供一些基础封装,显然可以把共享类库看做一系列小型的Utility功能芯片的集合。用户进程可以调用这些小芯片,也可以不调用,在软件的调用结构上,类库位于用户程序的下方,但实际上,它们是平等的。脚本程序,比如Python程序,由系统创建一个进程,然后紧接着加载解析引擎,由解析引擎将脚本程序转变为CPU协议定义的代码。如果细化一下视点,只关注这一个进程,可以看到,这里面是分层的,解析引擎是一层,上层的脚本程序属于上层应用,但这个分层,只有在看单独的进程的时候,这种结构体系才能体现出来,对于脚本程序,一般可以分为两层。对于中间件,其实它们是一些独立的进程,与被封装的实体进程处于同一层次。这是系统的视角来看,对于领域应用的视角看,把所构建出来的上下分层的体系结构,也是可以理解的。
仔细观察进程,从OS视角看,OS可以分为几大模块:进程管理、文件管理、网络协议栈、内存管理、设备管理、以及与平台体系有关的代码。其中进程就置于进程管理模块的协调之下,而文件在是文件管理提供的映像。其他的模块完成自己的事情,但这些都是用户层面看不到的,用户也不需要关心。从这个视角看,OS是计算机软件的主体和框架,文件和进程都只是OS的一些插件,文件是OS虚拟出来的资源,而进程则是OS虚拟出来的一些功能芯片。事实上,计算机的运行是一个大的又穷状态机,OS占据主体循环,进程只是其中一些小的循环。进程也可以看做是机器中的一些小的Uitility芯片。由OS统一管理,在某个时刻,只使用某个特定的芯片,这么看来,进程也是资源,归OS使用的资源。OS才是计算机软件的主体。
再对专用芯片、通用芯片、分时系统进程思考一下。通用芯片+逻辑才等同于专用芯片,逻辑需要存储,所以内存应当算作主机的一部分。其实CPU和内存应该是集成到一块的,只是由于物理的原因,它们才是分着的。通用芯片提供指令,这些指令的时序组合,完成一定的逻辑。这种逻辑等同于专用芯片的即时逻辑。这种时序的通用逻辑等价于专用芯片的逻辑。
对于时序组合通用芯片,时间片允许分割,允许间断,只要保存现场,在恢复后依旧可以继续执行下去,这就是OS进程管理成为可能的依据。

体系结构图:计算机方面,有时候,体系结构就会模糊起来。最简单的例子。一个简单的芯片,提供有限的一些通用指令,用这些指令来写一个小的逻辑片段,让芯片运行起来。传统的观点可以分为两层,下面是芯片,上面是这段代码逻辑。但是从代码逻辑的运行来看,这段代码的本质其实是控制这个芯片的运行时序和运行方式,代码逻辑作为芯片的控制指令,是用来调控芯片的内部逻辑的组合的。
这个不想了,没什么实际意义。
 
曾经画个一个图,没什么价值,只是画的很辛苦,就留着吧。

【Learn】理解扩展机器 - liqix - Liqix的程序世界

对了,Unix除了三大部分之外,还有一个方面,那就是权限,权限是三大部分之外的一个小部分,应当说是后来加上的一个补充。有权限自然就有用户的概念。

  评论这张
 
阅读(273)| 评论(0)
推荐 转载

历史上的今天

评论

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

页脚

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