《linux系统内核设计与实现》第一章-linux内核简介

第一章是一些linux的基本概念和历史的介绍,笔者这里就不寻章摘句了,主要挑一些重要的概念记录。

1.1 Unix的历史

下面的几个特点是使Unix强大的根本原因。
首先,Unix很简洁: 不像其他动辄提供数千个系统调用并且设计目的不明确的系统,Unix仅仅提供几百个系统调用并且有一个非常明确的设计目的。
第二,在Unix 中,所有的东西都被当做文件对待。 这种抽象使对数据和对设备的操作是通过一套相同的系统调用接口来进行的:open()、read()、write()、Ilseek()和close()。
第三,Unix的内核和相关的系统工具软件是用C语言编写而成 ------正是这个特点使得Unix在各种硬件体系架构面前都具备令人惊异的移植能力,并且使广大的开发人员很容易就能接受它。
第四,Unix 的进程创建非常迅速 ,并且有一个非常独特的fork()系统调用。
最后,Unix提供了一套非常简单但又很稳定的进程间通信元语 ,快速简洁的进程创建过程使Unix的程序把目标放在一次执行保质保量地完成一个任务上,而简单稳定的进程间通信机制又可以保证

这些单一目的的简单程序可以方便地组合在一起,去解决现实中变得越来越复杂的任务。正是由于这种策略和机制分离的设计理念,确保了Unix系统具备清晰的层次化结构。

1.3 操作系统和内核简介

内核有时候被称作是管理者或者是操作系统核心。通常一个内核由负责响应中断的中断服务程序,负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间的内存管理程序和网络、进程间通信等系统服务程序共同组成。 对于提供保护机制的现代系统来说,内核独立于普通应用程序,它一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限。这种系统态和被保护起来的内存空间,统称为内核空间。相对的,应用程序在用户空间执行。它们只能看到允许它们使用的部分系统资源,并且只使用某些特定的系统功能,不能直接访问硬件,也不能访问内核划给别人的内存范围,还有其他一些使用限制。当内核运行的时候,系统以内核态进入内核空间执行。而执行一个普通用户程序时,系统将以用户态进入以用户空间执行。

在系统中运行的应用程序通过系统调用来与内核通信。 当一个应用程序执行一条系统调用,我们说内核正在代其执行。如果进一步解释,在这种情况下,应用程序被称为通过系统调用在内核空间运行,而内核被称为运行于进程上下文中。这种交互关系------应用程序通过系统调用界面陷入内核------是应用程序完成其工作的基本行为方式。

内核还要负责管理系统的硬件设备 。现有的几乎所有的体系结构,包括全部Linux支持的体系结构,都提供了中断机制。当硬件设备想和系统通信的时候,它首先要发出一个异步的中断信号去打断处理器的执行,继而打断内核的执行。中断通常对应着一个中断号,内核通过这个中断号查找相应的中断服务程序,并调用这个程序响应和处理中断。 举个例子,当你敲击键盘的时候,键盘控制器发送一个中断信号告知系统,键盘缓冲区有数据到来。内核注意到这个中断对应的中断号,调用相应的中断服务程序。该服务程序处理键盘数据然后通知键盘控制器可以继续输入数据了。为了保证同步,内核可以停用中止------既可以停止所有的中断也可以有选择地停止某个中断号对应的中断。许多操作系统的中断服务程序,包括Linux的,都不在进程上下文中执行。它们在一个与所有进程都无关的、专门的中断上下文中运行。之所以存在这样一个专门的执行环境,就是为了保证中断服务程序能够在第一时间响应和处理中断请求,然后快速地退出。

这些上下文代表着内核活动的范围。实际上我们可以将每个处理器在任何指定时间点上的活动必然概括为下列三者之一:

  • 运行于用户空间,执行用户进程。
  • 运行于内核空间,处于进程上下文,代表某个特定的进程执行。
  • 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断。

