linux 架构



 

最内层是我们的硬件,最外层是我们常用的各种应用,比如说使用firefox浏览器,打开evolution查看邮件,运行一个计算流体模型等等。硬件是我们的物质基础,而应用是我们所要奋斗的目标,但在两者之间,还要经过一番周折。

还记得我们在Linux启动的时候。首先会启动内核 (kernel),内核是一段计算机程序,这个程序直接管理管理硬件,包括CPU、内存空间、硬盘接口、网络接口等等。所有的计算机操作都要通过内核传递给硬件。

 

为了我们方便调用内核,我们将内核的功能总结成为系统调用(system call)。系统调用看起来就像是的C语言函数,你也可以在程序中直接调用。Linux系统有两百多个这样的系统调用。系统调用给了上层程序一个清晰的接 口,隐藏了内核的复杂结构。一个操作系统上的功能可以看作是系统调用的组合的效果,而且一个操作系统不可能作出超越系统调用的动作。可以说一个系统调用函 数就像是汉字的一个笔画,任何一个汉字都要由基本的笔画(点、横、撇等等)构成,而且我们不能臆造出笔画。在命令行中输入$man 2 syscalls可以查看所有的系统调用。你也可以通过$man 2 read来查看系统调用read()的说明。在这两个命令中的2都表示我们要在2类(系统调用类)中查询 (具体各个类是什么可以通过$man man看到)。

 

由于系统调用非常基础,所以有时使用起来很麻烦。比如说一个简单的给变量分配内存空间的操作,就需要动用多个系统调用。Linux定义一些库函数(library routine)来将系统调用组合成某些常用的功能,以方便我们编程。比如上面的分配内存的操作,看以定义成为一个库函数(像malloc()这样的函 数)。再比如说,在读取文件的时候,系统调用要求我们设置好所需要的缓冲。我们这个时候可以使用Standard IO库中的读取函数,而这个读取函数既负责设置缓冲,又负责使用读取的系统调用函数。使用库函数对于机器来说并没有效率上的优势,但可以把程序员从细节中 解救出来。库函数就像是汉字的偏旁部首,它由笔画组成,但使用偏旁部首更容易组成字,比如"铁"。当然,你也完全可以不使用库函数,而直接调用系统函数,就像“人”字一样,不用偏旁部首。

(实际上,一个操作系统要称得上是UNIX系统,必须要拥有一些库函数,比如ISO C标准库,POSIX标准等。)

 

至于shell,可以看作一种特殊的应用。实际上我们之前所说的命令行,就是shell。shell是一个命令解释器(interpreter),当我们输入“ls -l”的时候,它将此字符串解释为1) 在默认路径找到该文件(/bin/ls),2) 执行该文件,并附带参数"-l"。我们之前用>表示重新定向,用|表示管道,也是通过shell进行理解&或者|的含义,再通过系统调用指挥kernel建立具体的重定向或者管道机制。在没有图形界面之前,shell充当了用户的界面,当用户要运行某些应用的时候,要通过shell输入命令,以建立运行程序。shell可以执行符合shell语法的文本,这样的文本叫做shell脚本(script)。我们可以在图中看到,shell下通系统调用,上通各种应用,同时还有许多自身的便利可以使用,这些条件让shell脚本可以实现非常强大的功能。UNIX的一条哲学是让每个程序尽量独立的做好一个小的功能。而shell充当了这些小功能之间的"胶水",让不同程序能够以一个清晰的接口(文本流)协同工作,从而增强各个程序的功能。(这也是我们鼓励多用shell,少用图形化界面的原因之一。)

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

一个使用bash shell的终端

一个shell对应一个终端 (terminal)。曾经来说,终端是一个硬件设备,用来输入并显示输出。如今,由于图形化界面的普及,终端往往就像上图一样,是一个图形化的窗口。你 可以通过这个窗口输入或者输出文本。这个文本直接传递给shell进行分析解释,然后执行。

最后,我们进入一般的应用。应用是一个程序,它可以1) 直接调用系统函数 2) 调用库函数 3) 运行shell script。这些应用可以由多种语言开发(当然,最常见的是C语言),以满足我们使用计算机的各种需要。

 

总结 

我们 可以看到,Linux利用kernel实现软硬件的对话。通过系统调用的这个重要的接口,Linux将上层的应用与下层的kernel完全分离开,为程序 员隐藏了底层的复杂性(相应的,也提高了上层应用的可移植性)。当我们在升级kernel的时候,也可以保持系统调用的语句不变,从而让上层应用不感受到 下层的改变。库函数利用系统调用创造出模块化的功能,而shell则提供了一个用户界面,并让我们可以利用shell的语法编写脚本,以整合程序。

而所有的这些安排也为其他应用的开发提供了便利。

 

转载于:https://www.cnblogs.com/liangxiaofeng/p/3665763.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

py学习,列表,判断,循环

列表 1.1 列表是什么 python 中可以通过组合一些值得到多种复合数据类型。其中最常用的是列表,可以通过方括号括起,逗号分隔的一组值(元素)得到,一个列表可以包含不同类型的元素,一个列表的元素各个类型相同…

现代软件工程讲义 3 代码规范与代码复审

请参考原址:http://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html 第10章 代码规范与代码复审 在第9章中,同学们完成了WC程序,经过评比,九条的程序获得了第一名。这时,阿超说,现代软件产业经过几十…

