logo资料库

深入分析Linux内核源代码.pdf(陈君莉)

第1页 / 共554页
第2页 / 共554页
第3页 / 共554页
第4页 / 共554页
第5页 / 共554页
第6页 / 共554页
第7页 / 共554页
第8页 / 共554页
资料共554页,剩余部分请下载后查看
书名页
版权页
前言
目录
第一章 走进Linux
1.1 GNU 与Linux 的成长
**linux内核源代码结构
1.2 Linux 的开发模式和运作机制
1.3 走进Linux 内核
1.3.1 Linux 内核的特征
1.3.2 Linux 内核版本的变化
1.4 分析Linux 内核的意义
1.4.1 开发适合自己的操作系统
1.4.2 开发高水平软件
1.4.3 有助于计算机科学的教学和科研
1.5 Linux 内核结构
1.5.1 Linux 内核在整个操作系统中的位置
1.5.2 Linux 内核的作用
1.5.3 Linux 内核的抽象结构
1.6 Linux 内核源代码
1.6.1 多版本的内核源代码
1.6.2 Linux 内核源代码的结构
1.6.3 从何处开始阅读源代码
1.7 Linux 内核源代码分析工具
1.7.1 Linux 超文本交叉代码检索工具
1.7.2 Windows 平台下的源代码阅读工具(Source Insight)
第二章 Linux 运行的硬件基础
2.1 i386 的寄存器
2.1.1 通用寄存器
**进程管理和虚拟内存管理用到的寄存器
**MMU把逻辑地址转化为物理地址
**对段机制的认识是进入linux的必经之路
2.1.2 段寄存器
2.1.3 状态和控制寄存器
2.1.4 系统地址寄存器
2.1.5 调试寄存器和测试寄存器
2.2 内存地址
2.3 段机制和描述符
2.3.1 段机制
2.3.2 描述符的概念
2.3.3 系统段描述符
2.3.4 描述符表
2.3.5 选择符与描述符表寄存器
2.3.6 描述符投影寄存器
2.3.7 Linux 中的段
**采用两级页表目录的原因
**linux中断向量表的划分
2.4 分页机制
2.4.1 分页机构
2.4.2 页面高速缓存
2.5 Linux 中的分页机制
2.5.1 与页相关的数据结构及宏的定义
2.5.2 对页目录及页表的处理
2.6 Linux 中的汇编语言
2.6.1 AT&T 与Intel 汇编语言的比较
2.6.2 AT&T 汇编语言的相关知识
2.6.3 gcc 嵌入式汇编
2.6.4 Intel386 汇编指令摘要
第三章 中断机制
3.1 中断基本知识
3.1.1 中断向量
3.1.2 外设可屏蔽中断
3.1.3 异常及非屏蔽中断
3.1.4 中断描述符表
3.1.5 相关汇编指令
3.2 中断描述符表的初始化
3.2.1 外部中断向量的设置
3.2.2 中断描述符表IDT 的预初始化
3.2.3 中断向量表的最终初始化
3.3 异常处理
3.3.1 在内核栈中保存寄存器的值
3.3.2 中断请求队列的初始化
3.3.3 中断请求队列的数据结构
3.4 中断处理
3.4.1 中断和异常处理的硬件处理。
3.4.2 Linux 对中断的处理
3.4.3 与堆栈有关的常量、数据结构及宏
3.4.4 中断处理程序的执行
3.4.5 从中断返回
3.5 中断的后半部分处理机制
3.5.1 为什么把中断分为两部分来处理
3.5.2 实现机制
3.5.3 数据结构的定义
3.5.4 软中断、bh 及tasklet 的初始化
3.5.5 后半部分的执行
3.5.6 把bh 移植到tasklet
第四章 进程描述
4.1 进程和程序(Process and Program)
4.2 Linux 中的进程概述
4.3 task_struct 结构描述
4.4 task_struct 结构在内存中的存放
4.4.1 进程内核栈
4.4.2 当前进程(current 宏)
4.5 进程组织方式
4.5.1 哈希表
4.5.2 双向循环链表
4.5.3 运行队列
4.5.4 进程的运行队列链表
4.5.5 等待队列
4.6 内核线程
4.7 进程的权能
4.8 内核同步
4.8.1 信号量
4.8.2 原子操作
4.8.3 自旋锁、读写自旋锁和大读者自旋锁
第五章 进程调度与切换
5.1 Linux 时间系统
5.1.1 时钟硬件
5.12 时钟运作机制
5.1.3 Linux 时间基准
5.1.4 Linux 的时间系统
5.2 时钟中断
5.2.1 时钟中断的产生
5.2.2 Linux 实现时钟中断的全过程
5.3 Linux 的调度程序—Schedule( )
5.3.1 基本原理
5.3.2 Linux 进程调度时机
5.3.3 进程调度的依据
5.3.4 进程可运行程度的衡量
5.3.5 进程调度的实现
5.4 进程切换
5.4.1 硬件支持
5.4.2 进程切换
第六章 Linux 内存管理
6.1 Linux 的内存管理概述
6.1.1 Linux 虚拟内存的实现结构
6.1.2 内核空间和用户空间
6.1.3 虚拟内存实现机制间的关系
6.2 Linux 内存管理的初始化
6.2.1 启用分页机制
6.2.2 物理内存的探测
6.2.3 物理内存的描述
6.2.4 页面管理机制的初步建立
6.2.5 页表的建立
6.2.6 内存管理区
6.3 内存的分配和回收
6.3.1 伙伴算法
6.3.2 物理页面的分配和释放
6.3.3 Slab 分配机制
6.3.4 内核空间非连续内存区的管理
6.4 地址映射机制
6.4.1 描述虚拟空间的数据结构
6.4.2 进程的虚拟空间
6.4.3 内存映射
6.5 请页机制
6.5.1 页故障的产生
6.5.2 页错误的定位
6.5.3 进程地址空间中的缺页异常处理
6.5.4 请求调页
6.5.5 写时复制
6.5.6 对本节的几点说明
6.6 交换机制
6.6.1 交换的基本原理
6.6.2 页面交换守护进程kswapd
6.6.3 交换空间的数据结构
6.6.4 交换空间的应用
6.7 缓存和刷新机制
6.7.1 Linux 使用的缓存
6.7.2 缓冲区高速缓存
6.7.3 翻译后援存储器(TLB)
6.7.4 刷新机制
6.8 进程的创建和执行
6.8.1 进程的创建
6.8.2 程序执行
6.8.3 执行函数
第七章 进程间通信
7.1 管道
7.1.1 Linux 管道的实现机制
7.1.2 管道的应用
7.1.3 命名管道CFIFOC
7.2 信号(signal)
7.2.1 信号种类
7.2.2 信号掩码
7.2.3 系统调用
7.2.4 典型系统调用的实现
7.2.5 进程与信号的关系
7.2.6 信号举例
7.3 System V 的IPC 机制
7.3.1 信号量
7.3.2 消息队列
7.3.3 共享内存
第八章 虚拟文件系统
8.1 概述
8.2 VFS 中的数据结构
8.2.1 超级块
8.2.2 VFS 的索引节点
8.2.3 目录项对象
8.2.4 与进程相关的文件结构
8.2.5 主要数据结构间的关系
8.2.6 有关操作的数据结构
8.3 高速缓存
8.3.1 块高速缓存
8.3.2 索引节点高速缓存
8.3.3 目录高速缓存
8.4 文件系统的注册、安装与卸载
8.4.1 文件系统的注册
8.4.2 文件系统的安装
8.4.3 文件系统的卸载
8.5 限额机制
8.6 具体文件系统举例
8.6.1 管道文件系统pipefs
8.6.2 磁盘文件系统BFS
8.7 文件系统的系统调用
8.7.1 open 系统调用
8.7.2 read 系统调用
8.7.3 fcntl 系统调用
8.8 Linux 2.4 文件系统的移植问题
***与进程相关的文件结构示意图
第九章 Ext2 文件系统
9.1 基本概念
9.2 Ext2 的磁盘布局和数据结构
9.2.1 Ext2 的磁盘布局
9.2.2 Ext2 的超级块
9.2.3 Ext2 的索引节点
9.2.4 组描述符
9.2.5 位图
9.2.6 索引节点表及实例分析
9.2.7 Ext2 的目录项及文件的定位
9.3 文件的访问权限和安全
9.4 链接文件
9.5 分配策略
9.5.1 数据块寻址
9.5.2 文件的洞
9.5.3 分配一个数据块
第十章 模块机制
10.1 概述
10.1.1 什么是模块
10.1.2 为什么要使用模块
10.1.3 Linux 内核模块的优缺点
10.2 实现机制
10.2.1 数据结构
10.2.2 实现机制的分析
10.3 模块的装入和卸载
10.3.1 实现机制
10.3.2 如何插入和卸载模块
10.4 内核版本
10.4.1 内核版本与模块版本的兼容性
10.4.2 从版本2.0 到2.2 内核API 的变化
10.4.3 把内核2.2 移植到内核2.4
10.5 编写内核模块
10.5.1 简单内核模块的编写
10.5.2 内核模块的Makefiles 文件
10.5.3 内核模块的多个文件
第十一章 设备驱动程序
11.1 概述
11.1.1 I/O 软件
11.1.2 设备驱动程序
11.2 设备驱动基础
11.2.1 I/O 端口
11.2.2 I/O 接口及设备控制器
11.2.3 设备文件
11.2.4 VFS 对设备文件的处理
11.2.5 中断处理
11.2.6 驱动DMA 工作
11.2.7 I/O 空间的映射
11.2.8 设备驱动程序框架
11.3 块设备驱动程序
11.3.1 块设备驱动程序的注册
11.3.2 块设备基于缓冲区的数据交换
11.3.3 块设备驱动程序的几个函数
11.3.4 RAM 盘驱动程序的实现
11.3.5 硬盘驱动程序的实现
11.4 字符设备驱动程序
11.4.1 简单字符设备驱动程序
11.4.2 字符设备驱动程序的注册
11.4.3 一个字符设备驱动程序的实例
11.4.4 驱动程序的编译与装载
第十二章 网络
12.1 概述
12.2 网络协议
12.2.1 网络参考模型
12.2.2 TCP/IP 工作原理及数据流
12.2.3 Internet 协议
12.2.4 TCP
12.3 套接字(socket)
12.3.1 套接字在网络中的地位和作用
12.3.2 套接字接口的种类
12.3.3 套接字的工作原理
12.3.4 socket 的通信过程
12.3.5 socket 为用户提供的系统调用
12.4 套接字缓冲区(sk_buff)
12.4.1 套接字缓冲区的特点
12.4.2 套接字缓冲区操作基本原理
12.4.3 sk_buff 数据结构的核心内容
12.4.4 套接字缓冲区提供的函数
12.4.5 套接字缓冲区的上层支持例程
12.5 网络设备接口
12.5.1 基本结构
12.5.2 命名规则
12.5.3 设备注册
12.5.4 网络设备数据结构
12.5.5 支持函数
第十三章 Linux 启动系统
13.1 初始化流程
13.1.1 系统加电或复位
13.1.2 BIOS 启动
13.1.3 Boot Loader
13.1.4 操作系统的初始化
13.2 初始化的任务
13.2.1 处理器对初始化的影响
13.2.2 其他硬件设备对处理器的影响
13.3 Linux 的Boot Loader
13.3.1 软盘的结构
13.3.2 硬盘的结构
13.3.3 Boot Loader
13.3.4 LILO
13.3.5 LILO 的运行分析
13.4 进入操作系统
13.4.1 Setup.S
13.4.2 Head.S
13.5 main.c 中的初始化
13.6 建立init 进程
13.6.1 init 进程的建立
13.6.2 启动所需的Shell 脚本文件
***了解boot loader的内在机制从了解磁盘结构开始
附录A Linux 内核API
附录B 在线文档
参考文献
深入分析Linux内核源代码 陈莉君 编著 人 民 邮 电 出 版 社
图书在版编目(CIP)数据 深入分析 Linux 内核源代码/陈莉君编著. —北京:人民邮电出版社,2002.8 ISBN 7-115-10525-1 I. 深… II. 陈… III. Linux 操作系统 IV. TP316.89 中国版本图书馆 CIP 数据核字(2002)第 056978 号 内 容 提 要 自由软件 Linux 操作系统源代码的开放,为我们掌握操作系统核心技术提供了良好的条 件。本书共分 13 章,对 Linux 内核 2.4 版的源代码进行了较全面的分析,既包括对中断机 制、进程调度、内存管理、进程间通信、虚拟文件系统、设备驱动程序及网络子系统的分析, 也包括对 Linux 整体结构的把握、Linux 的启动过程的分析及 Linux 独具特色的模块机制的 分析与应用等。其中重点剖析了 Linux 内核中最基础的部分:进程管理、内存管理及文件管 理。 本书对于那些准备进入 Linux 操作系统内部,阅读 Linux 内核源代码以及在内核级进 行程序开发的读者具有非常高的参考价值。同时,操作系统实现者、系统程序员、Linux 应 用开发人员、嵌入式系统开发人员、系统管理员、在校的大学生和研究生及对 Linux 感兴趣 的用户均可在阅读本书中受益。 深入分析 Linux 内核源代码 ♦ 编 著 陈莉君 责任编辑 魏雪萍 ♦ 人民邮电出版社出版发行 北京市崇文区夕照寺街 14 号 邮编 100061 电子函件 315@ ptpress.com.cn 网址 http://www.ptpress.com.cn 读者热线:010-67180876 北京汉魂图文设计有限公司制作 北京印刷厂印刷 新华书店总店北京发行所经销 ♦ 开本:787×1092 1/16 印张: 字数: 千字 2002 年 8 月第 1 版 印数:1- 000 册 2002 年 8 月北京第 1 次印刷 ISBN 7-115-10525-1/TP·3021 定价:00.00 元 本书如有印装质量问题,请与本社联系 电话:(010)67129223 – 1 –
前 言 如果说 Linux 的出现是一个偶然,那么,席卷全球的 Linux 热潮则是一个奇迹,Linux 正以势不可挡的趋势迅猛发展,其发展前景是无法预测的。 有人说,“Linux 不就是类 UNIX 吗?”是的,它的外在表现形式确实与 UNIX 完全兼容, 这也是它赖以生存的基本条件。但是,它的内涵则完全不同,这首先体现在其源代码全部重 写及开放,其次是它的快速更新和发展,而更重要的是世界范围内众多计算机爱好者能通过 Internet 参与开发,由此可见,借助于 Internet 的肥沃土壤,Linux 的迅速发展是毫无置疑 的! 实际上,Linux 最本质的东西体现在其“自由”和“开放”的思想,“自由”意味着世 界范围内的知识共享,而“开放”则意味着 Linux 对所有的人都敞开大门,在这开放而自由 的天地里,你的创造激情可以得到充分的发挥。 Linux 内核源代码的开放给希望深入操作系统内部世界的人敞开无私的胸怀,我们有幸 走进了这个世界,这是一个神奇、错综复杂而又充满诱惑的世界,让喜欢迎接挑战的人们可 以充分检验自己的勇气和耐力。 Linux 内核全部源代码是一个庞大的世界,大约有 200 多万行,占 60MB 左右的空间。因 此,如何在这庞大而复杂的世界中抓住主要内容,如何找到进入 Linux 内部的突破口,又如 何能把 Linux 的源代码变为自己的需要,这就是本书要探讨的内容。 首先,本书的第一章领你走入 Linux 的大门,让你对 Linux 内核的结构有一个整体的了 解。然后,第二章介绍了分析 Linux 源代码应具备的基本硬件知识,这是继续向 Linux 内核 迈进的必备条件。中断作为操作系统中发生最频繁的一个活动,本书用一章的内容详细描述 了中断在操作系统中的具体实现机制。 众所周知,操作系统中最核心的内容就是进程管理、内存管理和文件管理。本书用大量 的篇幅描述了这三部分内容,尤其对最复杂的虚拟内存管理进行了详细的分析,其中对内存 初始化部分的详细描述将对嵌入式系统的开发者有所帮助。 在对 Linux 内核有一定了解后,读者可能希望能够利用内核函数进行内核级程序的开发, 例如开发一个设备驱动程序。Linux 的模块机制就是支持一般用户进行内核级编程。另外, 读者在进行内核级编程时还可以快速查阅本书附录部分提供的 Linux 内核 API 函数。 网络也是 Linux 中最复杂的部分之一,这部分内容足可以写一本书。本书仅以面向对象 的思想为核心,分别对网络部分中的四个主要对象:协议、套接字、套接字缓冲区及网络设 备接口进行了分析。有了对这四个对象的分析,再结合文件系统、设备驱动程序的内容,读 者就可以具体分析自己感兴趣的相关内容。 Linux 在不断地发展,本书介绍的版本为 Linux 2.4.16。尽管本书力图反映 Linux 内核 较本质的东西,但由于笔者的知识有限,对有些问题的理解难免有偏差,甚至可能有“Bug”, 希望读者能尽可能多地发现它,以共同对本书进行改进和完善。 – 1 –
在本书的编写的过程中,笔者查阅了大量的资料,也阅读了大量的源代码,但本书中反 映的内容也仅仅是 Linux 的主要内容。因为一本书的组织形成是一种线性结构,而知识本身 的组织结构是一种树型结构,甚至是多线索的网状结构,因此,在本书的编写过程中,笔者 深感书的表现能力非常有限,一本书根本无法囊括全部。在参考书目中,我们将给出主要的 参考书及主要网站的相关内容。 本书的第一版是《Linux 操作系统内核分析》,在第一版的编写过程中,康华、季进宝、 陈轶飞、张波、张蕾及胡清俊等参与了编写。第一版出版后得到了很多读者的充分肯定和赞 扬,并授权台湾地区出版。在本次改版的过程中,依然保留了第一版的风格,但加深了对进 程管理、内存管理及文件管理等众多内容的剖析。 这次改版由于时间仓促,加之作者的水平有限,书中有些术语的表达可能不妥,有些内 容的分析也可能不够准确,敬请读者朋友批评指正。我的联系方式是:cljun@xiyou.edu.cn。 编者 2002 年 7 月 – 2 –
目 录 第一章 走进 Linux ...................................................................... 1 1.1 GNU 与 Linux 的成长 ............................................................ 1 1.2 Linux 的开发模式和运作机制 .................................................. 2 1.3 走进 Linux 内核 ................................................................ 4 1.3.1 Linux 内核的特征 ....................................................... 4 1.3.2 Linux 内核版本的变化 .................................................. 5 1.4 分析 Linux 内核的意义 ......................................................... 7 1.4.1 开发适合自己的操作系统................................................ 8 1.4.2 开发高水平软件 ......................................................... 9 1.4.3 有助于计算机科学的教学和科研......................................... 9 1.5 Linux 内核结构 ................................................................ 9 1.5.1 Linux 内核在整个操作系统中的位置 ................................... 10 1.5.2 Linux 内核的作用 ...................................................... 11 1.5.3 Linux 内核的抽象结构 ................................................. 11 1.6 Linux 内核源代码 ............................................................. 12 1.6.1 多版本的内核源代码 ................................................... 13 1.6.2 Linux 内核源代码的结构 ............................................... 13 1.6.3 从何处开始阅读源代码 ................................................. 14 1.7 Linux 内核源代码分析工具 .................................................... 16 1.7.1 Linux 超文本交叉代码检索工具 ........................................ 16 1.7.2 Windows 平台下的源代码阅读工具(Source Insight) ................. 17 第二章 Linux 运行的硬件基础.......................................................... 19 2.1 i386 的寄存器................................................................. 19 2.1.1 通用寄存器............................................................. 19 2.1.2 段寄存器 ............................................................... 20 2.1.3 状态和控制寄存器...................................................... 20 2.1.4 系统地址寄存器 ........................................................ 23 2.1.5 调试寄存器和测试寄存器............................................... 24 2.2 内存地址 ...................................................................... 25 2.3 段机制和描述符 ............................................................... 26 2.3.1 段机制 ................................................................. 26 – 1 –
深入分析 Linux 内核源代码 2.3.2 描述符的概念 .......................................................... 27 2.3.3 系统段描述符 .......................................................... 29 2.3.4 描述符表 ............................................................... 30 2.3.5 选择符与描述符表寄存器............................................... 30 2.3.6 描述符投影寄存器...................................................... 32 2.3.7 Linux 中的段 ........................................................... 32 2.4 分页机制 ...................................................................... 34 2.4.1 分页机构 ............................................................... 36 2.4.2 页面高速缓存 .......................................................... 39 2.5 Linux 中的分页机制 ........................................................... 40 2.5.1 与页相关的数据结构及宏的定义........................................ 41 2.5.2 对页目录及页表的处理 ................................................. 42 2.6 Linux 中的汇编语言 ........................................................... 44 2.6.1 AT&T 与 Intel 汇编语言的比较 ......................................... 44 2.6.2 AT&T 汇编语言的相关知识 .............................................. 46 2.6.3 gcc 嵌入式汇编 ........................................................ 49 2.6.4 Intel386 汇编指令摘要 ................................................ 52 第三章 中断机制 ....................................................................... 55 3.1 中断基本知识 ................................................................. 55 3.1.1 中断向量 ............................................................... 55 3.1.2 外设可屏蔽中断 ........................................................ 56 3.1.3 异常及非屏蔽中断...................................................... 57 3.1.4 中断描述符表 .......................................................... 59 3.1.5 相关汇编指令 .......................................................... 60 3.2 中断描述符表的初始化 ........................................................ 61 3.2.1 外部中断向量的设置 ................................................... 61 3.2.2 中断描述符表 IDT 的预初始化 .......................................... 63 3.2.3 中断向量表的最终初始化............................................... 65 3.3 异常处理 ...................................................................... 68 3.3.1 在内核栈中保存寄存器的值 ............................................ 68 3.3.2 中断请求队列的初始化 ................................................. 70 3.3.3 中断请求队列的数据结构............................................... 70 3.4 中断处理 ...................................................................... 77 3.4.1 中断和异常处理的硬件处理。 .......................................... 77 3.4.2 Linux 对中断的处理 .................................................... 78 3.4.3 与堆栈有关的常量、数据结构及宏 ..................................... 79 3.4.4 中断处理程序的执行 ................................................... 81 3.4.5 从中断返回............................................................. 85 – 2 –
目 录 3.5 中断的后半部分处理机制...................................................... 86 3.5.1 为什么把中断分为两部分来处理........................................ 86 3.5.2 实现机制 ............................................................... 87 3.5.3 数据结构的定义 ........................................................ 89 3.5.4 软中断、bh 及 tasklet 的初始化 ....................................... 91 3.5.5 后半部分的执行 ........................................................ 92 3.5.6 把 bh 移植到 tasklet................................................... 96 第四章 进程描述 ....................................................................... 97 4.1 进程和程序(Process and Program) ......................................... 97 4.2 Linux 中的进程概述 ........................................................... 99 4.3 task_struct 结构描述........................................................ 100 4.4 task_struct 结构在内存中的存放 ............................................ 107 4.4.1 进程内核栈............................................................ 107 4.4.2 当前进程(current 宏) .............................................. 108 4.5 进程组织方式 ................................................................ 109 4.5.1 哈希表 ................................................................ 109 4.5.2 双向循环链表 ......................................................... 110 4.5.3 运行队列 .............................................................. 111 4.5.4 进程的运行队列链表 .................................................. 111 4.5.5 等待队列 .............................................................. 112 4.6 内核线程 ..................................................................... 115 4.7 进程的权能................................................................... 116 4.8 内核同步 ..................................................................... 117 4.8.1 信号量 ................................................................ 118 4.8.2 原子操作 .............................................................. 118 4.8.3 自旋锁、读写自旋锁和大读者自旋锁 .................................. 119 第五章 进程调度与切换 ............................................................... 123 5.1 Linux 时间系统 .............................................................. 123 5.1.1 时钟硬件 .............................................................. 123 5.1.2 时钟运作机制 ......................................................... 124 5.1.3 Linux 时间基准 ....................................................... 125 5.1.4 Linux 的时间系统 ..................................................... 126 5.2 时钟中断 ..................................................................... 126 5.2.1 时钟中断的产生 ....................................................... 126 5.2.2 Linux 实现时钟中断的全过程 ......................................... 127 5.3 Linux 的调度程序—Schedule( ) ........................................ 131 5.3.1 基本原理 .............................................................. 132 – 3 –
深入分析 Linux 内核源代码 5.3.2 Linux 进程调度时机 ................................................... 133 5.3.3 进程调度的依据 ....................................................... 135 5.3.4 进程可运行程度的衡量 ................................................ 136 5.3.5 进程调度的实现 ....................................................... 137 5.4 进程切换 ..................................................................... 139 5.4.1 硬件支持 .............................................................. 139 5.4.2 进程切换 .............................................................. 142 第六章 Linux 内存管理................................................................ 147 6.1 Linux 的内存管理概述 ....................................................... 147 6.1.1 Linux 虚拟内存的实现结构 ............................................ 148 6.1.2 内核空间和用户空间 .................................................. 149 6.1.3 虚拟内存实现机制间的关系 ........................................... 151 6.2 Linux 内存管理的初始化..................................................... 152 6.2.1 启用分页机制 ......................................................... 152 6.2.2 物理内存的探测 ....................................................... 157 6.2.3 物理内存的描述 ....................................................... 163 6.2.4 页面管理机制的初步建立.............................................. 166 6.2.5 页表的建立............................................................ 173 6.2.6 内存管理区............................................................ 177 6.3 内存的分配和回收............................................................ 185 6.3.1 伙伴算法 .............................................................. 186 6.3.2 物理页面的分配和释放 ................................................ 187 6.3.3 Slab 分配机制......................................................... 194 6.3.4 内核空间非连续内存区的管理 ......................................... 201 6.4 地址映射机制 ................................................................ 204 6.4.1 描述虚拟空间的数据结构.............................................. 205 6.4.2 进程的虚拟空间 ....................................................... 209 6.4.3 内存映射 .............................................................. 212 6.5 请页机制 ..................................................................... 218 6.5.1 页故障的产生 ......................................................... 218 6.5.2 页错误的定位 ......................................................... 219 6.5.3 进程地址空间中的缺页异常处理....................................... 220 6.5.4 请求调页 .............................................................. 221 6.5.5 写时复制 .............................................................. 223 6.5.6 对本节的几点说明..................................................... 225 6.6 交换机制 ..................................................................... 225 6.6.1 交换的基本原理 ....................................................... 225 6.6.2 页面交换守护进程 kswapd ............................................. 229 – 4 –
分享到:
收藏