linux系统的层次结构,关于Linux操作系统层次结构分析

本文转自http://www.jb51.net/LINUXjishu/214104.html

首先来看一张图(这是Linux操作系统的大致层次结构):

9bce4b9679e4adcd85c09b066c00a2f94eb.jpg

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

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

为了方便调用内核,Linux将内核的功能接口制作成系统调用(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是一个命令解释器(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。它们出现的年代不同,所支持的功能也有差异。)

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

最后,我们进入一般的应用。应用是一个程序,它可以

1.直接调用系统函数

2.调用库函数

3.运行shell脚本

这些应用可以由多种语言开发。最常见的是C语言。

总结 :

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

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

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

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

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

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

相关文章

Windows Vista版本比较

Windows Vista上市在即,对许多朋友来说目前急待解决的问题便是,在升级或购买时应该选择Windows Vista的哪个版本,哪个版本更契合自己的应用需求,究竟应该选择Windows Vista Home呢还是Windows Vista Ultimate?等等。 之前在Windo…

shellcode---c和汇编混合编程---弹出cmd

首先用C/C语言实现弹出cmd #include "stdio.h" #include "windows.h"int main(int argc, char* argv[]) {printf("begin\n");HINSTANCE libHandle;char *dll"kernel32.dll";libHandleLoadLibrary(dll);WinExec("cmd.exe",S…

ajax 复制到“剪贴板”

有时候可能会做一些“复制”按钮的功能&#xff0c;当用户点击“复制”按钮时&#xff0c;就会将要复制的内容复制出来&#xff0c;以下代码即实现“复制”按钮的功能。该功能需要用到AJAX的PageMethods来调用页面后台代码来实现。 调用PageMethods&#xff0c;需要引用 <sc…

找到最大回文子串_使用O(1)空间复杂度找到最大的回文子串

找到最大回文子串Problem statement: 问题陈述&#xff1a; Given a string, you have to find the largest palindromic substring using O(1) space complexity. 给定一个字符串&#xff0c;您必须使用O(1)空间复杂度找到最大的回文子字符串。 Input:T Test caseT no of in…

日期计算

描述 如题&#xff0c;输入一个日期&#xff0c;格式如&#xff1a;2010 10 24 &#xff0c;判断这一天是这一年中的第几天。 输入 第一行输入一个数N&#xff08;0< N<100&#xff09;,表示有N组测试数据。后面的N行输入多组输入数据&#xff0c;每行的输入数据都是一个…

c语言程序设计编程解读,【答题】C语言程序设计问题与解释实验

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#define N 13main(){int y,m,D,q,t0,i,day0,a0,Day,n,k,O[N]{0,31,29,31,30,31,30,31,31,30,31,30,31},p[N]{0,31,28,31,30,31,30,31,31,30,31,30,31};//y是年&#xff0c;m是月&#xff0c;D是日&#xff0c;q计算周几&am…

blog的转变

从技术为主的blog&#xff0c;变为记录生活琐事的blog&#xff0c;OMG&#xff01;天气晴朗&#xff0c;不过心情并不怎么轻松&#xff0c;论文下周必须要写完&#xff0c;同时留校结果也就该出来了。曾经一度以为&#xff0c;一个人最快乐自由。不过不得不承认&#xff0c;或许…

没有值的json字符串_Java中具有原始数据类型值的字符串连接

没有值的json字符串Given a string and some of the primitive data type values, we have to concatenate them with the string in Java. 给定一个字符串和一些原始数据类型值&#xff0c;我们必须将它们与Java中的字符串连接起来。 In the example below, we have declared…

a letter and a number(一封信和一个数字)

描述 we define f(A) 1, f(a) -1, f(B) 2, f(b) -2, … f(Z) 26, f(z) -26; Give you a letter x and a number y , you should output the result of yf(x). 我们定义f ( A ) 1&#xff0c;f ( A ) - 1&#xff0c;f ( B ) 2&#xff0c;f ( B ) - 2&#xff0c;…

c语言初始化字符数组为空,怎么把已经初始化的字符数组设置为空?

怎么把已经初始化的字符数组设置为空&#xff1f;两种方法&#xff0c;如下所示。方法一&#xff1a;代码演示#include #include int main(void){char a[]{x,y,z}; //定义字符数组&#xff0c;并初始化int i0;for(i0;i<3;i)printf("%c\t",a[i]); //输出初始化的数…

C和汇编混合编程---栈平衡

最近在搞C和汇编混合编程&#xff0c;对栈平衡有点小理解&#xff0c;记录一下 当我们调用一个API或者子程序时时&#xff0c;API和子程序可以理解为函数&#xff0c;我们不必在返回的时候平衡栈里面的函数参数&#xff0c;但C语言库函数要我们自己平衡栈数据&#xff0c; 比如…

[导入]2006年10大变态站名网站排名

作者&#xff1a; 马国良 | 2006年11月14日13时31分 | 【内容提要】第一名&#xff1a;妈妈说…… 入选原因&#xff1a;单看了两个域名就让人觉得变态“妈妈说就算你注册的域名再长google都能搜索出来”(mamashuojiusuannizhucedeyumingzaichanggoogledounengsousuochulai.cn)…

如何创建Java程序

(1),点击 (2),点击OK (3),File->New->Project… (4),Java Project->Next> (5),Project name随便填&#xff08;这里以qweqwe为例&#xff09; 然后Finish (6),鼠标右击qweqwe&#xff08;随便名称都可以&#xff09;->New->Class (7),同理&#xff0c;…

改变地址栏图标

<link rel"icon" href"/favicon.ico" type"image/x-icon" />转载于:https://www.cnblogs.com/heshuiping/archive/2011/06/04/2072515.html

在JavaScript中以日期/月/年格式获取当前日期

在JavaScript中获取当前日期 (Getting current date in JavaScript) To get the current date in JavaScript, we need to use three library functions of Date class, 要在JavaScript中获取当前日期 &#xff0c;我们需要使用Date类的三个库函数&#xff0c; Date getDate()…

c语言数据转移,重温C语言(2)之数据

一 数据类型数据就是代表某些信息的数字和字符。按计算机的储存方式可分为两大基本类型&#xff1a;整数类型和浮点数类型。1 关键字初始C90C99intsigned_Boollongvoid_Complexshort_Imaginaryunsignedcharfloatdouble2 存储单元首先得记住&#xff0c;计算机内部都是以二进制进…

对esp和ebp分析来了解函数的调用过程

esp&#xff1a;扩展栈指针寄存器&#xff0c;是指针寄存器的一种&#xff0c;用于存放函数栈顶指针&#xff08;栈顶指针&#xff09; ebp&#xff1a;扩展基址指针寄存器&#xff0c;也被称为帧指针寄存器&#xff0c;用于存放函数栈底指针&#xff08;栈底指针&#xff09;。…

放大镜,缩小镜

今天看了 CSDN上的很多文章&#xff0c;有很经典的&#xff0c;也有比较一般的&#xff0c;加上昨天我们老大发给我看的一些CEO的讲话内容的文章&#xff0c;突然发现&#xff0c;不知道是这个行业内部的问题还是整个国内评论家门的问题&#xff0c;在讨论和研究一个问题的时候…

SEO你所不知道的!!SEO资源人脉才是王道

头脑在个人身上&#xff0c;思维在自己脑中&#xff0c;自己为什么要老是听从别人的话语呢?别人让你往西&#xff0c;你就直奔西处吗?这是我以前犯下的一个错误&#xff0c;总感觉自己好像就是再为 别人而用&#xff0c;自己的理想目标何在?因为刚入社会&#xff0c;遇到这样…

仿射变换 c语言,c语言数字图像处理(三):仿射变换

仿射变换及坐标变换公式几何变换改进图像中像素间的空间关系。这些变换通常称为橡皮模变换&#xff0c;因为它们可看成是在一块橡皮模上印刷一幅图像&#xff0c;然后根据预定的一组规则拉伸该薄膜。在数字图像处理中&#xff0c;几何变换由两个基本操作组成&#xff1a;(1)坐标…