HDU 2159 FATE (DP 二维费用背包)

题目链接 题意 : 中文题不详述。 思路 : 二维背包,dp[i][h]表示当前忍耐值为i的情况下,杀了h个怪得到的最大经验值,状态转移方程: dp[i][h] max(dp[i][h],dp[i-a[j].toler][h-1]a[j].exper) ; 1 //21592 #…

TinyFrame升级之五:全局缓存的设计及实现

在任何框架中,缓存都是不可或缺的一部分,本框架亦然。在这个框架中,我们的缓存分为两部分:内存缓存和单次请求缓存。简单说来,就是一个使用微软提供的MemoryCache做扩展,并提供全局唯一实例;另一…

问题思维导向

杨淼信息与计算机科学 跆拳道国家一级教练员 曾经tricking爱好者3 人赞同了该回答一个不算建议的建议 直接看,看到不懂的就查相应的知识(据说牛人都靠wiki活着)。 知识当有需求的时候,才会学的更快。 觉得这样做的好处是&#xff…

【Mail】telnet收发邮件过程

文章原址:http://www.cnblogs.com/h--d/p/6125993.html 作者写的真棒,按照步骤一步一步都可执行,我是在centos7服务器下进行的实验,命令完全和下面一样,注意的地方是: 1,centos7要安装telnet&a…

入门训练 Fibonacci数列

http://lx.lanqiao.org/problem.page?gpidT4入门训练 Fibonacci数列 时间限制:1.0s 内存限制:256.0MB问题描述Fibonacci数列的递推公式为:FnFn-1Fn-2,其中F1F21。 当n比较大时,Fn也非常大,现在我们想知…

python模块与包的导入

一&#xff0c;模块 1&#xff0c;下面是hello.py脚本(模块)&#xff0c;有两求Fibonacci的函数. def fib1():a, b 0, 1print(0-10内:)while a < 10:print(a, end )a, b b, a bprint()def fib2(n):a, b 0, 1L []while a < n:L.append(a)a, b b, a bprint(L)retu…

第11章 进入保护模式

对照代码重点理解一下三个要点&#xff1a; 1,从实模式到保护模式的整体过程&#xff1b; 2&#xff0c;实模式怎样安装GDT&#xff1b; 3&#xff0c;从实模式怎样过渡到安全模式&#xff1b; 4&#xff0c;安全模式怎样寻址&#xff1b; 代码如下&#xff1a; ;代码清单1…

ASP.NET学习笔记之操作过滤器

转载于:https://www.cnblogs.com/kevin1988/p/3684442.html

第12章 存储器的保护

学习32位保护模式明显感觉比16位实模式复杂一些&#xff0c;其实两者之间所做的事情是一样的&#xff0c;无非是对内存的各种操作&#xff0c;对栈的各种操作&#xff0c;但是手段不一样&#xff0c;实模式是野蛮的&#xff0c;可以在任意地方读写&#xff08;比如代码区&#…

with open的使用

1, open(‘file’, mode) 第一个参数是包含文件名的字符串。第二个参数是另一个字符串&#xff0c;其中包含一些描述文件使用方式的字符。mode 可以是 ‘r’&#xff0c;表示文件只能读取&#xff0c;‘w’ 表示只能写入&#xff08;已存在的同名文件会被删除&#xff09;&…

Android硬件抽象层(HAL)概要介绍和学习计划 1转

最近和另外一家开发公司涉及到合作,一直希望了解Android从Linux到App整个架构和流程,那家开发工程师也不断提供帮助,不过如果借助后面几篇博客,相对系统和完整的可以了解更加清晰, <博客:http://blog.csdn.net/luoshengyang/article/details/6567257> Android的硬件抽象层…

第13章 程序的动态加载和执行(二,用户代码)

弄清楚两个问题&#xff0c;这段应用代码就容易读懂了&#xff1a; 1&#xff0c;核心代码是如何把指针指到这里的&#xff1b; 2&#xff0c;这段代码是如何使用内存的&#xff1b; 读这个代码的时候&#xff0c;可以类比我们平时写的练习小程序&#xff0c;以C程序为例&am…

【雷军】给程序员的五点建议--如何成为编程高手并以此创业

除非特别注明&#xff0c;鸡啄米文章均为原创转载请标明本文地址&#xff1a;http://www.jizhuomi.com/career/286.html写在前面&#xff1a;此篇文章出自雷军之手&#xff0c;是他为软件开发2.0技术大会准备的演讲稿&#xff0c;但由于某些原因没有派上用场。这里跟大家分享下…

计算机网络重要机制(一)可靠数据传输

操作系统&#xff0c;计算机网络都属于计算机系统&#xff0c;为了使得整个系统运行起来&#xff0c;人们根据当时的硬件条件和理论认识设计了各种的算法&#xff08;也可以叫机制&#xff09;&#xff0c;这些机制有些被抛弃&#xff0c;有些被进化。所以操作系统、计算机网络…

命名空间和作用域

一&#xff0c;namespace namespace是名字到对象的映射&#xff0c;python里面的大部分命名空间由字典实现。如果有性能问题&#xff0c;会更改。 命名空间的举例 •存放内置函数的集合&#xff08;abs()这种函数&#xff0c;和内建的异常&#xff09; •模块中的全局名称 •函…