Assembly: x86保持模式
- TAGS: Assembly
保持模式
主要内容
- 中断和动态时钟显示
- 32 位 x86 处理器编程架构
- 进入保护模式
- 指令的格式及其操作尺寸
- 存储器的保护
- 保持模式程序的动态加载和执行
- 用户程序编程接口及其实现
- 任务和任务的创建
- 特权级和特权级保护
- 协同式任务切换
- 中断和异常的处理与抢占式多任务
- 分布和动态页分配
- 平坦模型
中断和动态时钟显示
主要内容
- 中断和硬件中断
- 中断控制器简介
- 中断号、中断处理过程和中断向量表
- 实时时钟、CMOS RAM和BCD编码
- 实时时钟芯片的中断信号
- 安装0x70号中断处理过程
- 启用更新周期结束中断
- 用TEST指令等待更新周期结束
- 读取BCD码的时间并在屏幕上显示
- 用NOT指令反转时间分隔符的颜色
- 使用IRET指令从中断过程返回
- 用停机指令HLT使处理器进入低功耗状态
- 内部中断和软中断
- BIOS中断概述
- 使用BIOS功能调用接收并显示键盘输入
- 练习
32 位 x86 处理器编程架构
主要内容
- IA-32架构和保护模式
- 寄存器的扩展和扩充
- 32位处理器的内存访问概况
- 32位处理器的寻址方式概况
- 选修-流水线技术
- 选修-高速缓存技术
- 选修-乱序执行技术
- 选修-寄存器重命名技术
- 选修-分支目标预测技术
进入保护模式
主要内容
- 保护模式是要保护什么
- 全局描述符表GDT和全局描述符表寄存器GDTR
- 准备创建全局描述符表
- 描述符的分类
- 存储器的段描述符-段的类型和基地址
- 存储器的段描述符-段界限及访问控制位
- 安装存储器的段描述符
- 加载全局描述符表寄存器GDTR
- 开启处理器的第21根地址线A20
- 通过设置寄存器CR0的PE位进入保护模式
- 描述符高速缓存器和保护模式下的内存访问
- 在调试器中观察实模式和保护模式的内存访问
指令的格式及其操作尺寸
主要内容
- 80286的16位保护模式
- 16位处理器的指令操作尺寸
- 32位处理器的指令操作尺寸
- x86的指令格式-操作码和立即数部分
- x86的指令格式-ModRM和偏移量部分
- x86的指令格式-SIB部分
- x86的指令格式-指令前缀部分
- 处理器的默认操作尺寸和相关指令前缀
- 用伪指令bits生成16位和32位模块
- 描述符和段描述符高速缓存器的D位
- 进入保护模式后立即切换到32位模块并使用32位默认操作尺寸
存储器的保护
主要内容
- 话说MOV DS,AX和MOV DS,EAX
- 修改段寄存器时的保护
- 代码段执行时的保护
- 用向上扩展的段做为栈段
- 向上扩展的段用做栈段时的保护
- 访问普通数据段时的保护
- 内存线性地址的回绕特性
- 用向下扩展的段做为栈段
- 向下扩展的段用做栈段时的保护
- 通过别名来实现段的共用和共享
- 冒泡排序法的基本原理
- 32位操作尺寸下的LOOP指令
- 数据交换指令XCHG
保持模式程序的动态加载和执行
主要内容
- 本章的目标和内容提要
- 内核的结构和加载前的准备工作
- 准备为内核的每个段创建和安装描述符
- 段描述符的创建和BSWAP指令
- 进入内核执行
- 进入内核后显示文本信息
- 用CPUID指令取得处理器品牌信息并显示
- 准备加载用户程序
- 预读用户程序并得到它的大小
- 条件传送指令簇CMOVcc
- 计算以512字节为单位的用户程序总长度
- 内存分配的基本策略和方法
- 内存分配的简易实现过程
- 加载用户程序
- 准备安装用户程序的段描述符
- 用SGDT和MOVZX指令确定GDT的位置
- 安装新描述符并生成选择子
- 安装用户程序的段描述符并回填选择子
- 用户程序的执行和退出
- 在虚拟机上观察内核的加载以及用户程序的执行与退出
用户程序编程接口及其实现
主要内容
- 内核与用户程序之间的栈切换问题
- 在内核中为用户程序提供编程支持
- 用户程序中的符号地址检索表
- 内核程序中的符号地址检索表
- 串比较指令CMPS
- 串比较的方向和重复前缀
- 使用外循环依次取得用户SALT表的每个条目
- 使用内循环依次取得内核SALT表的每个条目并进行比较
- 在用户程序内使用内核编程接口读硬盘和显示文本
- 在虚拟机上验证程序的执行
- 以十六进制形式显示一个双字以及PUSHAD、POPAD和XLAT指令的使用
任务和任务的创建
主要内容
- 任务:概念和组成
- 使用任务控制块保存任务基本信息
- 将任务控制块加入任务控制块链表
- 通过栈传递例程参数以及立即数的压栈指令
- 段寄存器的压栈和出栈以及栈的随机访问机制
- 创建任务的局部描述符表LDT
- 在当前任务的LDT中安装描述符
- LDT描述符的格式和LDT描述符的创建
- 创建任务状态段TSS
- TSS描述符的格式和TSS描述符的创建
- 用带参数的RET指令返回调用者
- 加载任务寄存器TR和局部描述符表寄存器LDTR
- 在虚拟机上验证任务的执行
特权级和特权级保护
主要内容
- 特权级保护的必要性和特权保护机制
- 当前特权级CPL
- 描述符特权级DPL
- 任务公共部分和私有部分的特权级划分
- 依从的代码段
- 门描述符和调用门
- 本章程序说明及特权级检查的时机
- 请求特权级RPL
- 请求特权级调整指令ARPL
- 一般情况下的请求特权级设置
- 为内核接口例程创建调用门
- 调用门的测试和调用门转移过程
- 通过调用门实施低特权级到高特权级的转移
- 通过调用门转移控制时的栈切换过程
- 通过调用门转移控制并返回的完整描述
- 创建0、1和2特权级的栈并登记在TSS中
- 通过模拟调用门返回进入用户程序执行
协同式任务切换
主要内容
- 多任务和任务切换概述
- 内核任务的创建和I/O特权级IOPL
- I/O特权级的修改和POPF指令
- 任务的用户态和内核态
- I/O许可位串和TSS的I/O许可位映射区
- 任务切换的方法及内核任务的确立
- 用户任务的创建和初始化
- 简单的任务调度和切换策略
- 遍历TCB链表寻找忙任务和就绪任务
- 通过JMP FAR执行任务切换的过程
- 内核任务与用户任务轮流执行的过程
- 任务的终止和清理
中断和异常的处理与抢占式多任务
主要内容
- 中断和异常概述
- 保护模式下中断和异常的向量分配
- 中断描述符表、中断门和陷阱门
- 程序介绍
- 创建并安装全部的256个中断门
- 为实时时钟中断创建和安装中断门
- 加载中断描述符表寄存器IDTR
- 重新设置8259A主片的中断向量
- 中断和异常发生时的特权级检查
- 中断和异常发生时的栈切换过程
- 在中断处理过程中实施任务切换(含NOP指令的介绍)
- 抢占式多任务的执行效果演示
分布和动态页分配
主要内容
- 保护模式下的段式虚拟内存管理
- 每个任务独立的虚拟内存
- 物理内存的分页以及段到页的拆分
- 处理器的段部件和页部件
- 从线性地址到物理地址的转换过程
- 页目录和页表及其地址转换过程
- 设计内核的页目录和页表
- 页目录项和页表项的组成格式
- 创建内核的页表并初始化低端1MB对应的页表项
- 设置控制寄存器CR3和CR0开启分页功能
- 在调试器中观察页目录表和页表
- 准备将内核映射到虚拟内存的高端
- 在分页机制下访问页目录表自身
- 使内核在虚拟内存高端的映射生效
- 为内核任务创建任务控制块TCB
- 为内核任务的TSS分配内存空间
- 处理与线性地址对应的页目录项和页表项
- 根据需要分配物理页并设置页表项
- 物理内存的页面管理和页映射位串
- 空闲页的搜索和BTS指令
- 空闲页搜索和分配的具体过程
- 确立内核任务并开始创建用户任务
- 用户任务的内存分配策略
- 清空内核任务页目录表的前半部分并刷新TLB
- 为用户任务分配内存并创建LDT
- 用户程序的加载和重定位
- 用户任务页目录表的创建和访问以及INVLPG指令
- 第二个用户任务的创建和分页模式下的任务切换
- 分页模式下多任务切换的演示和调试
平坦模型
主要内容
为什么要引入平坦模型及平坦模型的特点 在主引导程序中创建平坦模型下的段 平坦模型对内核程序分段的影响 平坦模型对加载内核程序的影响 平坦模型下的内核初始化与内核任务的确立 平坦模型下的用户程序结构 平坦模型下的用户任务创建 在用户任务内动态分配内存 平坦模型下的多任务切换演示与调试