1概述
从认知科学中我们知道大脑在面对一个复杂事物时,会自动对事物进行归纳分组,降低认知难度。对于复杂的OS系统,一个人穷其一生也难以掌握全部细节,故为了理解一个系统,我们需要一定的抽象,从整体对系统有一个把握,然后针对需要再深入分析了解某一特定部分。本节对组成Linux系统的组件作一个较高层次的叙述。
1.1Linxu的抽象层次
对事物比较好的理解方式是通过将事物进行分层,每一层提供某种程度的抽象。Linux大致可分成如下三个抽象层次(levels or layers)。
最底层为硬件层包括CPU、内存、磁盘、网络设备等。
中间层为内核层,内核常驻内存并控制CPU等硬件,作为用户进程与底层硬件的粘合剂,为底层硬件提供抽象接口以供用户进程调用。
最上为用户进程层,用户进程在内核的控制下运行,为最终用户提供用户空间的服务。
内核与用户进程最大的差别在于内核运行在内核态(kernel space),可以访问系统中的任何资源,如果出问题很容易导致整个系统的崩溃;用户进程运行在用户态(user space),只能访问系统中的一部分资源,如果出问题,内核可以处理有问题的进程,不会导致整个系统的崩溃。
1.2 硬件:内存
内存为CPU提供了输入和输出,这些输入和输出是0和1组成的块,代表了系统所处的不同状态(state),内核和进程的运行都通过加载到内存来实现。
1.3 内核
内核负责管理系统中的资源,主要包括如下4类:
1. 进程管理:内核负责进程的调度,控制进程使用CPU的时间;
2. 内存管理:内核负责内存的管理,跟踪哪些进程使用特定的内存、哪些内存是进程共享的,哪些是空闲的;
3. 设备驱动:内核通过设备驱动为硬件提供抽象接口供进程使用;
4. 系统调用:内核通过系统调用来提供进程与内核的通信接口;
1.3.1 进程管理
进程管理描述了进程的启动、暂停、恢复和终止,对一个多任务处理系统而言,多个任务运行在一个CPU上,每个进程会获得一个时间片(time slice),内核负责进程上下文的切换(context switch)
1.3.2 内存管理
CPU中有一个MMU(MemoryManagement Unit)负责将进程的虚拟地址映射为实际的物理地址,内核通过内存页表(Page table)来初始化和管理每个进程的虚拟内存。
1.3.3 设备驱动和管理
设备一般在内核模式(kernel mode)才能访问,所以设备驱动常作为内核的一部分,并为用户进程提供了统一的接口,以简化软件开发人员的工作。
1.3.4系统调用
用户进程通过系统调用来访问部分用户态可用的内核特性,比如文件访问中打开、读取、写入就涉及到系统访问。另外两个很常见的、跟进程启动有关的系统调用为fork和exec,fork基本上就是复制一个进程,exec启动一个程序来代替当前的进程。除了init进程外,所有的用户进程都由fork复制而来,并且大部分用户进程会通过调用exec来启动一个新的程序来代替fork复制的老进程,以shell中运行ls命令为例,其过程如下:
除了系统调用外,Linux也支持虚拟设备(pseudodevices),比如/dev/random,这些这些设备对用户进程来说就像是真实的物理设备,只是他们是软件实现的,而不是硬件。
1.4用户空间(user space)
由内核分配给用户进程使用的内存空间称为用户空间(user space),进程只是程序在内存中的状态集。
1.5用户
Linux内核支持用户的概念,用户是拥有文件所有权以及运行程序的实体,每个用户有一个用户名,不过内核并非通过用户名来识别用户,而是通过userids的数字来识别用户的。最重要的用户就是root用户,也被称为超级用户。