目录 第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 栈帧示例1 3.3.3 栈帧示例2 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命令链接xv6 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 进程的状态与生命周期 10.1.3 进程的上下文 10.1.4 处理器结构体、当前处理器与当前进程 10.2 进程的切换 10.2.1 上下文切换原理 10.2.2 切换函数的定义 10.2.3 切换函数的实现 10.2.4 切换函数的详细解释 10.2.5 上下文切换与陷阱帧 10.3 进程调度与进程表 10.3.1 进程的调度 10.3.2 进程表 10.4 进程的生成、退出与等待 10.4.1 进程的生成、退出与等待示例 10.4.2 创建子进程 10.4.3 进程退出与等待 10.5 进程的睡眠与唤醒 10.5.1 条件同步 10.5.2 空等问题 10.5.3 唤醒丢失问题 10.5.4 睡眠与唤醒函数的实现 10.6 进程让出与杀死进程 10.7 系统的初始进程 10.7.1 初始进程的建立 10.7.2 切换入初始进程 第11章 文件系统 11.1 概述 11.1.1 文件系统的功能 11.1.2 文件系统的分层 11.1.3 磁盘布局 11.2 磁盘层 11.2.1 磁盘初始化 11.2.2 磁盘中断处理 11.2.3 磁盘读写 11.3 块缓存层 11.3.1 缓冲块结构体 11.3.2 块缓存及其初始化 11.3.3 缓冲块读取 11.3.4 缓冲块写入与释放 11.3.5 缓冲块的使用 11.4 日志层 11.4.1 事务与日志 11.4.2 日志 11.4.3 日志的静态函数 11.4.4 日志的对外接口 11.4.5 事务的操作与实现 11.5 磁盘块管理 11.6 i节点 11.6.1 磁盘i节点 11.6.2 i节点及其锁 11.6.3 icache初始化与i节点更新 11.6.4 i节点的分配、获取、复制与释放 11.6.5 i节点的映射、截断、状态与读写 11.7 目录层 11.7.1 目录项 11.7.2 目录项查找 11.7.3 目录项链接 11.7.4 通过路径查找i节点 第12章 文件描述符与系统调用 12.1 文件描述符层 12.1.1 文件结构体 12.1.2 文件表及其初始化 12.1.3 文件分配、文件指针复制与关闭 12.1.4 文件状态与文件读写 12.2 系统调用层 12.2.1 文件系统调用 12.2.2 链接与删除链接 12.2.3 文件创建 12.2.4 文件打开 12.2.5 文件读写 12.2.6 管道 12.2.7 载入执行 第13章 exec()函数、管道与字符串 13.1 exec()函数 13.1.1 内核函数exec() 13.1.2 系统调用函数exec() 13.2 管道 13.2.1 管道结构体 13.2.2 管道的分配、关闭与读写 13.2.3 管道系统调用函数 13.3 字符串 第14章 多处理器 14.1 多处理器系统架构 14.2 多处理器配置的数据结构 14.2.1 多处理器环境与内存布局 14.2.2 mp结构体 14.2.3 MP配置表头 14.2.4 MP配置表表项 14.3 LAPIC 14.3.1 LAPIC的结构 14.3.2 LAPIC的寄存器 14.3.3 LAPIC ID与版本 14.3.4 ICR与AP启动 14.3.5 LAPIC计时器 14.3.6 伪中断 14.3.7 LVT与ICR 14.3.8 EOI与TPR 14.3.9 LAPIC可接收的中断源 14.4 I/O APIC 14.4.1 I/O APIC寄存器 14.4.2 I/O APIC寄存器访问 14.4.3 I/O APIC初始化与中断打开 第15章 字符设备驱动 15.1 键盘 15.1.1 键盘端口 15.1.2 扫描码 15.1.3 中断处理与驱动 15.2 控制台 15.2.1 控制台与文件读写 15.2.2 控制台输入 15.2.3 控制台输出 15.2.4 标准文件初始化 15.3 控制台输出示例 15.4 串口通信 15.4.1 UART硬件 15.4.2 UART端口 15.4.3 UART初始化 15.4.4 UART输入输出与中断处理 第16章 初始进程、API与Shell 16.1 初始进程 16.1.1 载入初始用户程序 16.1.2 初始用户程序init 16.2 API 16.2.1 API的定义和实现 16.2.2 接口函数使用示例 16.3 Shell 16.3.1 Shell概述 16.3.2 程序sh的主要功能 16.4 命令结构体及其构造与运行 16.4.1 命令 16.4.2 载入执行命令 16.4.3 重定向命令 16.4.4 管道命令 16.4.5 并列命令 16.4.6 后台命令 16.5 输入字符串的解析 16.5.1 命令解析 16.5.2 行解析 16.5.3 管道命令解析 16.5.4 重定向命令解析 16.5.5 块解析函数 16.5.6 载入执行命令解析 16.5.7 提取操作符 参考文献 附录A 缩略语与术语