1、Linux概述   

    Linux是一种自由和开放源代码的类UNIX操作系统。严格来讲,术语Linux只表示操作系统内核本身,但通常采用Linux内核来表达该意思。Linux则常用来指基于Linux内核的完整操作系统,包括GUI组件和许多其他实用工具。由于这些支持用户空间的系统工具和库主要由理查德·斯托曼于1983年发起的GNU计划提供,FSF提议将该组合系统命名为GNU/Linux,但Linux不属于GNU计划,所以这个名称并没有得到社区的一致认同,但我们不能忘记GNU运动对Linux的推动作用。此外,只要遵循GNU通用公共许可证,任何个人和机构都可以自由地使用Linux的所有底层源代码。

  *专业术语


UNIX

一种计算机操作系统,具有多任务、多用户的特征。于1969年,在美国AT&T公司的贝尔实验室由肯·汤普逊开发。

GUI组件

支持图形化桌面的工具

GNU计划

GNU计划(英语:GNU Project),又译为革奴计划,是一个自由软件集体协作项目,旨在实现软件的开源和合作

FSF

其主要工作是执行GNU计划,开发更多的自由软件

GNU通用公共许可证

也叫做LGPL协定,是人们对于开源代码的使用所必须遵循的规范




2、Linux发展

    摒弃华丽的图形界面,转而更加注重系统安全和性能的linux,必将受到人们的重视。慢慢的,一些个人和企业开发的第三方的非GNU组件也开始提供对Linux内核的支持,包括大量的有内核模块、用户应用程序和库等内容。Linux社区或企业也都开始推出一些重要的Linux发行版。

Linux,你了解多少!_系统工具




3、Linux工作原理

  Linux,你了解多少!_计算机_02

   linux的最底层同样是CPU,内存各种各样的硬件,工作在硬件之上的内核才是整个linux操作系统最为重要的一环,其重要性,下面详细介绍。内核之上的是各种应用程序,还包括一个非常重要的shell接口,应用程序通过shell进程中的其他应用程序,比如cat,touch等,这些应用程序再通过编译和汇编,转换为二进制程序,已实现对硬件的操作,其可类比为Windows的点击事件。

    下面介绍一下内核在整个系统中的重要性:应用程序要想利用底层硬件的计算能力,就必须有一个应用程序程序来驱动硬件,而且上层的应用程序必须经过编译,才能转换为计算机能够识别的二进制代码。意味着任何一个应用程序要想运行,不仅需要一套完整的驱动,还要一个编译器。要知道,早期的CPU都有着自己特定的指令集,这也就决定了上层所调用的库的不同。即使你对某个程序完成了编译,当程序换做另一个平台时,编译过程将需要重新进行,而且原先驱动硬件的程序也将失去意义,程序的可移植性大大减低。于是就有了内核,它通过系统调用(System Call)隔离了不同应用程序对不同厂商CPU的依赖,不仅自身提供了强大的编译功能,而且驱动各种硬件的驱动程序也加载至内核,程序的便捷性大大提高。那么,上层的应用程序又是怎么编写的呢,利用那数不清的0和1?还是直接利用内核提供的System Call?显然都不可能,这些原始的编程接口,相信只有骨灰级的工程师才会调用吧!这时候内核将又派上重要用场,它对系统调用进行再一次的封装,变成库调用(Library Call)也就是ABI(应用程序二进制接口,也就是.so之类的文件),进而有了BIF(内置函数),也就是API(应用程序编程接口,如print(),if等),通过c的与硬件的强有利的契合特性,即可以将其写成源码。这些代码可以直接使用也可以被应用程序所调用。在此之上,诞生了大量的应用程序一个完整的linux操作系统就可以顺利的工作起来了。

库:也就是诸多的开发包安装之后的产物




接下来重点理解一下系统调用


介绍系统调用

系统调用:每个进程都运行在虚拟系统中,而在用户空间和系统的其余部分提供这样一层公共接口,也是出于这种考虑。如果应用程序可以随意访问硬件而内核又对此一无所知的话,几乎就没法实现多任务和虚拟内存,当然也不可能实现良好的稳定性和安全性。在Linux中,系统调用是用户空间访问内核的惟一手段;除异常和中断外,它们是内核惟一的合法入口。

系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序。系统调用是用户程序和内核交互的接口。通过系统调用可以很方便快捷的实现一些系统功能。

个人理解,如果把内核比作一个类,那么系统调用就是公有接口,供外部应用程序调用。

---->内核通过系统调用的功能提供进程的访问接口

一个程序的执行流:

应用程序

词法分析

库调用或者系统调用

内核

二进制

硬件


系统调用的意义

系统调用在用户空间进程和硬件设备之间添加了一个中间层。该层主要作用有:

<1>它为用户空间提供了一种统一的硬件的抽象接口。比如当需要读些文件的时候,应用程序就可以不去管磁盘类型和介质,甚至不用去管文件所在的文件系统到底是哪种类型。(虚拟文件系统,完成文件读写操作)

<2>对用户空间的程所创建的进程或者销毁的进程再内核空间统一处理。(进程管理操作,完成进程的创建和销毁等)

....

这里是常见的系统调用列表

----->http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html

<3>系统调用保证了系统的稳定和安全。作为硬件设备和应用程序之间的中间人,内核可以基于权限和其他一些规则对需要进行的访问进行裁决。举例来说,这样可以避免应用程序不正确地使用硬件设备,窃取其他进程的资源,或做出其他什么危害系统的事情。(用户空间和内核空间的切换)再理解一下API和系统调用的关系


系统调用和api的关系

关于Unix的界,有一句通用的格言“提供机制而不是策略”。换句话说,Unix的系统调用抽象出了用于完成某种确定目的的函数。至干这些函数怎么用完全不需要内核去关心。区别对待机制(mechanism)和策略(policy)是Unix设计中的一大亮点。大部分的编程问题都可以被切割成两个部分:“需要提供什么功能”(机制)和“怎样实现这些功能”(策略)。

而api是函数的定义,规定了这个函数的功能,跟内核无直接关系。而系统调用是通过中断向内核发请求,实现内核提供的某些服务。一个api可能会需要一个或多个系统调用来完成特定功能。通俗点说就是如果这个api需要跟内核打交道就需要系统调用,否则不需要。


理解软中断

Linux系统上直接跟硬件交互的只有内核,当用户执行的程序需要对硬盘操作时,该进程就会由用户空间转入内核空间,向内核发起系统调用,这个过程叫做软中断,此时CPU上的时间片(时间片对多任务的操作系统,至关重要)交由内核来执行,执行完成后,再转回用户空间。所以一个的程序的生命周期必然是在俩个模式之间切换的过程。




4、Linux现状

    今天各种场合都有使用各种Linux发行版,家里的空调、智能手表、手机,航空......从这些嵌入式设备到超级电脑(Super Computer),并且linux在服务器领域也确定了相当的地位(通常服务器使用LAMP组合)。虽然大多数人依然对linux知之甚少,但它确实早已经走进了我们的生活,我相信开源的linux的明天必将更加美好。