转:Linux内核简介
https://www.ibm.com/developerworks/cn/linux/l-linux-kernel/
1.GNU/Linux系统
(1)用户态:
- 应用程序
- C语言库
(2)核心态
- 系统调用接口 :read/write
- 内核代码
- 体系结构代码
- 硬件
GNU C Library (glibc)也在这里。它提供了连接内核的系统调用接口,还提供了在用户空间应用程序和内核之间进行转换的机制。
2.Linux内核部分
系统调用接口
SCI 层提供了某些机制执行从用户空间到内核的函数调用。正如前面讨论的一样,这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。有关这个组件的更详细信息可以在 参考资料 一节中找到
进程管理
进程管理的重点是进程的执行。在内核中,这些进程称为线程,代表了单独的处理器虚拟化(线程代码、数据、堆栈和 CPU 寄存器)。在用户空间,通常使用进程 这个术语,不过 Linux 实现并没有区分这两个概念(进程和线程)。内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface [POSIX] 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSIX 机制)。
进程管理还包括处理活动进程之间共享 CPU 的需求。内核实现了一种新型的调度算法,不管有多少个线程在竞争 CPU,这种算法都可以在固定时间内进行操作。这种算法就称为 O(1) 调度程序,这个名字就表示它调度多个线程所使用的时间和调度一个线程所使用的时间是相同的。 O(1) 调度程序也可以支持多处理器(称为对称多处理器或 SMP)。您可以在 ./linux/kernel 中找到进程管理的源代码,在 ./linux/arch 中可以找到依赖于体系结构的源代码
内存管理
内核所管理的另外一个重要资源是内存。为了提高效率,如果由硬件管理虚拟内存,内存是按照所谓的内存页 方式进行管理的(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。
不过内存管理要管理的可不止 4KB 缓冲区。Linux 提供了对 4KB 缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4KB 缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。
为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在 ./linux/mm 中找到。
虚拟文件系统
虚拟文件系统(VFS)是 Linux 内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层(请参看图 4)。
图 4. VFS 在用户和文件系统之间提供了一个交换层
在 VFS 上面,是对诸如 open、close、read 和 write 之类的函数的一个通用 API 抽象。在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。它们是给定文件系统(超过 50 个)的插件。文件系统的源代码可以在 ./linux/fs 中找到。
文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。
网络堆栈
网络堆栈在设计上遵循模拟协议本身的分层体系结构。回想一下,Internet Protocol (IP) 是传输协议(通常称为传输控制协议或 TCP)下面的核心网络层协议。TCP 上面是 socket 层,它是通过 SCI 进行调用的。
socket 层是网络子系统的标准 API,它为各种网络协议提供了一个用户接口。从原始帧访问到 IP 协议数据单元(PDU),再到 TCP 和 User Datagram Protocol (UDP),socket 层提供了一种标准化的方法来管理连接,并在各个终点之间移动数据。内核中网络源代码可以在 ./linux/net 中找到。
设备驱动程序
Linux 内核中有大量代码都在设备驱动程序中,它们能够运转特定的硬件设备。Linux 源码树提供了一个驱动程序子目录,这个目录又进一步划分为各种支持设备,例如 Bluetooth、I2C、serial 等。设备驱动程序的代码可以在 ./linux/drivers 中找到。
依赖体系结构的代码
尽管 Linux 很大程度上独立于所运行的体系结构,但是有些元素则必须考虑体系结构才能正常操作并实现更高效率。./linux/arch 子目录定义了内核源代码中依赖于体系结构的部分,其中包含了各种特定于体系结构的子目录(共同组成了 BSP)。对于一个典型的桌面系统来说,使用的是 i386 目录。每个体系结构子目录都包含了很多其他子目录,每个子目录都关注内核中的一个特定方面,例如引导、内核、内存管理等。这些依赖体系结构的代码可以在 ./linux/arch 中找到。
Linux 内核的一些有用特性
如果 Linux 内核的可移植性和效率还不够好,Linux 还提供了其他一些特性,它们无法划分到上面的分类中。
作为一个生产操作系统和开源软件,Linux 是测试新协议及其增强的良好平台。Linux 支持大量网络协议,包括典型的 TCP/IP,以及高速网络的扩展(大于 1 Gigabit Ethernet [GbE] 和 10 GbE)。Linux 也可以支持诸如流控制传输协议(SCTP)之类的协议,它提供了很多比 TCP 更高级的特性(是传输层协议的接替者)。
Linux 还是一个动态内核,支持动态添加或删除软件组件。被称为动态可加载内核模块,它们可以在引导时根据需要(当前特定设备需要这个模块)或在任何时候由用户插入。
Linux 最新的一个增强是可以用作其他操作系统的操作系统(称为系统管理程序)。最近,对内核进行了修改,称为基于内核的虚拟机(KVM)。这个修改为用户空间启用了一个新的接口,它可以允许其他操作系统在启用了 KVM 的内核之上运行。除了运行 Linux 的其他实例之外, Microsoft® Windows® 也可以进行虚拟化。惟一的限制是底层处理器必须支持新的虚拟化指令。更多信息请参看 参考资料 一节的内容。
相关主题
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文 。
- GNU 站点 介绍了 GNU GPL,它涵盖了 Linux 内核及其附带的大量有用的应用程序。另外还介绍了一个比 GPL 限制更少的许可 Lesser GPL (LGPL)。
- UNIX、 MINIX 和 Linux 在 Wikipedia 上都有介绍,另外还详细介绍了操作系统系列。
- GNU C Library,即 glibc,是标准 C 库的实现。它用于 GNU/Linux 操作系统,也可用于 GNU/Hurd 微内核操作系统。
- uClinux 是 Linux 内核的一个移植,它可以在一些缺少 MMU 的系统上执行。这允许 Linux 内核在很小的嵌入式平台上运行,例如 PalmPilot PalmPilot Personal Digital Assistants (PDAs) 上使用的 Motorola DragonBall 处理器。
- “使用 Linux 系统调用的内核命令”(developerWorks,2007 年 3 月)对 SCI 进行了介绍,这是 Linux 内核中非常重要的一层,具有 glibc 的用户空间支持,可以在用户空间和内核之间启用函数调用。
- “Linux 调度器内幕”(developerWorks,2006 年 6 月)介绍了 Linux 2.6 中引入的新 O(1) 调度程序,这是一个非常高效的算法,可以扩展到很大数量的进程(线程),并且可以利用 SMP 系统。
- “使用 /proc 文件系统来访问 Linux 内核的内容”(developerWorks,2006 年 3 月)介绍了 /proc 文件系统,这是一个虚拟文件系统,为用户空间的应用程序提供了一种全新的方法与内核进行通信。这篇文章展示了 /proc 以及可加载内核模块。
- “服务器诊所: 使虚拟文件系统工作”(developerWorks,2003 年 4 月)深入介绍了 VFS 层,它允许 Linux 通过一个通用接口支持各种不同的文件系统。这个相同的接口也可以用于其他类型的设备,例如 socket。
- “Linux 引导过程内幕”(developerWorks,2006 年 5 月)介绍了 Linux 的引导过程,该过程将启动一个 Linux 系统,并且不管是从硬盘、软盘、USB 内存条还是通过网络引导系统,该过程是相同的。
- “Linux 初始 RAM 磁盘(initrd)概述”(developerWorks,2006 年 7 月)介绍了初始 RAM 磁盘,它将引导过程与所引导的物理介质隔离开来。
- “使用 SCTP 优化网络”(developerWorks,2006 年 2 月)介绍了一种非常有用的网络协议:流控制传输协议,它的操作与 TCP 类似,但是增加了很多有用的特性,例如消息传递、 多宿主和多流。如果您对网络协议感兴趣,那么 Linux 与 BSD 一样,都是一种非常好的操作系统。
- “Linux slab 分配器详解” (developerWorks,2007 年 5 月)介绍了 Linux 内存管理中最有用的一个工具:slab 分配器。这种机制源自于 SunOS,不过它在 Linux 内核中找到了合适的位置。
- “虚拟 Linux”(developerWorks,2006 年 12 月)介绍了 Linux 是如何充分利用具有虚拟化能力的处理器。
- “Linux 和对称多处理”(developerWorks,2007 年 3 月)讨论了 Linux 怎样利用提供芯片级多处理能力的芯片。
- “探索 Linux 内核虚拟机”(developerWorks,2007 年 4 月)介绍了最近引入内核的虚拟化技术,它可以将 Linux 内核转换成其他虚拟化的操作系统的系统管理程序。
- 有关在用户空间对 Linux 进行编程的更多信息,请参考 Tim 撰写的 GNU/Linux Application Programming 一书。
- 在 developerWorks Linux 专区 中可找到适合 Linux 开发人员的更多资源,包括 Linux 教程 以及上月 读者最喜欢的 Linux 文章和教程。
- 利用可直接从 developerWorks 下载的 IBM 试用软件 在 Linux 上构建您的下一个开发项目。