操作系统精髓与设计原理(原书第6版)——学习笔记(10)

来源:互联网 发布:mac app atore验证 编辑:程序博客网 时间:2024/05/01 01:07


2.8 Linux操作系统

2.8.1历史

        Linux开始是用于IBM PCIntel 80386)结构的一个UNIX变种,最初版本是由芬兰一名计算机科学专业的学生Linus Torvalds写的。Torvalds1991年在Internet上公布了最早的LINUX版本。当今,Linux是具有全面功能的UNIX系统,可以在所有这些平台甚至更多平台上运行,包括Intel Pentium ItaniumMotorola/IBM PowerPC.

        Linux成功的关键在于它是自由软件基金会(Free Software FoundationFSF)赞助的自由软件包。FSF的目标是稳定的、与平台无关的软件,它必须是自由的、高质量的、为用户团体所接受。

2.8.2模块结构

        大多数UNIX内核是单体的,单体内核是指在一大块代码中实际上包含了所有操作系统功能,并作为一个单一进程运行,具有唯一地址空间。内核中所有功能部件都可以访问所有的内部数据结构和例程。如果对典型的单体式操作系统的任何部分进行了改变,在改变生效前,所有的模块和例程都必须重新链接、重新安装,系统必须重新启动。

        Linux的结构是一个模块的集合,这些模块可以根据需要自动地加载和卸载。这些相对独立的块称作可加载模块。实质上,一个模块就是内核在运行时可以链接或断开链接的一个对象文件。典型地,一个模块实现一些特定的功能,例如文件系统、设备驱动或是内核上层的一些特征。尽管模块可以因为各种目的而创建内核线程,但是它不作为自身的进程或线程执行。当然,模块会代表当前进程的内核态下执行。

        Linux可加载模块有两个重要特征:

  • 动态链接:当内核已经在内存中并正在运行时,内核模块可以被加载和链接到内核。模块也可以在任何时刻被断开链接,从内存中移出。

  • 可堆栈模块:模块按层次排列,,当被高层的客户模块访问时,它们作为库;当被底层模块访问时,它们作为客户。

动态链接简化了配置任务,节省了内核所占的内存空间。在Linux中,用户程序或用户可以使用insmodrmmod命令显示地加载和卸载内核模块,内核自身监视对于特定函数的需求,并可以根据需求加载和卸载模块。通过可堆栈模块可以定义模块间的依赖关系,这有两个好处:

  • 对一组相似的模块的相同的代码可以移入一个模块,以减少重复。

  • 内核可以确保所需要的模块都存在,避免卸载其他正在运行的模块仍然依赖着的模块,并且当加载一个新模块时,加载任何所需要的附加模块。

2.17举例说明Linux管理模块的结构,该图显示了当前只有两个模块FATVFAT被加载后内核模块的列表。每个模块由两个表定义,即模块表和符号表。模块表包括以下元素:

  • *next指向后面的模块。所有模块被组织到一个链接表中,链表以一个伪模块开始(图2.17中没有显示)。

  • *name指向模块名的指针。

  • Size模块大小,以页内存计。

  • Usecount模块引用计数器。当操作系统引用的模块函数开始时计数器增加,终止时减少。

  • Flags模块标志。

  • Nsyms输出的符号数

  • Ndeps引用的模块数。

  • *syms指向这个模块符号表的指针。、

  • *deps指向被这个模块引用的模块列表的指针。

  • *refs指向使用这个模块的模块列表的指针。

符号表定义了该模块控制的符号,它们将在别的地方使用到。图2.17显示了VFAT模块在FAT模块后被加载,并且它依赖于FAT模块。

2.8.3内核组件

        2.18摘自[MOSB02]显示了基于LA-64体系结构的LINUX内核的主要组件。图中显示了运行在内核之上的一些进程,每个方框表示一个进程,每条箭头的曲线表示一个正在执行的线程。内核本身包括一组相互关联的组件,箭头表示主要的关联。底层的硬件也是一个组件集,箭头表示硬件组件被哪一个内核组件使用或控制。当然所有的内核组件都在CPU上执行。

        主要的内核组件简要介绍如下:

  • 信号:内核通过信号通知进程。例如,信号用来通知进程某些错误,比如被0除错误。表2.6给出了一些信号的例子。

  • 系统调用:进程是通过调用来请求系统服务的。一共有几百个系统调用,可以粗略地分为6类:文件系统、进程、调度、进程间通信、套接字(网络)和其他。表2.7分别给出每个类的一些例子。

                                                               

  • 进程和调度器:创建、管理和调度进程。

  • 虚拟内存:为进程分配和管理虚拟内存。

  • 文件系统:为文件、目录和其他文件相关的对象提供一个全局的、分层次的命名空间,还提供文件系统函数。

  • 网络协议:为用户的TCP/IP协议套件提供套接字接口。

  • 字符设备驱动:管理向内核一次发送或接收一个数据的设备,比如终端、调制解调器和打印机。

  • 块设备驱动:管理以块为单位向内核发送和接收数据的设备,比如各种样式的外存(磁盘,CD-ROM等)。

  • 网络设备驱动:对网络接口卡和通信端口提供管理,它们负责连接到网桥或路由之类的网络设备。

  • 陷阱和错误:处理CPU产生的陷阱和错误,例如内存错误。

  • 物理内存:管理实际内存中的内存页池和为虚拟内存分配内存页。

  • 中断:处理来自外设的中断。

2.9 关键术语

        

0 0