以上所列几乎包括所有情况,即使边边角角的情况也不例外,例如,当CPU空闲时,内核就运行一个空进程,处于进程上下文,但运行于内核空间。

1.4 linux内核与传统unix内核的比较

操作系统内核可以分为两大阵营:单内核和微内核(第三阵营是外内核,主要用在科研系统中)。

单内核是两大阵营中一种较为简单的设计,在1980年之前,所有的内核都设计成单内核。所谓单内核就是把它从整体上作为一个单独的大过程来实现,同时也运行在一个单独的地址空间上。 因此,这样的内核通常以单个静态二进制文件的形式存放于磁盘中。所有内核服务都在这样的一个大内核地址空间上运行。**内核之间的通信是微不足道的,因为大家都运行在内核态,并身处同一地址空间:内核可以直接调用函数,这与用户空间应用程序没有什么区别。这种模式的支持者认为单模块具有简单和性能高的特点。**大多数Unix系统都设计为单模块。

另一方面,微内核并不作为一个单独的大过程来实现。相反,**微内核的功能被划分为多个独立的过程,每个过程叫做一个服务器。理想情况下,只有强烈请求特权服务的服务器才运行在特权模式下,其他服务器都运行在用户空间。**不过,所有的服务器都保持独立并运行在各自的地址空间上。因此,就不可能像单模块内核那样直接调用函数,而是通过消息传递处理微内核通信:系统采用了进程间通信(IPC)机制,因此,各个服务器之间通过IPC机制互通消息,互换"服务"。服务器的各自独立有效地避免了一个服务器的失效祸及另一个。同样,模块化的系统允许一个服务器为了另一个服务器而换出。

Linux是一个单内核,也就是说,Linux内核运行在单独的内核地址空间上。 不过,Linux汲取了微内核的精华:其引以为豪的是模块化设计抢占式内核支持内核线程 以及动态装载内核模块的能力。不仅如此,Linux还避其微内核设计上性能损失的缺陷,让所有事情都运行在内核态,直接调用函数,无须消息传递。至今,Linux是模块化的、多线程的以及内核本身可调度的操作系统,实用主义再次占了上风。

1.5 linux内核版本

Linux通过一个简单的命名机制来区分稳定的和处于开发中的内核(见图1-2)。这种机制使用三个或者四个用""分隔的数字来代表不同内核版本。第一个数字是主版本号第二个数字是从版本号第三个数字是修订版本号第四个可选的数字为稳定版本号 (stable version)。从副版本号可以反映出该内核是一个稳定版本还是一个处于开发中的版本:**该数字如果是偶数,那么此内核就是稳定版﹔如果是奇数,那么它就是开发版。**举例来说,版本号为2.6.30.1的内核,它就是一个稳定版。这个内核的主版本号是2,从版本号是6,修订版本号是30,稳定版本号是1。头两个数字在一起描述了"内核系列"------在这个例子中,就是2.6版内核系列。

参考:

[1] 《linux系统内核设计与实现》第三版

相关推荐
卫生纸不够用14 分钟前
子Shell及Shell嵌套模式
linux·bash
world=hello27 分钟前
关于科研中使用linux服务器的集锦
linux·服务器
枫欢31 分钟前
将现有环境192.168.1.100中的svn迁移至新服务器192.168.1.4;
服务器·python·svn
华纳云IDC服务商32 分钟前
如何自动解决服务器弹性伸缩问题?
运维·服务器
Chloe.Zz1 小时前
Windows系统上创建Flask服务器
服务器
soragui1 小时前
【ChatGPT】OpenAI 如何使用流模式进行回答
linux·运维·游戏
白云coy2 小时前
Redis 安装部署[主从、哨兵、集群](linux版)
linux·redis
Logintern092 小时前
Linux如何设置redis可以外网访问—执行使用指定配置文件启动redis
linux·运维·redis
娶不到胡一菲的汪大东2 小时前
Linux之ARM(MX6U)裸机篇----1.开发环境搭建
linux·运维·服务器