首页 > 代码库 > Linux 简介
Linux 简介
Linux
相信很多童鞋都听说过内核,以前都觉得是好牛X 好高大上的东西,确实很牛X ,Linux 内核的源码我到现在都没有怎么读明白过,这是一个叫做 Linus Torvalds 的 Linux 之父,还不如叫 Linux 内核之父的人负责开发和维护,后来就形成了一个社区,公开了源码。至于 Ubuntu,Red Hat 他们都是基于相同的内核之上,囊括了不同的应用和界面构成的一个更加完整的操作系统版本。狭义的操作系统就是指内核,广义的操作系统包括内核和内核之上的各种应用。
下面先来说一下 Linux 的启动过程,当我们打开计算机的时候,计算机自动从主板的 BIOS 读取其中所存储的程序,这一程序通常知道一些直接连接在主板上的硬件,如:硬盘,网络接口,键盘,串口,并口,这在一些旧式电脑上会一条一条的显示这些进程以及进度,现在大部分的 BIOS 允许你从软盘(这个几乎没有了),硬盘,光盘中选择一个来启动计算机。
然后计算机将从你选择的存储设备中读取初始的512个字节,这512个字节叫做主引导记录 MBR(master boot record),我记得有个 bootstrap,它的意思好像就是提靴带,就是一个人怎么提自己的靴子把自己提起来,用这个来形容计算机怎么在还未启动的时候来启动一段启动程序,后来就是这个主引导记录,直接烧在硬盘中。MBR 会告诉电脑从该设备的某一个分区来装载引导加载程序,引导加载程序就是储存有操作系统的名称,内核所在位置等信息的程序,常用的引导加载程序有 GRUB和 LILO。
然后引导加载程序就会加载内核,内核实际上就是一个用来操作计算机的程序,主要任务是管理计算机的硬件资源,而且他是最接近硬件的一层,充当软硬件的接口,操作系统上的任何操作都要通过内核传递给硬件,windows 和 linux 都有各自的内核。
如果加载的是 Linux 内核,Linux 内核开始工作,内核首先会预留自己运行所需的内存空间,然后通过驱动程序检测计算机硬件,这样操作系统就知道自己有哪些硬件可用,随后,内核会启动一个 init 进程,他是 Linux 中的1号进程,至此 内核就完成了计算机启动阶段的工作,交给 init 来管理。随后 init 进程会运行一系列的初始脚本,这些脚本是 Linux 常见的 shell scripts,设置计算机的名称 时区 检测文件系统 挂载硬盘 清空临时文件 设置网络 当这些初始脚本 操作系统已经完全准备好了,只是还没有人登录,这是就会弹出 login 的对话框。
最内层是硬件,最外层是用户常用的应用,比如说firefox浏览器,evolution查看邮件,一个计算流体模型等等。硬件是物质基础,而应用提供服务。但在两者之间,还要经过一番周折。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是一个特殊的应用。很多用户将它称为命令行,在 Mac 上叫做 terminal就是终端的意思,相当于一个设备。shell是一个命令解释器(interpreter),当我们输入“ls -l”的时候,它将此字符串解释为
- 在默认路径找到该文件(/bin/ls),
- 执行该文件,并附带参数"-l"。
Shell接着通过系统调,用指挥内核,实现具体的重定向或者管道。在没有图形界面之前,shell充当了用户的界面,当用户要运行某些应用时,通过shell输入命令,来运行程序。shell是可编程的,它可以执行符合shell语法的文本。这样的文本叫做shell脚本(script)。可以在架构图中看到,shell下通系统调用,上通各种应用,同时还有许多自身的小工具可以使用。Shell脚本可以在寥寥数行中,实现复杂的功能。
UNIX的一条哲学是让每个程序尽量独立的做好一个小的功能。而shell充当了这些小功能之间的"胶水",让不同程序能够以一个清晰的接口(文本流)协同工作,从而增强各个程序的功能。这也是Linux老鸟鼓励新手多用shell,少用图形化界面的原因之一。
(shell也有很多种,最常见的是bash, 另外还有sh, csh, tcsh, ksh。它们出现的年代不同,所支持的功能也有差异。)
一个shell对应一个终端 (terminal)。曾经来说,终端是一个硬件设备,用来输入并显示输出。如今,由于图形化界面的普及,终端往往就像上图一样,是一个图形化的窗口。你可以通过这个窗口输入或者输出文本。这个文本直接传递给shell进行分析解释,然后执行。
最后,我们进入一般的应用。应用是一个程序,它可以
- 直接调用系统函数
- 调用库函数
- 运行shell脚本
这些应用可以由多种语言开发。最常见的是C语言
推荐一个比较好用的 shell ,zsh shell
Linux 简介