2.2.3 设备驱动
设备驱动组成了Linux核心的主要部分 。象操作系统的其他部分一样,它们运行在高权限环境中且一旦出错 将引起灾难性后果 。设备驱动控制操作系统和硬件设备之间的相互操作 。例如当文件系统通过使用通用块设备接口来对IDE磁盘写入数据块 。设备驱动负责处理所有设备相关细节 。设备驱动与特定的控制器芯片有关,如果系统中有一个NCR810 SCSI控制卡则需要有NCR810 SCSI的驱动程序 。
2.2.4 文件系统
Linux和Unix一样,系统中的独立文件系统不是通过设备标志符来访问,而是通过表示文件系统的层次树结构来访问 。当Linux添加一个新的文件系统到系统中时,会将它mount到一个目录下,比如说/mnt/cdrom 。Linux的一个重要特征就是支持多种文件系统 。这使得它非常灵活并且可与其他操作系统并存 。Linux中最常用的文件系统是EXT2文件系统,它在大多数Linux分发版本中都得到了支持 。文件系统提供给用户一个关于系统的硬盘上文件和目录的总体映象,而不管文件的类型和底层物理设备的特性 。Linux透明地支持多种文件系统并将当前安装的所有文件和文件系统集成到虚拟文件系统中去 。所以,用户和进程一般都不知道某个文件位于哪种文件系统中,他们只是使用它 。块设备驱动将物理块设备类型(例如IDE和SCSI)和文件系统中的差别隐藏起来,物理设备只是数据块的线性存储集合 。设备的不同导致块大小的不同,从软盘设备的512字节到IDE磁盘的1024字节 。这些都隐藏了起来,对系统用户来说这都是不可见的 。不管设备类型如何,EXT2文件系统看起来总是一样 。
2.3 核心数据结构
操作系统可能包含许多关于系统当前状态的信息 。当系统发生变化时,这些数据结构必须做相应的改变以反映这些情况 。例如,当用户登录进系统时将产生一个新的进程 。核心必须创建表示新进程的数据结构,同时 将它和系统中其他进程的数据结构连接在一起 。大多数数据结构存在于物理内存中并只能由核心或者其子系统来访问 。数据结构包括数据和指针;还有其他数据结构的地址或者子程序的地址 。它们混在一起让Linux核心数据结构看上去非常混乱 。尽管可能被几个核心子系统同时用到,每个数据结构都有其专门的用途 。理解Linux核心的关键是理解它的数据结构以及Linux核心中操纵这些数据结构的各种函数 。本书把Linux核心的 描叙重点放在数据结构上,主要讨论每个核心子系统的算法,完成任务的途径以及对核心数据结构的使用 。
2.3.1 连接列表
Linux使用的许多软件工程的技术来连接它的数据结构 。在许多场合下,它使用linked或者chained数据结构 。每个数据结构描叙某一事物,比如某个进程或网络设备,核心必须能够访问到所有这些结构 。在链表结构中,个根节点指针包含第一个结构的地址,而在每个结构中又包含表中下一个结构的指针 。表的最后一项必须是0或者NULL,以表明这是表的尾部 。在双向链表中,每个结构包含着指向表中前一结构和后一结构的指针 。使用双向链表的好处在于更容易在表的中部添加与删除节点,但需要更多的内存操作 。这是一种典型的操作系统开销与CPU循环之间的折中 。
2.3.2 散列表
链表用来连接数据结构比较方便,但链表的操作效率不高 。如果要搜寻某个特定内容,我们可能不得不遍历整个链表 。Linux使用另外一种技术:散列表来提高效率 。散列表是指针的数组或向量,指向内存中连续的相邻数据集合 。散列表中每个指针元素指向一个独立链表 。如果你使用数据结构来描叙村子里的人,则你可以使用年龄作为索引 。为了找到某个人的数据,可以在人口散列表中使用年龄作为索引,找到包含此人特定数据的数据结构 。但是在村子里有很多人的年龄相同,这样散列表指针变成了一个指向具有相同年龄的人数据链表的指针 。搜索这个小链表的速度显然要比搜索整个数据链表快得多 。由于散列表加快了对数据结构的访问速度,Linux经常使用它来实现Caches 。Caches是保存经常访问的信息的子集 。经常被核心使用的数据结构将被放入Cache中保存 。Caches的缺点是比使用和维护单一链表和散列表更复杂 。寻找某个数据结构时,如果在Cache中能够找到(这种情况称为cache 命中),这的确很不错 。但是如果没有找到,则必须找出它,并且添加到Cache中去 。如果Cache空间已经用完则Linux必须决定哪一个结构将从其中抛弃,但是有可能这个要抛弃的数据就是Linux下次要使用的数据 。
推荐阅读
- 认识Linux操作系统下三大便利开源防火墙
- 如何在Linux中设置磁盘限额?
- Linux下的各种备份方法汇总
- Linux 内核解读入门
- linux使用经验点滴
- 安装 Linux 无盘工作站
- FONTS Linux中的字型设定
- 在Linux中限制用户空间
- 深 入Linux 的LILO
- Linux中IP隧道的分析与建议
