linux 初探 (系统基础认知篇)
什么是linux?
Linux是开源的类Unix系统,单纯的术语Linux来说其实仅仅指由林纳斯.托瓦兹开发并于1991年发布的一款存在于内核空间的操作系统内核(kernel)。
为什么要开发Linux kernel呢?
要从应用程序是如何在计算机上跑起来谈起,早期的应用程序需要了解CPU指令集利用汇编等语言进行开发。CPU的常见指令集架构:x86、x64(早期称其为amd64)兼容x86、m68000(m68k)、arm、power、power pc(ppc,桌面级power)。而这些不同厂商所生产的cpu指令集大多不同,基于此开发的程序彼此不兼容,因此,每开发一款软件都要针对不同指令集的cpu重写软件以实现相同的功能,直接面对硬件开发的程序移植非常之难。要使得程序能够在计算机上跑起来,必须先将硬件设备驱动使之工作接受程序的支配调度,意味着程序开发者须将不同设备的驱动开发一起写进程序中。简单的讲到这,想必知晓答案了吧!正是为了克服针对不同cpu架构开发的程序不兼容,移植又及其耗费精力,迫切需要一种与cpu等硬件没有太大关系的高级开发语言。将这种高级语言所开发的程序通过编译器(compile)翻译成为编译器所运行的硬件架构上可执行的汇编代码。当然,编译器也可运行在A计算机,为不同CPU架构的B计算机将程序转化为B可执行的代码,就是交叉编译。同样,为了克服程序员针对底层硬件开发,需要一种可以提供各种硬件驱动并组织起来将其抽象为统一接口的中间层、翻译官,无论您走到何种地域,不同地域的语言都会被翻译官,翻译为您所理解的母语,您想发表任何的观点只需要面对这位翻译官即可。于是乎主角linux kernel 呼之欲出,由kernel向下面对各种硬件规格的复杂性,并向上将其抽象成为一种统一的接口称为系统调用(system call)。
将内核功能中公共部分的代码再次封装成为库(libraries),向上提供统一规范的接口供程序调用。由于库在不同的操作系统中同种语言封装成的库和调用接口及其内部编码实现方式同,造成了程序在不同操作系统之间不兼容,给程序运行和移植带来麻烦,于是国际组织委员会发起pos(posix)标准来进行规范。
系统调用有两种形式
API(Application Programing Interface):系统调用编程接口,保证程序的可移植性,依赖于C库(labc)实现,遵循posix标准;
ABI (Application Binary interface):应用二进制接口,程序编译完成后形成固定格式二进制文件,windows的.exe,linux的ELF等,诠释了应用程序和操作系统之间的二进制接口。
Linux kernel很好的实现了上述功能。
我们知道一个完整的操作系统由权限较高调度硬件资源的内核空间(内核态)和权限较低的用户空间(用户态)组成。
那么用户空间的应用程序在何地呢?
事实上在linux kernel出现之前,非常不屑与Unix闭源的,收费许可的应用程序为伍的理查德斯托曼stallman 教授,开创了非营利性的自由软件基金会FSF(Free Software Foundation),并发起了GNU计划,其口号为GNU's Not Unix的递归缩写,主要任务就是开发自由的,开放的,源码提供的开源软件(open source software)。自由软件怎么能运行在闭源内核之上呢?一直苦于没有一款易用的开源的,自由的内核来使得自由软件运行。
Linux的诞生让两者走到一起,让自由,开源的GNU软件得以开花结果。组成真正意义上的GNU/Linux操作系统。
Linux 重要哲学思想:
一切皆文本,包括硬件设备
由多个单一功能的小程序组合,完成复杂的任务
尽可能少的与用户交互,避免捕获用户接口
使用纯文本文件保存配置信息
提供机制而非策略
目前主流的Linux发行版:
Debian ==> Ubuntu PC桌面推荐
RedHat ==> Centos 服务器领域
Slackware ==> S.U.S.E
Gentoo
ArchLinux
如有任何错误请多多指教