科技
类型
9.0
豆瓣评分
可以朗读
语音朗读
1209千字
字数
2016-03-01
发行日期
展开全部
主编推荐语
全面讲解开发一个操作系统需要的技术和知识。
内容简介
本书共分16章,讲解了开发一个操作系统需要的技术和知识,主要内容有:操作系统基础、部署工作环境、编写MBR主引导记录、完善MBR错误、保护模式入门、保护模式进阶和向内核迈进、中断、内存管理系统、线程、输入输出系统、用户进程、完善内核、编写硬盘驱动程序、文件系统、系统交互等核心技术。本书适合程序员、系统底层开发人员、操作系统爱好者阅读,也可作为大专院校相关专业师生用书和培训学校的教材。
目录
- 版权信息
- 作者简介
- 内容提要
- 前言
- 第0章 一些你可能正感到迷惑的问题
- 0.1 操作系统是什么
- 0.2 你想研究到什么程度
- 0.3 写操作系统,哪些需要我来做
- 0.4 软件是如何访问硬件的
- 0.5 应用程序是什么,和操作系统是如何配合到一起的
- 0.6 为什么称为“陷入”内核
- 0.7 内存访问为什么要分段
- 0.8 代码中为什么分为代码段、数据段?这和内存访问机制中的段是一回事吗
- 0.9 物理地址、逻辑地址、有效地址、线性地址、虚拟地址的区别
- 0.10 什么是段重叠
- 0.11 什么是平坦模型
- 0.12 cs、ds这类sreg段寄存器,位宽是多少
- 0.13 什么是工程,什么是协议
- 0.14 为什么Linux系统下的应用程序不能在Windows系统下运行
- 0.15 局部变量和函数参数为什么要放在栈中
- 0.16 为什么说汇编语言比C语言快
- 0.17 先有的语言,还是先有的编译器,第1个编译器是怎么产生的
- 0.18 编译型程序与解释型程序的区别
- 0.19 什么是大端字节序、小端字节序
- 0.20 BIOS中断、DOS中断、Linux中断的区别
- 0.21 Section和Segment的区别
- 0.22 什么是魔数
- 0.23 操作系统是如何识别文件系统的
- 0.24 如何控制CPU的下一条指令
- 0.25 指令集、体系结构、微架构、编程语言
- 0.26 库函数是用户进程与内核的桥梁
- 0.27 转义字符与ASCII码
- 0.28 MBR、EBR、DBR和OBR各是什么
- 第1章 部署工作环境
- 1.1 工欲善其事,必先利其器
- 1.2 我们需要哪些编译器
- 1.2.1 世界顶级编译器GCC
- 1.2.2 汇编语言编译器新贵NASM
- 1.3 操作系统的宿主环境
- 1.3.1 什么是虚拟机
- 1.3.2 盗梦空间般的开发环境,虚拟机中再装一个虚拟机
- 1.3.3 virtualBox下载,安装
- 1.3.4 Linux发行版下载
- 1.3.5 Bochs下载安装
- 1.4 配置bochs
- 1.5 运行bochs
- 第2章 编写MBR主引导记录,让我们开始掌权
- 2.1 计算机的启动过程
- 2.2 软件接力第一棒,BIOS
- 2.2.1 实模式下的1MB内存布局
- 2.2.2 BIOS是如何苏醒的
- 2.2.3 为什么是0x7c00
- 2.3 让MBR先飞一会儿
- 2.3.1 神奇好用的$和$$,令人迷惑的section
- 2.3.2 NASM简单用法
- 2.3.3 请下一位选手MBR同学做准备
- 第3章 完善MBR
- 3.1 地址、section、vstart浅尝辄止
- 3.1.1 什么是地址
- 3.1.2 什么是section
- 3.1.3 什么是vstart
- 3.2 CPU的实模式
- 3.2.1 CPU的工作原理
- 3.2.2 实模式下的寄存器
- 3.2.3 实模式下内存分段由来
- 3.2.4 实模式下CPU内存寻址方式
- 3.2.5 栈到底是什么玩意儿
- 3.2.6 实模式下的ret
- 3.2.7 实模式下的call
- 3.2.8 实模式下的jmp
- 3.2.9 标志寄存器flags
- 3.2.10 有条件转移
- 3.2.11 实模式小结
- 3.3 让我们直接对显示器说点什么吧
- 3.3.1 CPU如何与外设通信—IO接口
- 3.3.2 显卡概述
- 3.3.3 显存、显卡、显示器
- 3.3.4 改进MBR,直接操作显卡
- 3.4 bochs调试方法
- 3.4.1 bochs一般用法
- 3.4.2 bochs调试实例
- 3.5 硬盘介绍
- 3.5.1 硬盘发展简史
- 3.5.2 硬盘工作原理
- 3.5.3 硬盘控制器端口
- 3.5.4 常用的硬盘操作方法
- 3.6 让MBR使用硬盘
- 3.6.1 改造MBR
- 3.6.2 实现内核加载器
- 第4章 保护模式入门
- 4.1 保护模式概述
- 4.1.1 为什么要有保护模式
- 4.1.2 实模式不是32位CPU,变成了16位
- 4.2 初见保护模式
- 4.2.1 保护模式之寄存器扩展
- 4.2.2 保护模式之寻址扩展
- 4.2.3 保护模式之运行模式反转
- 4.2.4 保护模式之指令扩展
- 4.3 全局描述符表
- 4.3.1 段描述符
- 4.3.2 全局描述符表GDT、局部描述符表LDT及选择子
- 4.3.3 打开A20地址线
- 4.3.4 保护模式的开关,CR0寄存器的PE位
- 4.3.5 让我们进入保护模式
- 4.4 处理器微架构简介
- 4.4.1 流水线
- 4.4.2 乱序执行
- 4.4.3 缓存
- 4.4.4 分支预测
- 4.5 使用远跳转指令清空流水线,更新段描述符缓冲寄存器
- 4.6 保护模式之内存段的保护
- 4.6.1 向段寄存器加载选择子时的保护
- 4.6.2 代码段和数据段的保护
- 4.6.3 栈段的保护
- 第5章 保护模式进阶,向内核迈进
- 5.1 获取物理内存容量
- 5.1.1 学习Linux获取内存的方法
- 5.1.2 利用BIOS中断0x15子功能0xe820获取内存
- 5.1.3 利用BIOS中断0x15子功能0xe801获取内存
- 5.1.4 利用BIOS中断0x15子功能0x88获取内存
- 5.1.5 实战内存容量检测
- 5.2 启用内存分页机制,畅游虚拟空间
- 5.2.1 内存为什么要分页
- 5.2.2 一级页表
- 5.2.3 二级页表
- 5.2.4 规划页表之操作系统与用户进程的关系
- 5.2.5 启用分页机制
- 5.2.6 用虚拟地址访问页表
- 5.2.7 快表TLB(Translation Lookaside Buffer)简介
- 5.3 加载内核
- 5.3.1 用C语言写内核
- 5.3.2 二进制程序的运行方法
- 5.3.3 elf格式的二进制文件
- 5.3.4 elf文件实例分析
- 5.3.5 将内核载入内存
- 5.4 特权级深入浅出
- 5.4.1 特权级那点事
- 5.4.2 TSS简介
- 5.4.3 CPL和DPL入门
- 5.4.4 门、调用门与RPL序
- 5.4.5 调用门的过程保护
- 5.4.6 RPL的前世今生
- 5.4.7 IO特权级
- 第6章 完善内核
- 6.1 函数调用约定简介
- 6.2 汇编语言和C语言混合编程
- 6.2.1 浅析C库函数与系统调用
- 6.2.2 汇编语言和C语言共同协作
- 6.3 实现自己的打印函数
- 6.3.1 显卡的端口控制
- 6.3.2 实现单个字符打印
- 6.3.3 实现字符串打印
- 6.3.4 实现整数打印
- 6.4 内联汇编
- 6.4.1 什么是内联汇编
- 6.4.2 汇编语言AT&T语法简介
- 6.4.3 基本内联汇编
- 6.4.4 扩展内联汇编
- 6.4.5 扩展内联汇编之机器模式简介
- 第7章 中断
- 7.1 中断是什么,为什么要有中断
- 7.2 操作系统是中断驱动的
- 7.3 中断分类
- 7.3.1 外部中断
- 7.3.2 内部中断
- 7.4 中断描述符表
- 7.4.1 中断处理过程及保护
- 7.4.2 中断发生时的压栈
- 7.4.3 中断错误码
- 7.5 可编程中断控制器8259A
- 7.5.1 8259A介绍
- 7.5.2 8259A的编程
- 7.6 编写中断处理程序
- 7.6.1 从最简单的中断处理程序开始
- 7.6.2 改进中断处理程序
- 7.6.3 调试实战:处理器进入中断时压栈出栈完整过程
- 7.7 可编程计数器/定时器8253简介
- 7.7.1 时钟—给设备打拍子
- 7.7.2 8253入门
- 7.7.3 8253控制字
- 7.7.4 8253工作方式
- 7.7.5 8253初始化步骤
- 7.8 提高时钟中断的频率,让中断来得更猛烈一些
- 第8章 内存管理系统
- 8.1 makefile简介
- 8.1.1 makefile是什么
- 8.1.2 makefile基本语法
- 8.1.3 跳到目标处执行
- 8.1.4 伪目标
- 8.1.5 make:递归式推导目标
- 8.1.6 自定义变量与系统变量
- 8.1.7 隐含规则
- 8.1.8 自动化变量
- 8.1.9 模式规则
- 8.2 实现assert断言
- 8.2.1 实现开、关中断的函数
- 8.2.2 实现ASSERT
- 8.2.3 通过makefile来编译
- 8.3 实现字符串操作函数
- 8.4 位图bitmap及其函数的实现
- 8.4.1 位图简介
- 8.4.2 位图的定义与实现
- 8.5 内存管理系统
- 8.5.1 内存池规划
- 8.5.2 内存管理系统第一步,分配页内存
- 第9章 线程
- 9.1 实现内核线程
- 9.1.1 执行流
- 9.1.2 线程到底是什么
- 9.1.3 进程与线程的关系、区别简述
- 9.1.4 进程、线程的状态
- 9.1.5 进程的身份证——PCB
- 9.1.6 实现线程的两种方式——内核或用户进程
- 9.2 在内核空间实现线程
- 9.2.1 简单的PCB及线程栈的实现
- 9.2.2 线程的实现
- 9.3 核心数据结构,双向链表
- 9.4 多线程调度
- 9.4.1 简单优先级调度的基础
- 9.4.2 任务调度器和任务切换
- 第10章 输入输出系统
- 10.1 同步机制——锁
- 10.1.1 排查GP异常,理解原子操作
- 10.1.2 找出代码中的临界区、互斥、竞争条件
- 10.1.3 信号量
- 10.1.4 线程的阻塞与唤醒
- 10.1.5 锁的实现
- 10.2 用锁实现终端输出
- 10.3 从键盘获取输入
- 10.3.1 键盘输入原理简介
- 10.3.2 键盘扫描码
- 10.3.3 8042简介
- 10.3.4 测试键盘中断处理程序
- 10.4 编写键盘驱动
- 10.4.1 转义字符介绍
- 10.4.2 处理扫描码
- 10.5 环形输入缓冲区
- 10.5.1 生产者与消费者问题简述
- 10.5.2 环形缓冲区的实现
- 10.5.3 添加键盘输入缓冲区
- 10.5.4 生产者与消费者实例测试
- 第11章 用户进程
- 11.1 为什么要有任务状态段TSS
- 11.1.1 多任务的起源,很久很久以前……
- 11.1.2 LDT简介
- 11.1.3 TSS的作用
- 11.1.4 CPU原生支持的任务切换方式
- 11.1.5 现代操作系统采用的任务切换方式
- 11.2 定义并初始化TSS
- 11.3 实现用户进程
- 11.3.1 实现用户进程的原理
- 11.3.2 用户进程的虚拟地址空间
- 11.3.3 为进程创建页表和3特权级栈
- 11.3.4 进入特权级3
- 11.3.5 用户进程创建的流程
- 11.3.6 实现用户进程—上
- 11.3.7 bss简介
- 11.3.8 实现用户进程—下
- 11.3.9 让进程跑起来—用户进程的调度
- 11.3.10 测试用户进程
- 第12章 进一步完善内核
- 12.1 Linux系统调用浅析
- 12.2 系统调用的实现
- 12.2.1 系统调用实现框架
- 12.2.2 增加0x80号中断描述符
- 12.2.3 实现系统调用接口
- 12.2.4 增加0x80号中断处理例程
- 12.2.5 初始化系统调用和实现sys_getpid
- 12.2.6 添加系统调用getpid
- 12.2.7 在用户进程中的系统调用
- 12.2.8 系统调用之栈传递参数
- 12.3 让用户进程“说话”
- 12.3.1 可变参数的原理
- 12.3.2 实现系统调用write
- 12.3.3 实现printf
- 12.3.4 完善printf
- 12.4 完善堆内存管理
- 12.4.1 malloc底层原理
- 12.4.2 底层初始化
- 12.4.3 实现sys_malloc
- 12.4.4 内存的释放
- 12.4.5 实现sys_free
- 12.4.6 实现系统调用malloc和free
- 第13章 编写硬盘驱动程序
- 13.1 硬盘及分区表
- 13.1.1 创建从盘及获取安装的磁盘数
- 13.1.2 创建磁盘分区表
- 13.1.3 磁盘分区表浅析
- 13.2 编写硬盘驱动程序
- 13.2.1 硬盘初始化
- 13.2.2 实现thread_yield和idle线程
- 13.2.3 实现简单的休眠函数
- 13.2.4 完善硬盘驱动程序
- 13.2.5 获取硬盘信息,扫描分区表
- 第14章 文件系统
- 14.1 文件系统概念简介
- 14.1.1 inode、间接块索引表、文件控制块FCB简介
- 14.1.2 目录项与目录简介
- 14.1.3 超级块与文件系统布局
- 14.2 创建文件系统
- 14.2.1 创建超级块、i结点、目录项
- 14.2.2 创建文件系统
- 14.2.3 挂载分区
- 14.3 文件描述符简介
- 14.3.1 文件描述符原理
- 14.3.2 文件描述符的实现
- 14.4 文件操作相关的基础函数
- 14.4.1 inode操作有关的函数
- 14.4.2 文件相关的函数
- 14.4.3 目录相关的函数
- 14.4.4 路径解析相关的函数
- 14.4.5 实现文件检索功能
- 14.5 创建文件
- 14.5.1 实现file_create
- 14.5.2 实现sys_open
- 14.5.3 在文件系统上创建第1个文件
- 14.6 文件的打开与关闭
- 14.6.1 文件的打开
- 14.6.2 文件的关闭
- 14.7 实现文件写入
- 14.7.1 实现file_write
- 14.7.2 改进sys_write及write系统调用
- 14.7.3 把数据写入文件
- 14.8 读取文件
- 14.8.1 实现file_read
- 14.8.2 实现sys_read与功能验证
- 14.9 实现文件读写指针定位功能
- 14.10 实现文件删除功能
- 14.10.1 回收inode
- 14.10.2 删除目录项
- 14.10.3 实现sys_unlink与功能验证
- 14.11 创建目录
- 14.11.1 实现sys_mkdir创建目录
- 14.11.2 创建目录功能验证
- 14.12 遍历目录
- 14.12.1 打开目录和关闭目录
- 14.12.2 读取1个目录项
- 14.12.3 实现sys_readdir及sys_rewinddir
- 14.13 删除目录
- 14.13.1 删除目录与判断空目录
- 14.13.2 实现sys_rmdir及功能验证
- 14.14 任务的工作目录
- 14.14.1 显示当前工作目录的原理及基础代码
- 14.14.2 实现sys_getcwd
- 14.14.3 实现sys_chdir改变工作目录
- 14.15 获得文件属性
- 14.15.1 ls命令的幕后功臣
- 14.15.2 实现sys_stat
- 第15章 系统交互
- 15.1 fork的原理与实现
- 15.1.1 什么是fork
- 15.1.2 fork的实现
- 15.1.3 添加fork系统调用与实现init进程
- 15.2 添加read系统调用,获取键盘输入
- 15.3 添加putchar、clear系统调用
- 15.4 实现一个简单的shell
- 15.4.1 shell雏形
- 15.4.2 添加Ctrl+u和Ctrl+l快捷键
- 15.4.3 解析键入的字符
- 15.4.4 添加系统调用
- 15.4.5 路径解析转换
- 15.4.6 实现ls、cd、mkdir、ps、rm等命令
- 15.5 加载用户进程
- 15.5.1 实现exec
- 15.5.2 让shell支持外部命令
- 15.5.3 加载硬盘上的用户程序执行
- 15.5.4 使用户进程支持参数
- 15.6 实现系统调用wait和exit
- 15.6.1 wait和exit的作用
- 15.6.2 孤儿进程和僵尸进程
- 15.6.3 一些基础代码
- 15.6.4 实现wait和exit
- 15.6.5 实现cat命令
- 15.7 管道
- 15.7.1 管道的原理
- 15.7.2 管道的设计
- 15.7.3 管道的实现
- 15.7.4 利用管道实现进程间通信
- 15.7.5 在shell中支持管道
- 参考文献
展开全部
出版方
人民邮电出版社
人民邮电出版社是工业和信息化部主管的大型专业出版社,成立于1953年10月1日。人民邮电出版社坚持“立足信息产业、面向现代社会、传播科学知识、服务科教兴国”,致力于通信、计算机、电子技术、教材、少儿、经管、摄影、集邮、旅游、心理学等领域的专业图书出版。