文档详情

Linux基础及应用教程 陈英 第10章 Linux内核机制新.ppt

发布:2015-12-15约4.31千字共23页下载文档
文本预览下载声明
陈英 梁建武主编 中国水利水电出版社 Linux基础及应用 第10章 Linux内核机制 10.1 Linux内核简介 10.1.1 Linux内核的地位 Linux操作系统由4个主要的子系统所组成: 1)用户应用程序:在某个特定的Linux系统上运行的应用程序集合,它将随着该计算机系统的用途不同而有所变化,但一般会包括文字处理应用程序和Web浏览器。 2)O/S服务:这些服务一般认为是操作系统的一部分(命令外壳程序等)。 3)Linux内核:包括内核抽象和对硬件资源(如CPU)的间接访问。 4)硬件控制器: 10.1.2 系统初始化及运行 当PC启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFFF0处的代码,也就是ROM - BIOS起始位置的代码。BIOS先进行一系列的系统自检,然后初始化位于地址0的中断向量表。最后BIOS将启动盘的第一个扇区装入到0x 7C00,并开始执行此处的代码。 10.1.3 内核提供的各种系统调用 1.系统的基本数据结构 进程控制表中的每一项都是一个task _ struct 结构,而task _ struct结构本身是在include /linux/sched . h中定义的。 进程控制表既是一个数组,又是一个双向链表,同时又是一个树。其物理实现是一个包括多个指针的静态数组。此数组的长度保存在include/linux/tasks.h 定义的常量NR_ TASKS中,其缺省值为128,数组中的结构则保存在系统预留的内存页中。链表是由next_task 和prev _ task两个指针实现的,而树的实现则比较复杂。 系统启动后,内核通常作为某一个进程的代表。一个指向task _ struct的全局指针变量current用来记录正在运行的进程。 某一个进程只能运行在用户方式(user mode)或内核方式(kernel mode)下。用户程序运行在用户方式下,而系统调用运行在内核方式下。 2.创建和撤消进程 1)申请一个空闲的页面来保存task _ struct。 2)查找一个空的进程槽(find _ empty _ process ())。 3)为kernel _ stack _ page申请另一个空闲的内存页作为堆栈。 4)将父进程的LDT表拷贝给子进程。 5)复制父进程的内存映射信息。 6)管理文件描述符和链接点。 10.1.4 存取文件系统 Linux在系统内核和文件系统之间提供了一种叫做VFS(virtual file system)的标准接口。这样,文件系统的代码就分成了两部分:上层用于处理系统内核的各种表格和数据结构;而下层用来实现文件系统本身的函数,并通过VFS来调用。 10.2 Linux内核源代码 10.2.1 了解Linux内核源码 Linux内核源码的版本号 Linux内核源码的版本号表示方法非常简单:所有偶数版(如2.0.30 )都是已发行的稳定版;所有奇数版(如2.1.42 )都是测试版。 显示内核版本号 显示内核版本号的方法如下: #ls /boot 对内核源码的修改 10.2.2 内核机制 1.Bottom Half处理 系统内核中可以有多达32个不同的bottom half 处理程序。bh _ base中保存着指向每一个bottom half处理程序的指针。 2.任务队列 任务队列是系统内核将任务推迟到以后再做的方法。Linux系统有一个机制可以把任务放入到队列中等待以后处理。 3.计时器 Linux有两种系统定时器,在某一系统时间同时被调用,但它们在实现上略有不同。第一种,即老的定时器机制,有一个包含32个指针的静态数据组和一个活跃定时器屏蔽码( timer _ active ),这些指针指向timer _ struct数据结构,定时器程序与定时器表的连接是静态定义的,大多数定时器程序入口是在系统初始化时加入到定时器表中的;第二种,即新的定时器机制,使用了一个链表,表中的timer _ list数据结构以递增的超时数排序。 4.等待队列 很多情况下处理器因等待某种系统资源而无法继续运行,例如:处理器需要一个描述目录的VFS索引节点,但该索引节点当前不在内存缓冲区中,这样处理器就必须先等到索引节点从磁盘中读到内存之后,才能继续运行。对于这种等待的处理,Linux内核使用了一种简单的数据结构—等待队列,其中包括一个指向task _ struct的指针和一个指向队列中下一元素的指针。 10.
显示全部
相似文档