内容推荐 本书对UNIX xv6的源码进行了深入剖析和详细注解,同时配合大量实例与图表,对每个模块先提炼关键数据结构和核心方法,再结合源码分析其工作机制,让读者明白其原理及具体实现,以求理论和实践能力同步提升,为深入理解操作系统原理乃至进一步研究学习Linux和Android等类UNIX系统内核打下坚实基础。 本书第1章对xv6进行概述;第2章介绍xv6操作系统结构;第3章介绍xv6开发、测试和运行的软件环境;第4章简要介绍x86计算机组成原理;第5章介绍x86的实模式与保护模式;第6章深入分析xv6的启动;第7~10章介绍xv6的虚拟空间管理、中断与系统调用、锁以及进程管理,第11、12章介绍xv6的文件系统;第13章介绍exec()函数、管道与字符串的实现;第14章介绍xv6的多处理器支持;第15章介绍字符设备驱动;第16章介绍用户进程的初始化、API和Shell的实现。 本书适合操作系统初、中级学习者,系统程序员,嵌入式系统开发者以及对UNIX和Linux等类UNIX内核感兴趣的读者。 目录 第1章 xv6概述 1.1 xv6的前身UNIX 1.1.1 UNIX发展简史 1.1.2 UNIX家族 1.2 xv6的诞生 1.3 xv6的源码与文档 第2章 xv6操作系统结构 2.1 xv6体系结构 2.1.1 硬件与内核 2.1.2 界面 2.1.3 内核态与用户态 2.2 进程管理 2.3 虚拟内存、文件与I/O设备驱动 2.4 系统调用、API与内核函数 2.4.1 系统调用 2.4.2 API 2.4.3 内核函数 第3章 xv6的软件环境 3.1 xv6的C语言技巧 3.1.1 static 3.1.2 inline 3.1.3 函数指针 3.1.4 函数指针示例 3.1.5 双重指针 3.2 AT&T汇编与内联汇编 3.2.1 AT&T汇编 3.2.2 GCC内联汇编 3.3 函数调用与堆栈 3.3.1 栈帧、寄存器惯例与调用约定 3.3.2 栈帧示例 3.3.3 栈帧示例 3.3.4 汇编语言中调用C语言函数 3.3.5 C语言函数调用汇编语言函数 3.4 xv6编译、调试与链接 3.4.1 gcc命令 3.4.2 make命令 3.4.3 xv6的Makefile文件 3.4.4 gdb命令 3.4.5 ELF文件结构 3.4.6 使用ld命令链接xv 3.5 Bochs与QEMU模拟器 3.5.1 Bochs模拟器 3.5.2 Bochs模拟器的配置 3.5.3 QEMU模拟器选项及内核调试 第4章 x86计算机组成原理 4.1 计算机系统 4.2 计算机硬件系统 4.2.1 硬件组成 4.2.2 总线 4.3 CPU 4.3.1 Cache与指令部件 4.3.2 MMU与BIU 4.3.3 寄存器组 4.4 内存 4.5 中断系统 4.5.1 中断 4.5.2 中断控制器与中断处理程序 4.6 I/O端口与外设 4.6.1 I/O端口与端口寻址 4.6.2 控制器与I/O设备 第5章 x86实模式与保护模式 5.1 x86的地址与工作模式 5.1.1 地址的概念 5.1.2 16位实模式 5.1.3 32位保护模式 5.2 A20地址线 5.3 保护模式与段寄存器 5.3.1 分段机制 5.3.2 逻辑地址转换为线性地址 5.3.3 段选择符 5.3.4 段寄存器 5.3.5 xv6的段选择符和段寄存器的设定 5.4 描述符 5.4.1 描述符格式 5.4.2 非系统描述符 5.4.3 系统描述符 5.4.4 xv6中的描述符 5.5 描述符表、TSS与特权等级保护 5.5.1 描述符表 5.5.2 TSS与任务切换 5.5.3 系统地址寄存器 5.5.4 段的特权等级保护 5.6 xv6的段管理 5.6.1 实模式下的段 5.6.2 保护模式引导阶段的GDT 5.6.3 内核的GDT 5.6.4 IDT 5.6.5 TSS与TR 5.7 保护模式分页机制 5.7.1 控制寄存器 5.7.2 分页机制 5.7.3 CR3、页目录项与页表项的格式 5.7.4 虚拟地址与物理地址的转换 5.8 xv6的地址空间 第6章 xv6的启动 6.1 概述 6.1.1 引导扇区与启动流程 6.1.2 启动过程的地址空间设置 6.1.3 启动过程的堆栈 6.2 BP的引导 6.2.1 BP从实模式进入保护模式 6.2.2 进入32位模式 6.2.3 调用bootmain()函数 6.2.4 BP加载内核映像文件 6.3 BP进入内核 6.3.1 内核入口地址 6.3.2 内核的进入 6.4 BP的初始化 6.4.1 运行主函数 6.4.2 启动AP 6.5 AP的进入与初始化 6.5.1 AP的进入 6.5.2 AP的初始化 第7章 虚拟空间管理 7.1 虚拟地址空间布局与映射 7.1.1 虚拟地址空间及布局 7.1.2 内核空间映射 7.1.3 内核的几个特殊地址 7.2 空间初始化、分配与释放 7.2.1 空闲帧管理 7.2.2 内核页面分配 7.2.3 内存初始化 7.2.4 空间释放 7.3 内核虚拟空间管理 7.3.1 内核虚拟空间分配、构建与切换 7.3.2 页面映射与页表查找 7.4 用户空间管理 7.4.1 初始进程的用户空间 7.4.2 用户空间加载 7.4.3 用户空间复制 7.4.4 用户空间切换 7.4.5 用户空间分配与释放 第8章 中断与系统调用 8.1 xv6中断处理 8.1.1 IDT初始化 8.1.2 xv6中断号 8.1.3 中断向量数组与中断向量 8.1.4 中断响应与中断返回 8.1.5 中断处理程序 8.2 系统调用 8.2.1 系统调用函数 8.2.2 系统调用函数的实现 8.2.3 系统调用分派 8.2.4 函数指针数组与系统函数 8.2.5 提取调用参数 8.2.6 系统调用示例 8.3 驱动程序 8.4 中断与系统调用及内核堆栈 8.4.1 中断与系统调用处理过程 8.4.2 中断的内核堆栈 第9章 锁 9.1 自旋锁 9.1.1 自旋锁的概念 9.1.2 自旋锁的实现 9.2 睡眠锁 9.2.1 睡眠锁的概念 9.2.2 睡眠锁的实现 9.3 内核的死锁 第10章 进程管理 10.1 进程的基本概念 10.1.1 进程的概念 10.1.2 进程的状态与生命周期 序言 前言 操作系统在计算机系统中处于承上启下的重 要地位,它对下管理计算机的硬件资源,对上服 务应用程序和用户。阅读内核源码是学习操作系 统原理及实现和理解计算机系统的重要途径,但 实际的操作系统太过庞大,以致让人无法窥其全 貌,例如2021年4月发布的Linux内核版本5.10 稳定版已经达到了约3000万行源码的规模。小巧 的UNIX早期版本UNIX V6曾经是MIT等众多高校 操作系统课程源码研读的首选,而且Linux、 iOS和Android都基于UNIX V6,通过研读UNIX V6源码可以更深入理解UNIX、Linux等操作系统 内核的基本概念及实现原理。但UNIX V6基于的 PDP-11硬件平台早已被淘汰,而UNIX V6部分汇 编代码直接使用了PDP-11指令;UNIX V6所用的 C语言也是最早期的版本;而且UNIX V6部分代 码略显粗糙,这些因素给学习者造成了极大障碍 。因此,2006年MIT基于Intel 的32位x86处理 器用标准C语言重新实现了UNIX V6并命名为 UNIX xv6,简称xv6。于2018年9月发布的xv6最 终修订版rev11总共只有9300多行,xv6沿袭了 UNIX V6的基本架构并对其粗糙的地方进行了改 进。xv6及其变种目前被麻省理工学院(MIT) 、耶鲁大学、清华大学、北京航空航天大学和哈 尔滨工业大学等众多高校选为操作系统教学和实 验平台。《UNIX xv6内核源码深入剖析》结合 源码深度剖析xv6如何在Intel的32位x86架构上 实现UNIX V6操作系统,配套源码读者可以扫描 下方二维码获取,《UNIX xv6内核源码深入剖 析》涉及的思想和概念可以为Linux、iOS、 Android乃至嵌入式系统的开发人员理解操作系 统底层原理提供一条便捷之道。 源码考虑到部分读者对如何学习操作系统及 为何研究xv6源码存在疑问,因此《UNIX xv6内 核源码深入剖析》先阐述操作系统的学习之道, 然后再解释xv6为何适合作为打开操作系统内核 的钥匙,最后给出《UNIX xv6内核源码深入剖 析》的结构。1. 操作系统的学习之道操作系统 的学习有以下4个循序渐进的途径和层次。1)读 原著首先读一本经典的操作系统书籍,如 Tanenbaum的《操作系统:设计与实现(第3版 )》《现代操作系统》或者Silberschatz的《 操作系统概念》,以对操作系统的基本概念(如 进程管理、内存管理、文件系统和I/O管理)有 基本的理解;此外还可动手编写一些程序来调用 操作系统核心API,实现进程管理、内存分配和 文件创建等功能。如果对计算机系统基本原理不 太熟悉,《深入理解计算机系统》可帮助读者对 计算机系统有全面且深入的认识;学习操作系统 需要理解CPU的6个重要机制:寄存器、多级缓存 、分段、分页、中断以及多核同步,读者可参阅 计算机组成原理方面的书籍,如David A. Patterson的《计算机组成与设计》;对于x86 处理器的技术细节,Intel的开发手册Software Developer Manuals for Intel? 64 and IA-32 Architectures(简称Intel SDM)是权 威的参考资料,但Intel SDM近5000页的体量过 于庞大,所以更适合作为工具书查阅。2)探源 码只了解操作系统的一些概念对于学习操作系统 来说还只能算是纸上谈兵,如同医生要学习人体 解剖学,计算机相关专业的从业者应该“解剖” 一个操作系统。源码面前了无秘密,探究内核源 码是剖析操作系统的最佳途径,研读内核源码会 让读者对计算机系统从硬件到操作系统原理及实 现有一个清晰完整的理解。另外,一些操作系统 内核源码堪称大师杰作,是学习编程的典范;很 多操作系统内核如UNIX、Linux等都是用C语言 编写的,因此内核源码也是程序员学习C语言的 优秀范本,C语言的指针、结构体和宏等高级特 性在操作系统内核源码中体现得淋漓尽致。研读 源码经常涉及函数的调用与实现、变量和类型的 定义,常常在源码之间来回跳转,而且对于一些 很隐晦的部分如函数指针,只有具体分析上下文 才能确定它关联到哪个函数,因此需要一个专业 工具来阅读源码,Source Insight是阅读源码 的利器,Visual Studio Code也是不错的选择 。3)改源码对源码研习到一定阶段,读者可尝 试修改操作系统内核源码。首先可以尝试在虚拟 机上编译、运行并调试内核,让源码“活”起来 ;然后找到自己关注的模块动手修改,例如可以 修改调度算法,实现内存映射、设备驱动、文件 系统或者某个用户命令(如ls)等。4)做原型 如果到第三个层次仍有余力,读者不妨尝试从零 开始编写一个简单的操作系统内核。计算机界的 大师如UNIX的作者Ken、Linux的作者Linus以及 Minix的作者Andrew Stuart Tanenbaum就是这 样做的。为实现操作系统原型,读者可参考于渊 的《Orange’s 一个操作系统的实现》、川合 秀实的《30天自制操作系统》以及田宇的《一个 64位操作系统的设计与实现》。2. 选择xv6源 码的原因研读操作系统源码可帮助读者真正理解 操作系统的原理及实现技术,但实际的操作系统 内核往往太过庞大。源码只有1万多行的UNIX V6是现代操作系统的鼻祖,UNIX V6曾经是众多 高校操作系统课程研习内核源码的首选。《UNIX xv6内核源码深 导语 本书全面剖析UNIX xv6的源码,图文并茂,理论结合实践,帮助读者为深入理解操作系统原理乃至进一步研究学习Linux和Android等类UNIX系统内核打下坚实基础。 |