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

My Unix World

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

 
 
 

日志

 
 

【Learn】从扩展机器到用户应用  

2008-12-16 16:28:42|  分类: L-Kernel |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在系统领域,没什么技术,看似很复杂的东西,不管是处理器的内部构造或者是Kernel的那些逻辑代码,当你熟悉了,发现这只是一些基于逻辑的应用,一切都在形式语言和自动机的范围之内。比如系统引导和ACPI,其实也就是加上一个抽象层,处理关于硬件管理的部分内容。
计算机系统中,没有什么技术或者科学,一切不过是一些基于经验的设计和实现。只是设计有优秀和糟糕的区分而已。如果能够标准化,那是大家的幸福。
鉴于自己的实力,决定放弃扩展机器这一部分,熟悉一下接口,立刻转到系统应用上。
这意味着把Kernel、芯片、Coreboot、BootLoader看做一个整体,而不再关心它们内部如何运作。这需要转换一个视角,从扩展机器的构成的视角和从系统应用的视角看,世界是完全不同的。从扩展机器内部视角看,一切SCI之外的东西都可以归结为用户逻辑和用户数据,扩展机器不需要关心具体的内容,而只是知道它们应用了机器指令和SCI,运行在机器的可寻址空间之内,是扩展机器的所有可能的逻辑组合中,一个非常有限的子集。扩展机器关心的是,这台扩展机器是怎样构成、怎样设计、怎样实现的。而在系统应用的角度看来,扩展机器是一个整体,它提供了一个环境,它所关心的是这个环境具体的样子,而不是这个环境是怎么构建的,以及建立在这个环境之上的系统构建。
从系统视角看来,这个扩展机器的特点包括:
1,它看到的是内存和外设,内存和外设都是扩展机器提供的环境,要想使用外设,必须请求SCI。扩展机器会为每个程序提供一个自己独享的内存空间,这个内存空间只有自己独享。扩展机器级而言,一切都是可访问地址空间,所不同的只是访问不同的地址空间使用不同的协议。
2,学会依赖。学会依赖是用户级程序最大的哲学。必须学会依赖SCI,而不是像扩展机器级那样自己访问地址空间,搞定一切。而对于外设的访问,只能通过SCI请求才能实现。
3,整个系统由3部分构成:扩展机器、文件、进程。扩展机器提供了一个系统运行的基础环境,它提供SCI、机器指令,以及在这些接口后面的系统资源,如内存、存储空间。
文件相对复杂一些,它包括一般文件,目录文件,符号链接文件,映像文件(又分为管道文件,/dev/*和/proc/*下的文件三类)。这并不是太精确。一般文件可以有多种分类方法,从文件的格式分,可以分为二进制文件和文本文件,从扩展机器的视角去看,又可以分为用户程序文件和用户数据文件,其中用户程序文件包含系统调用和机器码,可以生成进程,是扩展机器的指令组合所构成的所有逻辑机器中的某一个或某一种。而用户数据则对扩展机器没有任何意义,它只是用户存储的一些数据。从某种程度上说,用户数据是用户的东西,在扩展机器看来,这是计算机系统提供给用户的应用,具体怎么用,这是用户定义的协议,与计算机系统没有必然的联系。而用户程序则是用户对扩展机器的请求。在扩展机器看来,用户程序+用户数据环境+扩展机器=计算机系统,计算机系统不包括用户数据部分。用户数据具体怎么用,需要用户定义自己的使用协议。用户可以通过写一些程序,请求扩展机器充当这些协议的解释器,比如,JVM,就是这样一种协议解释器,类似的还有Emacs、SED、Python。。。。而Emacs编辑的那些文本文件、网页、Tex文件、Python源代码、Java源代码,编译后的java code,都是用户数据。目录文件和符号文件比较特殊一些,它们是为了一般文件的方便使用而引入的辅助方式。映像文件,在扩展机器看来,其实是把可访问地址空间,按照他们的访问协议进行封装,然后用文件的方式访问,也就是,扩展机器做了一个可访问空间地址协议--文件访问接口的转换,同时,还实现了对这些文件接口的访问管理和权限约束机制。访问这些映像文件,本质上就是请求扩展机器访问那些可以访问的地址空间和进程。/dev/*对应于可访问地址空间,/proc/*对应于扩展机器中的进程。把这些可访问地址空间抽象为逻辑上的文件。文件是什么?文件是一些字节流。其实扩展机器并不关心这些扩展流的内容和格式,前面对一般文件的分为程序文件和非程序文件只是从文件是不是可以被识别出来的角度看。从计算机系统的角度看映像文件,他们应该换一个名字,称为资源文件。它们代表资源。如果要对它们进行访问,可以直接访问,也可以请求扩展机器用扩展机器特有的方式访问,但是不管扩展机器用哪种方式访问,它访问的就是这些映像文件。从这个角度理解,就可以明白,Unix的一切都是文件。甚至从这个角度理解/dev/*和/proc/*才是真正的计算机系统,而扩展机器和其他文件不过是从/dev/*和/proc/*中做的一些映像。正好反过来了。Unix的一切都是文件,只是不同种类的文件而已。从计算机系统的视角,扩展机器的层次看,扩展机器提供的是:SCI+机器指令+寄存器+系统目录结构+文件+扩展机器环境(进程的创建、维护、销毁)
进程是系统必不可少的一部分,在某个时间点上,可能有多个进程存在,进程由扩展机器创建、维护、销毁,它的存在需要依赖于扩展机器。
思考这个问题,应该从系统作为出发点,而不是从人作为出发点去看系统。思考计算机系统,应该剔出shell的思维定势,意识中不应当有shell的存在。
从系统的出发点看,Shell只是一个普通进程,Shell不是程序,而是进程,是一个作了与人交互的用途的进程。它是一个While循环,它受stdin文件的影响,并且它的输出默认发送到stdout,可以对输入输出重定位。
对于扩展机器,应当把它理解为一台物理上的机器。从系统的角度看来,扩展机器的样子应当是:Kernel和CPU是一个整体,它们的整体就是一个物理上存在的芯片。它(扩展机器)提供一个供用户调用的访问接口,并且提供一种机制来维持系统体系,以及对系统运行(进程)进行管理。或者,可以把扩展机器理解为:能够提供这些指令的这个逻辑芯片,加上文件体系框架,加上/boot/*,加上/proc/*,/dev/*,/lib/modules/*,再加上系统启动脚本,这就构成了扩展机器。也可以认为这些构成了计算机系统的框架,其他的东西,只是这个附着在这个框架之上的一些用户应用或者用户数据。
干净的Unix系统也就这么点东西,其他的都是用户应用,包括类库,包括其他所有的一切工具,其他的一切用户数据。其他的都是狗屎,Shell是狗屎,Fdisk是狗屎,GCC也是狗屎。Glibc也是狗屎。干净的计算机系统+这些狗屎=供用户使用的计算机系统。相比较而言,干净的计算机系统更具有意义。
可以说,Kernel+bootloader+硬件就已经构成了计算机系统,其他的都是用户层面的应用了。其他的东西,无论多么高深,多么玄妙,并没有对构建计算机系统做出任何的贡献!!它们只是为了构建一个方便用户使用的计算机系统。对话的两方面,一方面是干净的计算机系统,另一方面是人+辅助人与计算机进行沟通的这些所有用户数据和代码。
纯净的计算机系统,已经构建了一个完整的计算机系统,其他的那些可执行代码,那些文件,那些用户进程,那些添加的设备文件,都只是在这个纯净的计算机系统基础之上的一些应用和存储了一些用户数据。纯净,不代表这是一个最小集合,而代表这是一个计算机系统的框架,事实上,它定义了这个计算机系统的可达范围和边界,比如用户逻辑可以在SCI和机器指令的所有可能组合中寻求自己需要的功能,用户文件可以在系统的文件框架下,添加自己的文件,用户可以在进程管理框架下,申请自己的进程。纯净的计算机系统是一个环境,它本身就是计算机系统的全部,其他的用户程序和数据,只是对这个计算机系统锦上添花而已。
前面的名字需要改变,把纯净的计算机系统称之为计算机系统,而如果有任何其他的用户数据或程序添加上,称之为扩展了的计算机系统。把计算机系统(即纯净的计算机系统)看做一个整体,可以把它想象成一个集成的芯片,总之是一个不可分割的整体,没有内部结构,把它当成一个完全封装了内部结构的芯片。那么包括Libc在内的所有用户数据和程序,都只是这款芯片的一些应用,无论多么丰富与强大,都只能在这款芯片所支持的范围之内存在,只能按照芯片所支持的协议环境运行。
Kernel就是操作系统,操作系统就是Kernel,而在系统之上加了一堆杂七杂八的那些东西,构成的那个扩展系统,已经不再是操作系统了。
刚才有个地方错了,系统启动脚本属于用户的东西,并不是干净的计算机系统的一部分。
特别注意,干净的计算机系统就是计算机系统,我要做的,只是为自己定制一个供自己使用的计算机系统,这一切,200%的绝对的用户行为,不涉及到任何计算机系统的系统行为。

现在,我要,(1)了解并熟悉纯净的计算机系统,(2)在这个基础上搭建自己的系统。
要了解纯洁的计算机系统,需要涉及到:(1)非常熟悉SCI、机器指令、文件架构与机制、/dev/* /proc/* /lib/modules/* /boot/* 寄存器,(2)理解Linux的系列特征。
4,Unix是简单的。非常简洁。良好的设计,足以让foolish的人都明白它的简洁。相比较而言,windows可就复杂的多,只有变态的复杂大脑才能明白。把简单的事情弄复杂,也是一种境界。用Unix,很容易就明白高内聚,低耦合的优点。Do one thing and do it well.
如果概况Unix的特点,那就是KISS。光simple不够,还要stupid才行。如果用一个词描述Unix,那就是stupid。unix=stupid。
5,Unix思想。

碰到很多文章都在说Linux/Unix的特点或者哲学。其实,这里面有一些用词不明确的地方。如,The art of Unix Programming, Advanced programming in the Unix Envrionment,等书籍,说的是怎样在这个计算机系统上构建自己的系统。它完全是用户层面的东西,而不涉及纯净的计算机系统的任何方面。
但也有一些资料混淆了两者之间的区别。如,“一切都是文件”、“权限分派机制”、,这是纯净的计算机系统的特点,也或者说这是扩展机器的特点。高内聚、低耦合,多半是指用户环境用户工具的特点。而Unix工具的优秀特征,来源于优秀的设计文化。
那么现在可以这样理解:用户的可用的计算机系统=纯净的计算机系统+Unix文化+一系列用户工具。
而Eric Steven Reymond's The art of Unix Programming 一书,就是Unix文化的集大成者。
一般而言,Unix文化属于用户层面的东西,因为,在纯净的计算机层面,Unix文化有些不太和适宜。纯净的计算机系统就这么几部分构成:芯片们、Kernel、BootLoader,它们都是一些庞然大物,一点也不简单,KISS在这里一点都不适用。最多,就是SCI的设计上,遵循历史传统,不轻易修改系统调用。

接下来,需要建立对纯净的计算机系统和可用的计算机系统的轮廓。
其中,Art一书可以用来建立可用的系统的概念,而对于纯净的计算机系统,仍然需要总结。

最后,定义一些术语,只供自己使用。

扩展机器=计算机硬件+BootLoader+OS,其中,内核不仅仅是Linux Kernel,也可以是其他OS。
计算机=计算机硬件
纯净的计算机系统=扩展机器
计算机系统=扩展机器 || 扩展机器+用户逻辑
完整的计算机系统=计算机系统
可用的计算机系统=扩展机器+用户逻辑
扩展的计算机系统=可用的计算机系统
OS=操作系统=操作系统内核。
Kernel=Unix Kernel
Unix机器=计算机硬件+BootLoader+Kernel
Unix=Unix机器 || Unix机器+用户逻辑
Unix系统=Unix机器+用户逻辑
Linux机器=计算机硬件+BootLoader+Linux Kernel
Linux=GNU/Linux=Linux机器+一系列工具。

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

历史上的今天

评论

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

页脚

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