本书对Linux 2.4内核源代码进行了详细的介绍,它有效地解决了Linux操作系统长期以来“抽象”的现象,将Linux操作系统的概念、算法、原理等与实际操作统一起来。书中源代码与注释相对应,是大专院校师生与Linux操作系统管理人员及编程人员不可缺少的参考书。\r\n\r\n \r\n
\r\n
\r\n\r\n 第1章 Linux进程管理 \r\n\r\n 1. 1 进程和进程控制块 \r\n\r\n 1. 1. 1 调度数据成员 \r\n\r\n 1. 1. 2 信号处理 \r\n\r\n 1. 1. 3 进程队列指针 \r\n\r\n 1. 1. 4 进程标识 \r\n\r\n 1. 1. 5 时间数据成员 \r\n\r\n 1. 1. 6 信号量数据成员 \r\n\r\n 1. 1. 7 文件系统数据成员 \r\n\r\n 1. 1. 8 内存数据成员 \r\n\r\n 1. 1. 9 页面管理 \r\n\r\n 1. 1. 10 支持对称多处理器方式时的数据 \r\n\r\n 成员 \r\n\r\n 1. 1. 11 其他数据成员 \r\n\r\n 1. 1. 12 进程队列的全局变量 \r\n\r\n 1. 2 进程状态和进程标志 \r\n\r\n 1. 3 list_head链表 \r\n\r\n 1. 4 进程调度 \r\n\r\n 1. 5 等待队列及其操作 \r\n\r\n 1. 6 中断与定时服务 \r\n\r\n 1. 6. 1 中断机制 \r\n\r\n 1. 6. 2 定时服务 \r\n\r\n 1. 7 bottom half \r\n\r\n 1. 8 tasklet与softirq \r\n\r\n 1. 9 任务队列 \r\n\r\n 1. 10 原于操作 \r\n\r\n 1. 11 自旋锁 \r\n\r\n 1. 12 信号量 \r\n\r\n 1, 13 系统调用 \r\n\r\n 1. 13. 1 与系统调用有关的数据结构和 \r\n\r\n 函数 \r\n\r\n 1. 13. 2 进程的系统调用命令是如何转换为 \r\n\r\n INT0x80中断请求的 \r\n\r\n 1. 13. 3 系统调用功能模块的初始化 \r\n\r\n 1. 13. 4 Linux内部是如何分别为各种系统 \r\n\r\n 调用服务的 \r\n\r\n 1. 13. 5 ret_from_sys_call \r\n\r\n 1. 14 进程的创建和终止 \r\n\r\n 1. 15 程序的装入和执行 \r\n\r\n 第2章 Linux存储管理 \r\n\r\n 2. 1 I386体系结构对存储管理的硬件支持 \r\n\r\n 2. 1. 1 80386分段机制及在Linux中的 \r\n\r\n 应用 \r\n\r\n 2. 1. 2 80386分页机制 \r\n\r\n 2. 2 Linux的分页管理 \r\n\r\n 2. 3 虚存段的组织和管理 \r\n\r\n 2. 3. 1 建立映射 \r\n\r\n 2. 3. 2 撤销映射 \r\n\r\n 2. 3. 3 修改映射 \r\n\r\n 2. 4 内存的加钡和保护 \r\n\r\n 2. 4. 1 内存加锁 \r\n\r\n 2. 4. 2 内存保护 \r\n\r\n 2. 5 Linux的AVL树 \r\n\r\n 2. 6 物理空间管理 \r\n\r\n 2. 7 空闲物理内存管理 \r\n\r\n 2. 7. 1 申请分配物理页面的操作 \r\n\r\n 2. 7. 2 释放物理页面的操作 \r\n\r\n 2. 8 slab \r\n\r\n 2. 8. 1 缓存区的创建与销毁操作 \r\n\r\n 2. 8. 2 缓存区的收缩与增长操作 \r\n\r\n 2. 8. 3 对象的分配与释放操作 \r\n\r\n 2. 9 内核态内存的申请与释放kmalloc/ \r\n\r\n kfree \r\n\r\n 2. 9. 1 内核态内存的申请 \r\n\r\n 2. 9. 2 内核态内存的释放 \r\n\r\n 2. 10 用户态内存的申请与释放vmalloc/ \r\n\r\n vfree \r\n\r\n 2. 10. 1 用户态内存的申请 \r\n\r\n 2. 10. 2 用户态内存的释放 \r\n\r\n 2. 11 交换空间 \r\n\r\n 2. 12 页交换进程和页面换出 \r\n\r\n 2. 13 缺页中断和页面换人 \r\n\r\n 2. 14 存储管理系统的缓冲机制 \r\n\r\n 2. 14. 1 Swap缓冲 \r\n\r\n 2. 14. 2 页缓冲 \r\n\r\n 第3章 Linux文件系统管理 \r\n\r\n 3. 1 文件系统管理 \r\n\r\n 3. 1. 1 register/unregister操作 \r\n\r\n 3. 1. 2 mount操作 \r\n\r\n 3. 2 虚拟文件系统 \r\n\r\n 3. 2. 1 VFS超级块 \r\n\r\n 3. 2. 2 超级块的操作函数 \r\n\r\n 3. 2. 3 read_super操作 \r\n\r\n 3. 2. 4 VFSinode \r\n\r\n 3. 2. 5 inode的操作函数 \r\n\r\n 3. 2. 6 VFSinode缓存 \r\n\r\n 3. 2. 7 iget/iput操作 \r\n\r\n 3. 3 路径定位 \r\n\r\n 3. 3. 1 定位操作 \r\n\r\n 3. 3. 2 VFSdirectory缓存 \r\n\r\n 3. 4 打开文件表 \r\n\r\n 3. 4. 1 系统打开文件表 \r\n\r\n 3. 4. 2 进程打开文件表 \r\n\r\n 3. 4. 3 操作已打开的文件 \r\n\r\n 3. 5 文件共享与文件锁 \r\n\r\n 3. 6 EXT2文件系统 \r\n\r\n 3. 6. 1 EXT2的超级块 \r\n\r\n 3. 6. 2 EXT2的组描述符 \r\n\r\n 3. 6. 3 EXT2的inode \r\n\r\n 3. 6. 4 文件扩展时的数据块分配策略 \r\n\r\n 3. 7 open操作和close操作 \r\n\r\n 3. 8 缓冲区缓存 \r\n\r\n 3. 8. 1 缓冲区相关数据结构 \r\n\r\n 3. 8. 2 缓冲区操作函数 \r\n\r\n 3. 8. 3 寻找缓冲区 \r\n\r\n 第4章 Linux设备管理 \r\n\r\n 4. 1 概述 \r\n\r\n 4. 1. 1 设备管理概述 \r\n\r\n 4. 1. 2 与外设的数据交流方式 \r\n\r\n 4. 1. 3 字符设备与块设备 \r\n\r\n 4. 1. 4 主设备号和次设备号 \r\n\r\n 4. 1. 5 本章内容分配 \r\n\r\n 4. 2 设备文件 \r\n\r\n 4. 2. 1 基本设备文件的设备访问流程 \r\n\r\n 4. 2. 2 设备驱动程序接口 \r\n\r\n 4. 2. 3 块设备文件接口 \r\n\r\n 4. 2. 4 def_blk_fops中的函数分析 \r\n\r\n 4. 3 传统方式下的设备注册与管理 \r\n\r\n 4. 3. 1 字符设备管理 \r\n\r\n 4. 3. 2 块设备管理的相关结构与变量 \r\n\r\n 4. 3. 3 blkdevs[]的设置 \r\n\r\n 4. 3. 4 blk_dev[]的设置 \r\n\r\n 4. 4 devfs注册与管理 \r\n\r\n 4. 4. 1 设备文件系统的基本概念 \r\n\r\n 4. 4. 2 采用devfs的原因 \r\n\r\n 4. 4. 3 启用设备文件系统 \r\n\r\n 4. 4. 4 如何使传统管理方式依然有效 \r\n\r\n 4. 4. 5 内核实现综述 \r\n\r\n 4. 4. 6 核心结构与变量 \r\n\r\n 4. 4. 7 devfs节点注册函数 \r\n\r\n 4. 4. 8 编写采用devfs的设备驱动程序 \r\n\r\n 4, 5 块设备的请求队列 \r\n\r\n 4. 5. 1 相关结构及请求队列的初始化 \r\n\r\n 4. 5. 2 block_read()提交请求的过程 \r\n\r\n 4. 5. 3 ll_rw_block()函数分析 \r\n\r\n 4. 5. 4 submit_bh()与generic_make_re- \r\n\r\n quest() \r\n\r\n 4. 5. 5 _make_request()函数分析 \r\n\r\n 4. 6 ioctl \r\n\r\n 4. 6. 1 构造ioctl命令字 \r\n\r\n 4. 6. 2 ioctl的实现过程 \r\n\r\n 4. 6. 3 ioctl的上层处理函数 \r\n\r\n 4. 6. 4 ioctl的底层处理函数 \r\n\r\n 4. 7 I/O端口的资源分配与操作 \r\n\r\n 4. 7. 1 I/O端口概述 \r\n\r\n 4. 7. 2 Linux系统中的I/O空间分配 \r\n\r\n 4. 7. 3 端口操作函数 \r\n\r\n 4. 8 其他辅助管理功能 \r\n\r\n 4. 8. 1 中断处理 \r\n\r\n 4. 8. 2 电源管理 \r\n\r\n 4. 8. 3 缓冲区管理 \r\n\r\n 4. 9 字符设备驱动程序的实现 \r\n\r\n 4. 9. 1 分析设备功能 \r\n\r\n 4. 9. 2 编写file_operations结构中的 \r\n\r\n 操控函数 \r\n\r\n 4. 9. 3 字符设备注册及初始化 \r\n\r\n 4. 9. 4 设备的使用 \r\n\r\n 4. 9. 5 驱动程序编写实例 \r\n\r\n 4. 10 块设备驱动程序的实现 \r\n\r\n 4. 10. 1 设备功能 \r\n\r\n 4. 10. 2 编写块设备的函数接口fops \r\n\r\n 4. 10. 3 设备接口注册与初始化 \r\n\r\n 第5章 Linux系统初始化 \r\n\r\n 5. 1 系统引导 \r\n\r\n 5. 2 其他引导方法 \r\n\r\n 5. 3 实模式下的系统初始化 \r\n\r\n 5. 4 保护模式下的系统初始化 \r\n\r\n 5. 4. 1 初始化寄存器与数据区 \r\n\r\n 5. 4. 2 核心代码解压缩 \r\n\r\n 5. 4. 3 页表初始化 \r\n\r\n 5. 4. 4 初始化idt. gdt和ldt \r\n\r\n 5. 4. 5 启动核心 \r\n\r\n 5. 5 启动核心(init/main. c) \r\n\r\n 5. 6 init进程及系统配置(init/main. c) \r\n\r\n 5. 6. 1 init进程的执行流程 \r\n\r\n 5. 6. 2 可执行文件init \r\n\r\n 5. 7 Linux源程序的目录分布 \r\n\r\n 5. 7. 1 kernel目录 \r\n\r\n 5. 7. 2 mm目录 \r\n\r\n 5. 7. 3 fs目录 \r\n\r\n 5. 7. 4 arch目录 \r\n\r\n 5. 7. 5 include目录 \r\n\r\n 5. 7. 6 net目录 \r\n\r\n 第6章 Linux网络实现 \r\n\r\n 6. 1 概述 \r\n\r\n 6. 2 基本数据结构 \r\n\r\n 6. 2. 1 数据包结构 \r\n\r\n 6. 2. 2 连接 \r\n\r\n 6. 2. 3 协议操作集合 \r\n\r\n 6. 2. 4 网络设备接口数据结构 \r\n\r\n 6. 2. 5 路由 \r\n\r\n 6. 2. 6 地址结构 \r\n\r\n 6. 3 网络系统初始化 \r\n\r\n 6. 3. 1 整个网络系统启动 \r\n\r\n 6. 3. 2 协议初始化 \r\n\r\n 6. 3. 3 路由初始化 \r\n\r\n 6. 3. 4 网络接口设备初始化 \r\n\r\n 6. 4 网络设备驱动程序 \r\n\r\n 6. 4. 1 网络设备接口初始化函数 \r\n\r\n 6. 4. 2 设备打开和关闭 \r\n\r\n 6. 4. 3 接收数据分析 \r\n\r\n 6. 4. 4 发送数据分析 \r\n\r\n 6. 5 网络连接 \r\n\r\n 6. 5. 1 连接的建立和关闭 \r\n\r\n 6. 5. 2 数据发送 \r\n\r\n 6. 5. 3 数据接收 \r\n\r\n 6. 6 路由过程 \r\n\r\n 6. 6. 1 发送路由 \r\n\r\n 6. 6. 2 接收路由 \r\n\r\n 第7章 Linux的模块 \r\n\r\n 7. 1 模块编程 \r\n\r\n 7. 1. 1 模块编程基本接口 \r\n\r\n 7. 1. 2 内核空间和用户空间 \r\n\r\n 7. 1. 3 内核符号表 \r\n\r\n 7. 1. 4 模块的使用 \r\n\r\n 7. 2 模块机制内核分析 \r\n\r\n 7. 2. 1 数据结构 \r\n\r\n 7. 2. 2 模块实现分析 \r\n\r\n 7. 3 模块和/proc文件系统 \r\n\r\n 7. 3. 1 初始化 \r\n\r\n 7. 3. 2 支持函数 \r\n\r\n 7. 4 modutils介绍 \r\n\r\n 7. 4. 1 insmod \r\n\r\n 7. 4. 2 rmmod \r\n\r\n 7. 4. 3 lsmod \r\n\r\n 7. 4. 4 modprlbe \r\n\r\n 7. 5 kmod \r\n\r\n 7. 5. 1 从kerneld到Kmod \r\n\r\n 7. 5. 2 kmod的实现 \r\n\r\n 第8章 Linux内核源代码的调试 \r\n\r\n 8. 1 调试机制 \r\n\r\n 8. 1. 1 断点 \r\n\r\n 8. 1. 2 信号 \r\n\r\n 8. 1. 3 单步运行 \r\n\r\n 8. 1. 4 系统调用的调试 \r\n\r\n 8. 1. 5 暂时中断后的继续处理 \r\n\r\n 8. 2 i386提供的调试机制 \r\n\r\n 8. 2. 1 调试断点的分类 \r\n\r\n 8. 2. 2 调试寄存器的结构 \r\n\r\n 8. 2. 3 断点地址 \r\n\r\n 8. 2. 4 Linux调试处理 \r\n\r\n 8. 3 ptrace()系统调用 \r\n\r\n 8. 3. 1 数据结构 \r\n\r\n 8. 3. 2 用户空间ptrace()系统调用的 \r\n\r\n 使用 \r\n\r\n 8. 3. 3 ptrace调用分析 \r\n\r\n 8. 3. 4 ptrace()调用机制及流程 \r\n\r\n 8. 4 /proc文件系统 \r\n\r\n 8. 4. 1 /proc文件系统在调试中的作用 \r\n\r\n 8. 4. 2 /proc文件系统实现分析 \r\n\r\n 8. 5 内核参数动态更改 \r\n\r\n 8. 5. 1 数据结构 \r\n\r\n 8. 5. 2 /proc/sys方式 \r\n\r\n 8. 5. 3 sysctl系统调用方式 \r\n\r\n 8. 6 内核调试环境 \r\n\r\n 8. 6. 1 内核调试的手段 \r\n\r\n 8. 6. 2 远程方式在内核调试中的地位 \r\n\r\n 8. 6. 3 Kgdb的使用 \r\n\r\n 8. 6. 4 Kgdb的实现分析 \r\n
\r\n
笔者自1994年起一直承担计算机系“操作系统”课程的教学, 感觉学习该课程有两大难处. 其一是抽象. 很难将书本中学到的操作系统概念. 算法. 原理等, 与实际的操作系统加以印证. 操作系统本来是所有软件中使用最广泛的, 每台计算机必须安装操作系统, 有的甚至不止一套. 但它们只不过是一只只“黑匣子”, 因为读不到, 或读不懂操作系统的源代码. 绝大多数用户只了解它们的外部功能和性能, 却不知道如何实现这样的功能和达到这样的性能. 其二是脱离实际. 计算机专业课非常强调上机实习, 而学习“操作系统”却难以实习. 一方面因为操作系统是所有软件中最复杂的, 编制这样的系统牵涉到方方面面, 编程者既要有扎实的软件基础, 又要了解将操作的硬件, 难度可想而知. 另一方面, 由于种种原因, 并不是大多数软件工程师都拥有参与编制实际操作系统的经历或机会.
因此, 为了教好. 学好“操作系统”和“操作系统实验”课程, 实验平台的选择就变得至关重要. 通过检索国内外. 网内外资料, 并在对UNIX. Microsoft Windows. MINIX. XINU. Naches等知名系统进行比较的基础上, 我们选择了Linux. 因为Linux兼具如下三大优点:
·Linux不同于WindowsNT. UNIX等, 它的源代码是公开的. 只要你有兴趣, 可以仔细读. 分析. 探究它是 怎样实现现代操作系统常规功能且达到如此优良性能的, 还可以与其他有关操作系统原理书中介绍的方 法逐一比较.
·Linux不同于MINIX, 它实现了虚拟存储管理, 当然也支持进程. 多处理器. 多文件系统等现代操作系统 的特征.
·Linux不同于Naches等实验型操作系统, 它是一个具有极强生命力的实用操作系统. 成千上万种应用软件 都可以在Linux平台上运行. Linux版本升级非常快, 编写此教程时, 最新版本号是2. 4. 0, 然而截止 2001年4月28日, 已升至2. 4. 4版本.
正是在“操作系统”课程教学的过程中, 使我们逐步深入了解了Linux. 正是在学习过程中, 令我们以及浙江大学计算机系绝大多数上过“操作系统”. “高级操作系统”课的研究生和大学生(包括第二学位的计算机业本科生)对Linux爱不释手. 可以说, 编写此教程, 也是希望读者分享我们的乐趣.
在本书之前, 承蒙机械工业出版社华章公司的支持, 我曾与同行合作编写过《Linux操作系统及实验教程. 该教程分三大部分, 分别是关于Linux的使用及维护, Linux内核2. 0. 35版本源代码的系统分析, Linux的实验. 限于时间, Linux源码中绝大多数函数的注释, 以及有些重要模块还来不及编入, 实验内容也比较简单. 而另一方面, Linux的常识性内容与目前出版的大多数参考书重复. 因此, 编写本书时, 我们放弃了第一. 第三部分, 突出Linux内核2. 4版本的源代码分析. 而且, 这里只讨论Linux系统的单个Intel CPU版本(其实Linux本身支持多种CPU体系结构, 且支持SMP). 顺便提一下, 如果你同时读Linux内核2. 0. 35版和2. 4. 0版, 你肯定发现, 这两个版本之间, 差异已经非常明显. 为方便读者在阅读本书过程中分析Linux源代码, 本书随时给出所讨论主题在源代码中的位置. 给出的路径均相对于/usr/src/linux. 例如, 进程的PCB由文件include/linux/sched.h定义, 也就是说, 该文件的路径是/usr/src/linux/in-clude/linux/sched.h.
本书主要内容包括Linux进程管理. Linux存储管理. Linux文件系统管理. Linux设备管理. Linux系统初始化. Linux网络实现. Linux的模块. Linux内核源码的调试等内容, 由我和我的学生刘文峰. 李程远. 王焕龙. 王伟波合作完成. 其中, 李程远. 李善平编写第1章. 第3章. 第5章, 王焕龙. 李善平编写第2章, 王伟波. 李善平编写第4章, 刘文峰编写第6章. 第7章. 第8章. 李善平审校了全书. 由于作者水平有限, 书中难免存在各种问题, 敬请读者指正. 笔者的邮箱地址为:Lishanping2001@yahoo. com. cn.
还有一点有必要强调一下, 本书内容在浙江大学计算机系96级. 97级. 98级. 99级. 2000级研究生, 以及96级. 97级. 98级本科生累计约2000位同学的使用过程中得到了不断的补充和完善. 本书能在今天与大家见面, 也有他们的贡献. 当然, 本书中一切编写或理解方面的错误与他们无关.
李善平
写于浙江大学104年校庆之际
2001年3月27日