操作系统和内核简介
操作系统
操作系统是指在整个系统中负责完成最基本功能和系统管理的那些部分。这些部分包括内核,设备驱动程序,启动引导程序,命令行shell或者其他种类的用户界面、基本的文件管理工具和系统功能等。
内核
用户界面是操作系统的外在表象,内核才是操作系统的内在核心。系统其他部分必须依靠内核这部分软件提供的服务,像管理硬件设备、分配系统资源等。内核有时被称作是管理者或者操作系统核心。
通常一个内核由下面几个程序共同组成:
- 由负责响应中断的中断服务程序
- 负责管理多个进程从而分享处理时间的调度程序
- 负责管理进程地址空间的内存管理程序
- 网络、进程间通信
- 对于提高保护机制的现代系统来说,内核独立于普通应用程序,它一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限,这种系统态和被保护起来的内存空间,统称为内核空间。
- 相对的,应用程序在用户空间执行。他们只看到允许他们使用的部分系统资源,并且只使用某些特定的系统功能,不能直接访问硬件,也不能访问内核划给别人的内存范围,还有其他一些使用限制。
- 当内核允许的时候,系统以内核态进入内核空间秩序,而执行一个普通用户程序时,系统将以用户态进入用户空间执行。
在系统中运行的应用程序通过系统调用来与内核通信。应用程序通常调用库函数(比如C库函数)再由库函数通过系统调用界面,让内核代其完成各种不同任务。
当一个应用程序执行一条系统调用,我们说内核正在代其执行。如果进一步解释,在这种情况下,应用程序被称为系通过系统调用在内核空间运行,而内核被称为运行于进程上下文。这种交互关系-应用程序通过系统调用界面陷入内核---是应用程序完成其工作的基本行为方式。
内核还负责管理系统的硬件设备。当硬件设备想和系统通信的时候,他首先要发出一个异步的中断信号去打断处理的执行,继而打断内核的执行。中断通常常对应着一个中断号,内核通过中断号查找相应的中断服务程序,并调用这个程序响应和处理中断。
举个例子,当你敲击键盘的时候,键盘控制器发送一个中断信号告知系统,键盘缓冲区有数据到来。内核注意到这个中断对应的中断号,调用相应的中断服务程序。该服务程序处理键盘数据然后通知键盘控制器可以继续输入数据。为了保证同步,内核可以停用中止--既可以停止所有的中断,也可以有选择地停止某个中断号对应的中断。许多操作系统的中断服务程序,包括Linux的,都不在进程上下文中执行。他们在一个与所有进程都无关的、专门的中断上下文中运行。之所以存在这一一个专门的执行环境,就是为了保证中断服务程序能够在第一时间响应和处理中断请求,然后快速 地退出。
这些上下文代表着内核活动范围,实际上我们可以将每个处理器在任何指定时间点上的活动必然概括为下列三者之一:
- 运行于用户空间,执行用户进程。
- 运行于内核空间,处理进程上下文,代表某个特定的进程执行。
- 运行于内核空间,处理中断上下文,与任何进程无关,处理某个特定的中断。
单内核和微内核设计比较
操作系统内核分为2大阵营:单内核和微内核
单内核
在1980年之前,所有的内核都设计出单内核。所谓单内核就是把它从整体作为一个单独的大过程来实现,同时也运行在一个单独的地址空间。因此,这样的内核通常以单个静态二进制文件的形式存放于磁盘中。所有的内核服务都再这样的一个大内核地址空间运行。内核之间的通信是微不足道的,因为大家都运行在内核态,并身处同一地址空间;内核可以直接调用函数,这与用户空间应用程序没有什么区别。这种模式的支持者认为单模块具有简单和性能高的特点。大多数unix系统都设计为单模块。
Linux是一个单内核,也就是说linux内核运行在单独的内核地址空间。不过Linux汲取了微内核的精华,;其引以为豪的是模块化设计,抢占式内核、支持内核线程以及动态装载内核模块的能力。
微内核
微内核并不作为一个单独的大过程来实现,相反,微内核的功能被划分为很多个独立的过程,每个过程叫做一个服务器。理想情况下,只有强烈请求特权服务的服务器才运行在特权模式下,其他服务器都运行运行在用户空间。不过,所有的服务器都保持独立并运行在各自的地址空间上。因此,就不能像单模块内核那样直接调用函数,而是通过消息传递处理内核模块通信,系统采用了进车间通信(IPC)机制,因此,各个服务器之间通过IPC机制互通消息,互换“服务”。服务器的各自独立有效地避免一个服务器的失效祸及另一个。同样,模块化的系统允许一个服务器为了另一个服务器的换出。
因为IPC机制的开销多于函数调用,又因为会涉及内核空间与用户空间上下文交换,因此,消息传递需要一定的周期,而单内核中简单的函数调用没有这些开销。结果,所有实际应用基于微内核的系统系统都让大部分或全部服务器位于内核,这样,就可以直接调用函数,消除频繁的上下文切换。
版本号解读
2.6.26.1
- 第一位2是主版本号
- 第二位6是从版本号
- 第三位26是修订版本号
- 第四位1,代表稳定版本号还是开发版本
第四位数字如果是偶数,那么内核就是稳定版,如果是奇数,那么它就是开发版本。