操作系统真象还原

操作系统真象还原

查阅电子书
手机扫码
  • 微信扫一扫

    关注微信公众号

编辑推荐

全面讲解开发一个操作系统需要的技术和知识。

内容简介

本书共分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中支持管道

参考文献

操作系统真象还原是2016年由人民邮电出版社出版,作者郑钢。

得书感谢您对《操作系统真象还原》关注和支持,如本书内容有不良信息或侵权等情形的,请联系本网站。

你可能喜欢
Go语言程序设计项目化教程(微课版) 电子书
本书切合现代职业教育计算机类专业教学实际,围绕电商平台开发案例予以深入浅出的项目化设计,夯实读者Go语言基础语法知识点的同时,强化其应用Go语言解决实际工程应用问题的能力,为“零基础”的读者提供全面的Go语言学习入门指导和综合应用实践。本书覆盖Go语言的核心语法和特色功能应用,主要内容包括熟悉Go语言开发环境、学习Go语言基础语法、掌握Go语言函数应用、理解Go语言面向对象、体会Go语言高级特性、
数字信号处理及应用学习指导与习题解析(微课版) 电子书
本书系工业和信息化部“十四五”规划教材、国家级一流本科课程配套教材《数字信号处理及应用(第2版)(微课版)》(ISBN:978-7-115-57889-1,简称主教材)的配套教辅。全书内容分为三大部分:第1部分为与主教材各章对应的学习指导与习题解析;第2部分为数字信号处理中的复杂工程问题案例;第3部分为模拟试卷及详解。本书注重对知识点的体系化介绍,重视理论知识在工程实践中的应用,采用传统教辅书与新
深度强化学习实战 电子书
详解深度强化学习,从入门到实战。
深入浅出Spring Boot 3.x 电子书
全方位讲解Spring Boot 3.x技术。
Linux常用命令自学手册 电子书
一本快速自学Linux常用命令的工具书。