第一章 概述
提纲 80386保护模式简介 Bochs简介 实验环境的搭建
80386保护模式简介 回顾实模式 实模式下的寄存器集合 寻址空间与寻址方式 通用寄存器 段寄存器 状态和控制寄存器 寻址空间 实际物理地址 = (段寄存器 << 4) + 偏移地址 MOV AX,ES:[1200H] CS=0x0000: IP=0x7c00 和CS=0x0700: IP=0x0c00 以及 CS=0x07c0: IP=0x0000所寻址的地址是完全相同的!
80386保护模式简介(续) 回顾实模式 实模式下的中断 中断向量表存放在物理内存开始的位置(0x0000---0x03ff) 总共最多可以有256个中断向量 00h---04h 号中断向量为系统专用 08h---0fh 硬件中断(8259A使用) 10h---1fh BIOS使用 20h---3fh DOS使用 如常用的 int 21h 40h---ffh 用户使用
80386保护模式简介(续) 一个实模式下用户程序的例子 各个段在物理上必须是连续的 装载程序在将程序装入时需要按照具体的装载位置设置CS、DS、SS
80386保护模式简介(续) 实模式系统存在的问题 安全性问题 分段机制本身的问题 程序采用物理地址来实现访存功能,而无法实现对任务的代码和数据的保护 一个程序可以通过改变段寄存器和偏移寄存器修改不属于自己的代码或者数据,甚至操作系统 分段机制本身的问题 段必须是连续的,从而无法利用零碎的空间 段的大小有限制,从而限制了代码的规模
80386保护模式简介(续) 保护模式带来的变化 保护模式下的寄存器 通用寄存器(从16位扩展到32位) 段寄存器(维持16位) EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP 段寄存器(维持16位) CS、DS、SS、ES、FS、GS 状态和控制寄存器(32位) EFLAGS、EIP、CR0、CR1、CR2、CR3 系统地址寄存器 GDTR、IDTR、TR、LDTR 调试与测试寄存器
80386保护模式简介(续) 8086的寄存器 80386的寄存器 通用寄存器 段寄存器 段描述符寄存器 状态和控制寄存器 系统地址寄存器 AX、BX、CX、DX、SP、BP、DI、SI EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP 段寄存器 CS、DS、SS、ES CS、DS、SS、ES、FS、GS 段描述符寄存器 无 对程序员不可见 状态和控制寄存器 FLAGS 、IP EFLAGS、EIP、CR0、CR1、CR2、CR3 系统地址寄存器 GDTR、IDTR、TR、LDTR 调试寄存器 DR0--DR7 测试寄存器 TR0--TR7
80386保护模式简介(续) 寻址方式的变化 在保护模式下,分段机制是利用一个称作段选择子的偏移量到全局描述符表中找到需要的段描述符,而这个段描述符中就存放着真正的段的物理首地址,然后再加上偏移地址量便得到了最后的物理地址。 一般保护模式段式寻址可用xxxx:yyyyyyyy表示。其中xxxx表示索引,也就是段选择子,是16位的;yyyyyyyy是偏移量,是32位的。 段选择子(xxxx)为段寄存器,如CS、DS、SS、ES、FS、GS;偏移量(yyyyyyyy)是一个32位寄存器,如ESI、EDI、EBP、ESP。
80386保护模式简介(续) 80386以及以后的处理器专门设计了一个寄存器GDTR(Global Descriptor Table Register),专门用于存储全局描述符表在内存中存放的位置。
80386保护模式简介(续) 段描述符 段基址为2,3,4,7字节,共32位。 段限长为0,1以及6字节的低四位,共20位,段限长即段最大长度,与属性G共同确定。G = 0时描述符中的20位段限长为实际段限长,最大限长为1MB(0-FFFFFh)。G = 1则 32位段限长为描述符中的20位乘以4KB,即段限长左移 12位后加上FFFH,最大限长为 4GB。 段描述符 每个描述符为8个字节(8×8=64位) 代码段和数据段的描述符
80386保护模式简介(续) 段描述符的属性 D/B:对于不同类型段含义不同。 在可执行代码段中,这一位叫做D位,D = 1使用32位地址和32/8位操作数,D = 0使用16位地址和16/8位操作数。 在向下扩展的数据段中,这一位叫做B位,B = 1段的上界为4GB,B = 0段的上界为64KB。 在描述堆栈段的描述符中,这一位叫做B位,B = 1使用32位操作数,堆栈指针用ESP,B = 0使用16位操作数,堆栈指针用SP。 AVL:Available and Reserved Bit,通常设为0。 P:存在位,P = 1表示段在内存中。 DPL:描述符特权级,取值0 ~ 3共4级。0特权级为最高,而3特权级为最低,表示访问该段时CPU所需处于的最低特权级,我们在后面会详细讨论特权级的问题。 S:描述符类型标志,S = 1表示代码段或者数据段;S = 0表示系统段(TSS、LDT)和门描述符。
80386保护模式简介(续) 描述符类型 TYPE和S结合使用,可以表示的描述符类型有:代码段、数据段、TSS、LDT、中断门(Interrupt Gate)、陷阱门(Trap Gate)、调用门(Call Gate)、任务门(Task Gate)。 当S = 1,TYPE < 8时 当S = 1,TYPE < 8时 TYPE 说明 十进制值 C R A 代码段 8 1 只执行 9 只执行,已访问 10 执行/读 11 执行/读,已访问 12 只执行,一致 13 只执行,一致,已访问 14 执行/读,一致 15 执行/读,一致,已访问 TYPE 说明 十进制值 E W A 数据段 只读 1 只读,已访问 2 读/写 3 读/写,已访问 4 只读,向下扩展 5 只读,向下扩展,已访问 6 读/写,向下扩展 7 读/写,向下扩展,已访问
80386保护模式简介(续) Hello world在实模式下的实现 Hello world在保护模式下的实现
80386保护模式简介(续) 保护模式下的中断管理 在保护模式中,中断的类型可以分为两种。一种是硬件中断(Interrupts),一种是软件中断(Exceptions),又称为异常。 其中硬件中断在系统中是由外部事件所引起的,如:一次I/O操作的结束。其产生与CPU当前所执行的指令没有关系。从是否能够被屏蔽来划分,可将其分为两类:可屏蔽中断与不可屏蔽中断。其中前者由CPU的INTR引脚接收信号,后者由NMI引脚接收信号。 我们可以通过CLI和STI指令来设置EFLAGS寄存器的IF位,如果这一位被清除,则CPU会禁止外部中断传递信号给INTR引脚,这样便屏蔽了可屏蔽中断,但是这对于NMI引脚不起作用,因此无法屏蔽不可屏蔽中断。 异常是在CPU执行指令期间遇到非法指令所产生的,根据是由是否可恢复和恢复点位置不同又可将异常划分为三种。它们是故障(Fault),陷阱(Trap)和中止(Abort)。 在保护模式下中断向量表的基地址存放在IDTR寄存器中;
80386保护模式简介(续) 安全性问题 x86平台CPU有0、1、2、3四个特权级,其中level0是最高的特权级,可以执行所有指令; 而level3则是最低的特权级,只能执行算术逻辑指令,很多特殊的操作(如CPU模式转换以及I/O操作指令)都不能在这个级别下进行。 现代操作系统在实际中往往只需使用到level0和level3两个特权级,具体的就是操作系统内核运行时系统处于level0(即CS寄存器的末两位为00),而用户程序运行是系统是处于level3的(即CS的末两位为11)。 将在第五章进行详细讲述。
Bochs简介 VMWare虚拟机系统(RHEL5.1 i386 Server)的安装、Bochs系统(bochs-20090704)的安装; 认识配置文件中参数的使用; 几个使用Bochs使用系统的例子。
Bochs简介(续) 利用Bochs做系统调试 常用调试命令 断点设置命令 c/continue 表示继续执行 s/step/stepi [count] 表示继续执行count条指令,如果没有设定count的值,则执行一条指令 Ctrl-C 停止执行,返回命令行 Ctrl-D 如果命令行此时是空的则退出Bochs模拟 q/quit/exit 退出调试和执行 断点设置命令 vb/vbreak seg:off 用虚拟地址来设置断点,其中seg表示段基址,而off是偏移地址 lb/lbreak addr 用线性地址来设置断点,addr表示线性地址 b/break/pb/pbreak addr 用物理地址来设置断点,addr表示物理地址
Bochs简介(续) 利用Bochs做系统调试 查看内存命令 查看信息的命令 x [/nuf] addr 查看当前内存某个地址的内容,其中addr代表线性地址 查看信息的命令 r/reg/regs/registers 列出CPU的所有寄存器以及它们的当前值 fp/fpu 列出所有FPU寄存器和他们的当前值 mmx 列出所有MMX寄存器和他们的当前值 sse 列出所有SSE寄存器和他们的当前值 sreg 显示段寄存器以及它们的内容 creg 显示控制寄存器以及它们的内容 info cpu 列出所有CPU寄存器和他们的当前值 info eflags 显示eflags寄存器的内容 info break 显示当前的断点信息
本章结束