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

My Unix World

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

 
 
 

日志

 
 

理解LFS  

2009-01-09 01:03:54|  分类: linux-system |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
声明:这篇文章只是为自己理解 LFS而勾勒粗略轮廓,其中很多说法或者大多数说法都不严谨,只是提供一种思路,这篇文章只具备启发意义,作为抛砖引玉之用,不具备借鉴、学习价值。另 外,语句结构不通顺,因为目标只是自己能看懂。没有设为私有,是为不登陆也能看比较方便。特此声明。
========================================================================================
对 LFS的组成包进行分类后,大吃一惊,类似于内存查看,进程管理等,居然是用户层面的事情,而内核只是提供系统调用,这些工具借助内核的系统调用完成这些 事情。如果从这个角度(应用程序的视角,并且是应用程序调用系统调用完成它所要完成的功能的角度),Kernel也只是一个类库(吐字不清读成内裤,呵 呵),不过这个类库可不简单,它是一个复杂的类库,或者把它看成一个庞大函数,对外提供功能不同的各种函数接口。
了解到这里,要理解Linux系 统结构,需要做的事情是:1,了解系统调用,2,了解POSIX、LSB以及常见的库函数,尤其是Glibc,3,熟悉这些常用包。Debian有1.5 万个包,但常用的也就LFS涉及到的这四五十个,即使常规应用,也不过两三百个,基本上不超出BLFS所涉及的范围。
曾经尝试阅读GRUB的那两个asm文件,到头来还是没读懂,不过有件收获就是,明白了有系统调用可以用是多么幸福的一件事情。想想如果没有文件管理,自己去读写磁盘,还要考虑扇区,并且处理二进制的编码,又要处理文件格式,还要区分文本文件和binary文件。
其 中,个人认为,最关键的一步是认识到内核的有限功能。内核尽可能地压缩自己的功能,任何应用性质的功能,都不是内核需要完成的任务。内核不等同于一个计算 机系统。内核、类库、内核扩展工具、系统工具、基础工具共同构成一个可用的计算机系统,而这些合称为系统软件,这是与应用软件相对应的。
内核是懒惰的,从对外接口上看,它只有三大任务:硬件管理框架、进程管理框架、以及系统调用。应用性质的硬件管理和进程管理以及除此之外的计算机管理,都是由单独的应用层的程序完成,它们一般需要借助系统调用的支持。
Kernel的模块构成、对硬件的管理、应用程序与Kernel的交互、Kernel对系统的控制与管理、系统调用、头文件C库以及Posix。这是我对内核需要学习的内容。
之后,站在内核的角度去理解其他软件包和系统构成。

内核仍然像是一个有穷状态机,从本质上看,它只是扩大了功能的CPU,其实内核与CPU的功能可以相互推脱,完全可以把内核的所有功能都由CPU完成。但,软件的好处是可升级性和良好的可扩展性。
内核是一台有穷状态机, 它自己按照内部既定的逻辑运行,而不需要用户的干预。所以,任何交互性的功能与操作(包括系统管理),都不是内核的范畴,需要在系统调用的基础上,编写应 用程序去实现。比如kdb、procps、psmisc之类的工具包,或者是Grub之类的引导包,也或者E2fsprogs、udev等。
内核 仅有的交互功能就是SCI,用户也只能通过sysem_call()这个接口,以机器语言的方式,进行交互(编程的方式,因为程序需要便以为二进制代码才 能运行)。从这个层面看,CPU提供的特权模式,其实与用户是没什么关系的。因为它被内核独占,而且内核只有一个sysem_call()接口与用户交 互。
没有操作系统的机器是裸机,有了内核的机器才是一台可用的,有意义的有穷状态机。
可以把硬件、BIOS、Grub和内核构成的整体看做一台广义上的有穷状态机。这称为扩展机器。扩展机器+类库+系统工具=计算机系统。计算机系统+应用程序=可用的计算机系统。
扩 展机器的只由程序进行使用,它是面向程序的,扩展机器与程序交互的接口是扩展了的机器语言(屏蔽了专用指令和特权模式,并增加了系统调用),这种扩展的机 器语言是外界(人和应用程序逻辑)与扩展机器进行交互的协议和规范。可以把这种扩展的机器语言当作一份协议来理解,类似TCP/IP。其中,对扩展机器的 操作,必须使用SCI,而原始的机器语言,只用来构建应用程序的逻辑。所有对扩展机器的操作,必须请求SCI才能完成。
理解这个扩展机器非常重要。明白它的职责和交互方式。
扩 展机器并不排斥与人的直接沟通,但前提是必须遵循它所定义的接口规范(机器语言+SCI),而这并非人的特长,所以出现了一系列的应用程序,来辅助人完成 这件事。从扩展机器的视角看,这些应用程序,比如free、fdisk、bash都是用来辅助人来完成这个交互的。交流的两方:一方是扩展机器,另一方是Bash+各种系统工具+人这些系统工具,属于人的这一方,它们只是人的附属,是人不可分割的一部分因为它们是工具,工具的作用只是延长人的手臂。这是系统管理和应用的视角看,计算机系统是如何构成的。
从 应用程序开发的角度看计算机系统的构成,可以分为2层:1,扩展机器。2,程序。其中,程序又可以细化为两层层:1,类库;2,可执行程序代码。对于扩展 机器一方面,这里只关注扩展机器的运行和应用,并不涉及扩展的机器的生产和组装(如内核开发和系统安装),而对于程序这一端,还需要关注程序的生成和引 导。人的思想+编辑器------>source code。 source code+编译器-----------> 能调用类库或直接与扩展机器交互的二进制程序代码。程序的生成过程是一个水平分块,而扩展机器+类库+程序则是纵向分层。
再从人的角度看,人根本接触不到扩展机器,人生活在类库、编译器、系统工具构建起来的世界中。现在要关注的就是,这个世界是怎么构筑起来的。
首先,了解扩展机器的结构,熟悉扩展机器定义的交互协议。然后,掌握类库,熟练使用开发工具,理解系统管理工具。并且,会用系统脚本,明白系统结构,能够组装系统。

