Linux内核学习(一):操作系统的基本概念
本系列将开启对Linux内核的学习之旅…
一、操作系统的基本概念
任何计算机系统都包含一个名为操作系统的基本程序集合。该集合中,最为重要的程序被称为内核(
kernel
),操作系统启动时,内核被装载至RAM(通常指的是人们所熟知的内存)中,而内核包含了系统运行所必不可少的很多核心过程(procedure)。可以这么说,系统的根本的样子和能力是由内核决定的。
操作系统必须完成的两个主要目标:
- 与硬件部分进行交互,为包含在硬件平台上的所有底层可编程部件提供服务。
- 为运行在计算机系统上的应用程序(即所谓用户程序)提供执行环境。
一些操作系统会允许所有的用户程序都直接与硬件进行交互,如MS-DOS,而类Unix操作系统把与计算机物理组织相关的所有底层细节都对用户运行的程序隐藏起来。这时,如果应用程序想要访问硬件资源的话,则需向操作系统发出请求,并由内核进行评估,如果允许,则由内核代表应用程序与相关硬件进行交互。为了实现这种机制,硬件为CPU引入了至少两种不同的执行模式:用户程序的非特权模式和内核的特权模式。Unix把它们称为用户态(User Mode)和内核态(Kernel Mode)。
1.1 多用户系统
一台能够并发和独立地执行分别属于两个或多个用户的若干应用程序的计算机。Unix是实施系统资源硬件保护的多用户系统。
并发(concurrently):几个应用程序能同时处于活动状态并竞争各种资源。
独立(independently):每个应用程序能执行自己的任务,无需考虑其他用户的应用程序在干什么。
该类需包含的特点:
- 核实用户身份的认证机制。
- 防止有错误的用户程序妨碍其他应用程序在系统中允许的保护机制。
- 防止有恶意的用户程序干涉或窥视其他用户的活动的保护机制。
- 限制分配给每个用户的资源数的记账机制。
1.2 用户和组
在多用户系统中,每个用户在机器上都有私有空间,即他拥有一定数量的磁盘空间来存储文件、接收私人邮件信息等。操作系统需保证用户空间的私有性。所有用户由唯一的数字标识,即用户标识符(User ID,UID)。若用户要开启工作会话,一般操作系统都会要求输入一个登录名和口令,若认证不通过,则系统拒绝访问。
为了能够更好的和其他用户进行共享资料,每个用户是一个或多个用户组的一名成员,组由唯一的用户组标识符(user group ID)标识。组内用户对文件具备一定的权限,而组外用户则无任何访问权限。
任何类Unix操作系统都有一个特殊的用户,叫做root
,即超级用户(superuser
),系统管理员需以该身份登录系统以便管理用户账号。root
用户能访问系统中的每一个文件,能干涉每一个正在执行的用户程序的活动。
1.3 进程
所有操作系统都使用一种基本的抽象:进程(process)。进程的定义: 程序执行时的一个实例,或一个运行程序的“执行上下文”。
对于传统的操作系统,一个进程在地址空间(address space
)中执行一个单独的指令序列(现代操作系统允许在相同的地址空间执行多个指令序列)。
地址空间是允许进程引用的内存地址集合。
允许进程并发活动的系统被称为多道程序系统(multiprogramming
)或多处理系统(multiprocessing
)。
程序和进程的区别: 几个进程能够并发地执行同一程序,而同一个进程能顺序地执行几个程序。
在单处理器系统上,只有一个进程能占用CPU,因此,在某一时刻只能有一个执行流。操作系统中存在一个名为调度程序的部分用于决定哪个进程能够进行。存在一些操作系统只允许有非抢占式进程,即只有进程自愿放弃CPU时,调度程序才能被调用。而多用户系统中的进程必须时抢占式的,操作系统记录下每个进程占有的CPU时间,并周期性地激活调度程序。Unix是具有抢占式进程的多处理操作系统,Unix操作系统采用进程/内核模式。每个进程都自以为其是系统中唯一的进程,可以独占操作系统所提供的服务。只要进程发出系统调用,硬件就会把特权模式由用户态变成内核态,若该请求得到满足。内核过程将迫使硬件返回用户态,然后进程从系统调用的下一条指令继续执行。
1.4 内核体系结构
大部分Unix内核是单块结构:每一个内核层都被集成到整个内核程序中,并代表当前进程在内核态下运行。相反,微内核(
microkernel
)操作系统只需要内核有一个很小的函数集合,通常包括几个同步原语、一个简单的调度程序和进程间通信进制。运行在微内核之上的几个系统进程实现从前操作系统级实现的功能,如内存分配程序、设备驱动程序、系统调用处理程序等。
微内核操作系统的缺点:
- 效率低,操作系统不同层次之间显示的消息传递要花费一定的代价。
微内核操作系统的优点:
- 模块化方法。
- 易移植。
- 充分利用RAM。
为了达到微内核理论上的很多优点而又不影响性能,Linux
内核提供了模块(module
)。模块属于目标文件,其代码可以在运行时链接到内核或从内核解除链接。这种目标代码通常由一组函数组成,用于实现文件系统、驱动程序或其他内核上层功能。与微内核的操作系统的外层不同,模块不是作为一个特殊进程执行的。相反,与任何其他的静态链接的内核函数一样,它代表当前进程在内核态下执行。
使用模块的主要优点:
- 模块化方法。
- 任何模块可在运行时被链接或解除链接。故系统程序员必须提出良定义的软件接口以访问模块处理的数据结构,这使得开发新模块变得容易。
- 平台无关性。
- 即使模块依赖于某些特殊的硬件特点,但它不依赖于某个固定的硬件平台。
- 节省内存使用
- 当需要模块功能时,把它链接到正在运行的内核中,否则,将该模块解除链接。
- 无性能损失。
- 模块的目标代码一旦被链接到内核,其作用与静态链接的内核的目标代码完全等价。故当模块的函数被调用时,无需显示地进行消息传递。