[转载] Linux架构

做者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!html

 

我如下图为基础,说明Linux的架构(architecture)。(该图参考《Advanced Programming in Unix Environment》)

程序员

 

最内层是硬件,最外层是用户经常使用的应用,好比说firefox浏览器,evolution查看邮件,一个计算流体模型等等。硬件是物质基础,而应用提供服务。但在二者之间,还要通过一番周折。shell

还记得Linux启动。Linux首先启动内核 (kernel),内核是一段计算机程序,这个程序直接管理管理硬件,包括CPU、内存空间、硬盘接口、网络接口等等。全部的计算机操做都要经过内核传递给硬件。编程

 

为了方便调用内核,Linux将内核的功能接口制做成系统调用(system call)。系统调用看起来就像C语言的函数。你能够在程序中直接调用。Linux系统有两百多个这样的系统调用。用户不须要了解内核的复杂结构,就可使用内核。系统调用是操做系统的最小功能单位。一个操做系统,以及基于操做系统的应用,都不可能实现超越系统调用的功能。一个系统调用函数就像是汉字的一个笔画。任何一个汉字都要由基本的笔画(点、横、撇等等)构成。我不能臆造笔画。浏览器

在命令行中输入$man 2 syscalls能够查看全部的系统调用。你也能够经过$man 2 read来查看系统调用read()的说明。在这两个命令中的2都表示咱们要在2类(系统调用类)中查询 (具体各个类是什么能够经过$man man看到)。bash

 

系统调用提供的功能很是基础,因此使用起来很麻烦。一个简单的给变量分配内存空间的操做,就须要动用多个系统调用。Linux定义一些库函数(library routine)来将系统调用组合成某些经常使用的功能。上面的分配内存的操做,能够定义成一个库函数(像malloc()这样的函数)。再好比说,在读取文件的时候,系统调用要求咱们设置好所须要的缓冲。我可使用Standard IO库中的读取函数。这个读取函数既负责设置缓冲,又负责使用读取的系统调用函数。使用库函数对于机器来讲并无效率上的优点,但能够把程序员从细节中解救出来。库函数就像是汉字的偏旁部首,它由笔画组成,但使用偏旁部首更容易组成字,好比"铁"。固然,你也彻底能够不使用库函数,而直接调用系统函数,就像“人”字同样,不用偏旁部首。网络

(实际上,一个操做系统要称得上是UNIX系统,必需要拥有一些库函数,好比ISO C标准库,POSIX标准等。)架构

 

shell是一个特殊的应用。不少用户将它称为命令行。shell是一个命令解释器(interpreter),当咱们输入“ls -l”的时候,它将此字符串解释为模块化

  1. 在默认路径找到该文件(/bin/ls),
  2. 执行该文件,并附带参数"-l"。

我以前用>表示从新定向,用|表示管道,也是经过shell解释&或者|的含义。Shell接着经过系统调,用指挥内核,实现具体的重定向或者管道。在没有图形界面以前,shell充当了用户的界面,当用户要运行某些应用时,经过shell输入命令,来运行程序。shell是可编程的,它能够执行符合shell语法的文本。这样的文本叫作shell脚本(script)。能够在架构图中看到,shell下通系统调用,上通各类应用,同时还有许多自身的小工具可使用。Shell脚本能够在寥寥数行中,实现复杂的功能。函数

UNIX的一条哲学是让每一个程序尽可能独立的作好一个小的功能。而shell充当了这些小功能之间的"胶水",让不一样程序可以以一个清晰的接口(文本流)协同工做,从而加强各个程序的功能。这也是Linux老鸟鼓励新手多用shell,少用图形化界面的缘由之一。

(shell也有不少种,最多见的是bash, 另外还有sh, csh, tcsh, ksh。它们出现的年代不一样,所支持的功能也有差别。)

一个使用bash shell的终端

一个shell对应一个终端 (terminal)。曾经来讲,终端是一个硬件设备,用来输入并显示输出。现在,因为图形化界面的普及,终端每每就像上图同样,是一个图形化的窗口。你能够经过这个窗口输入或者输出文本。这个文本直接传递给shell进行分析解释,而后执行。

最后,咱们进入通常的应用。应用是一个程序,它能够

  1. 直接调用系统函数
  2. 调用库函数
  3. 运行shell脚本

这些应用能够由多种语言开发。最多见的是C语言。

 

总结 

Linux利用内核实现软硬件的对话。

经过系统调用的这个接口,Linux将上层的应用与下层的内核分离,隐藏了底层的复杂性,也提升了上层应用的可移植性。

库函数利用系统调用创造出模块化的功能,

Shell则提供了一个用户界面,并让咱们能够利用shell的语法编写脚本,以整合程序。

相关文章
相关标签/搜索