Linux内核模块简介

1. 宏内核与微内核

内核(Kernel)在计算机科学中是操作系统最基本的部分,主要负责管理系统资源。中文版维基百科上将内核分为四大类:单内核(宏内核);微内核;混合内核;外内核。

混合内核实质上也是微内核,而外内核是一种比较极端的设计方法,目前还处于研究阶段,所以我们就着重讨论宏内核与微内核两种内核。

简单的介绍,宏内核(Monolithickernel)是将内核从整体上作为一个大过程来实现,所有的内核服务都在一个地址空间运行,相互之间直接调用函数,简单高效。微内核(Microkernel)功能被划分成独立的过程,过程间通过IPC进行通信,模块化程度高,一个服务失效不会影响另外一个服务。

这里写图片描述

两种设计各具特点,较早的一些操作系统都是用宏内核写成的,这样的内核通常以单个静态二进制文件的形式存放于磁盘,而后来随着模块化、分层思想的产生,人们开始对微内核感兴趣并持赞扬态度,认为微内核将成为内核的发展趋势。微内核的功能被划分为独立的过程,每个过程叫做一个服务器,各种服务器之间通过IPC机制互通消息,服务器的各自独立有效地避免了一个服务器的失效祸及另一个,而且这种独立机制更利于操作系统在不同硬件上的移植。

当然,微内核的这所有的优点都建立在因为消息传递开销而引起效率损失的前提下(IPC机制的开销比函数调用多,还会涉及到内核空间到用户空间的上下文切换),这些损失有一部分是靠着现在硬件效率的飞速提升而抵消着的,但这很明显是追不上宏内核的效率的。所以,有些使用微内核的操作系统(如新近版本的WindowsNT和MacOSX)让大部分或全部的服务器位于内核,这样就可以直接调用函数,消除频繁的上下文切换,但这已经违背了微内核设计的初衷。

而相反的,宏内核在通信上比较高效,因为大家都运行在内核态,并身处同一地址空间,内核可以直接调用函数,Linux和大多数的UNIX都为宏内核。对应的,宏内核不具有微内核的优点,宏内核的灵活性和可维护性不及微内核,而且移植起来并不简单(不过有些宏内核支持者认为这样的移植比微内核更能够有效地利用底层硬件)。

历史告诉我们,两种看似矛盾又各有长处的观点或解决方案总能找到结合点的。Cache的直接映射与关联映射结合产生了组关联映射;RISC和CISC也是各具优点,现代的好的CPU包括了这两种技术,将它们结合了起来。所以我相信宏内核与微内核也会最终找到结合点的。

Linux虽是宏内核,但已吸收了微内核的部分精华。Linux是模块化的、多线程的、内核本身可调度的系统,既吸收了微内核的精华,又保留了宏内核的优点,无需消息传递,避免性能损失。

此前所提到的微内核实现时让大部分服务器位于内核空间,也算是微内核朝宏内核靠拢的一个例子。

这两个例子都可以看到宏内核与微内核有结合的趋势,但还没有完全真正的结合成功,不过它们都已经同时具备了模块化和内核空间运行等的特征。

参考:宏内核与微内核的对比

2. Linux体系结构与内核结构概述

2.1 Linux体系结构概述

现在让我们从一个比较高的高度来审视一下 GNU/Linux 操作系统的体系结构。您可以从两个层次上来考虑操作系统,
(1)用户空间:用户空间中又包含了,用户的应用程序,C库
(2)内核空间:内核空间包括,系统调用,内核,以及与平台架构相关的代码

这里写图片描述

最上面是用户(或应用程序)空间。这是用户应用程序执行的地方。用户空间之下是内核空间,Linux 内核正是位于这里。

GNU C Library (glibc)也在这里。它提供了连接内核的系统调用接口,还提供了在用户空间应用程序和内核之间进行转换的机制。这点非常重要,因为内核和用户空间的应用程序使用的是不同的保护地址空间。每个用户空间的进程都使用自己的虚拟地址空间,而内核则占用单独的地址空间。

Linux 内核可以进一步划分成 3 层。最上面是系统调用接口,它实现了一些基本的功能,例如 read 和 write。系统调用接口之下是内核代码,可以更精确地定义为独立于体系结构的内核代码。这些代码是 Linux 所支持的所有处理器体系结构所通用的。在这些代码之下是依赖于体系结构的代码,构成了通常称为 BSP(Board Support Package)的部分。这些代码用作给定体系结构的处理器和特定于平台的代码。

2.2 Linux体系结构分成用户空间和内核空间的原因:

现代CPU通常都实现了不同的工作模式,以ARM为例:ARM实现了7种工作模式,不同模式下CPU可以执行的指令或者访问的寄存器不同:(1)用户模式 usr (2)系统模式 sys(3)管理模式 svc(4)快速中断 fiq(5)外部中断 irq(6)数据访问终止 abt(7)未定义指令异常;
以X86为例:X86实现了4个不同级别的权限,Ring0—Ring3 ;Ring0下可以执行特权指令,可以访问IO设备;Ring3则有很多的限制。

所以,Linux从CPU的角度出发,为了保护内核的安全,把系统分成了2部分:用户空间和内核空间是程序执行的两种不同状态,我们可以通过“系统调用”和“硬件中断“来完成用户空间到内核空间的转移;

参考文献:Linux内核剖析

2.3 Linux的内核结构(注意区分Linux体系结构和Linux内核结构)

Linux内核是整体式结构(宏内核),各个子系统联系紧密,作为一个大程序在内核空间运行。

系统调用接口(system call interface,SCI)提供了某些机制执行从用户空间到内核的函数调用。正如前面讨论的一样,这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。

这里写图片描述

Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。

1.进程调度(SCHED):控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。

2.内存管理(memory management,MM)允许多个进程安全的共享主内存区域。Linux 的内存管理支持虚拟内存,即在计算机中运行的程序,其代码,数据,堆栈的总量可以超过实际内存的大小,操作系统只是把当前使用的程序块保留在内存中,其余的程序块则保留在磁盘中。必要时,操作系统负责在磁盘和内存间交换程序块。内存管理从逻辑上分为硬件无关部分和硬件有关部分。硬件无关部分提供了进程的映射和逻辑内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值