libary包中包含的tools和普通包中包含的tools,职责似乎有些不同,lib包中的工具,主要用于辅助库函数操作。
Unix提供一层对机器的基本封装,它提供了一种能力,具体做什么事情,由上层的应用程序实现。简单、清晰、稳定、数量有限的一些系统调用之上,几乎可以做任何事情。而glibc及各个工具和类库,则提供了一些辅助工具,让用户在Unix Kernel之上可以无限发挥的天地中自由发挥。人与机器和OS之间,有巨大的鸿沟,而这些类库和工具则像是载人在OS强有力的能力的广阔原野上奔驰的骏马或者汽车,有了这些有力的工具,人可以与计算机的逻辑进行沟通,可以随心所欲地操作这些逻辑,以一种虚拟的方式改变芯片内部的逻辑电路序列。这是工具的力量。虽然如果使用这些工具,不可能100%操作机器的能力,但优秀的工具可以操作绝大部分的机器能力,更重要的是操作的效率,比没有工具将会强大几十几百倍。
glibc包中的那些类库和工具,就可以这样理解,其他的包,也可以这样理解。

虽然在OS封装硬件的时候,损失了很多基础操作的能力。但这是一个无奈的折衷。在封装之后,整个系统的逻辑运算能力,还是完整的保存着,绝大部分对设备正常使用和操作的逻辑组合依然是可用的,在OS封装硬件过程中,损失的大多是一些没有实用价值的逻辑组合。建立在Kernel之上的SCI+CPU指令组合,依然是强大的。

各种类库和工具包正是建立在这个强大的基础之上。

关于shell,
其实Shell这个名字并不确切,它确切的名字应该叫Const Programe, Runner, All-day-long-worker, etc. 首先是OS,OS控制整个机器,构建机器环境,OS是常运行的。在OS提供的虚拟硬件之上,有一些虚拟终端在运行,如rxvt,它们的作用是进行一系列的格式转换,虚拟终端的本质是一个协议转换层,以提供对历史上终端协议的兼容。Shell只是一个执行While循环的普通应用程序,它与虚拟终端在大部分时间有一一对应关系,用户的输入,由OS转交给虚拟终端,虚拟终端进行协议转换,然后转交给shell,shell在它的循环中识别用户输入的意义,执行相应的操作。输出也是类似。虚拟终端是一个相对静态的程序,它的职责只是一个数据变换的通道,经过的它的数据转换后从另一端出来。Shell是OS的陪伴者,它和OS几乎有相同的运行时间长度。OS只是进行硬件相关的功能逻辑操作,大部分能力,它以SCI和机器指令的方式提供给调用者,这要求在应用层有相应的驱动来使用这些SCI和机器指令,需要一个或一些顶层驱动程序。这个职责由守护进程和Shell进程完成。守护进程只处理特定的触发事件,其他的事件由Shell相应。如果把整个计算机系统看做一个程序,Shell就是main函数,OS则是程序解释器。终端只是相对静止的进程,只是传统物理终端的替代物。login、以及系统启动的那些进程,只在特定的时期启动,做完自己的任务,结束。

其他所有的用户程序可以看做Shell的插件,Shell是一个提供机制的main函数。
  评论这张
 
阅读(263)| 评论(0)
推荐 转载

历史上的今天

评论

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

页脚

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