[李忠老师从实模式到保护模式] 第11-13章总结

第11章 32位x86处理器编程编程架构

16位处理器内存寻址与32位处理器内存寻址

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

16位或32位寄存器上,都不允许用栈指针寄存器sp进行内存寻址,但是32位处理器上允许用ESP进行内存寻址.

流水线模式

在这里插入图片描述
流水线模式其目的是尽可能让每个硬件设备保持繁忙的状态来增加计算机工作效率.

乱序执行

将每个指令拆分成更细的操作步骤,拆分后就有更大的优化空间.比如push eax可以拆分成:

sub esp,4
mov [esp],eax

那么如果[esp]正在被使用,处理器就可以先执行完sub操作.

寄存器重命名技术

处理器层面做的优化之一.假设某个程序的每个程序段都大量使用了eax寄存器,但每个程序段的逻辑都彼此独立.那么就可以把eax重命名为其他名字,这样就不用等待上个程序段执行结束后再顺序执行下个程序段,转而变成并行执行的方式.
把重命名的寄存器值赋值给真正的寄存器的操作称为:引退(Retirement).

分支目标预测技术

当处理器遇到转移指令时,需要清空(flush)流水线.在CPU内部,有个称为分支目标缓存器(Branch Target Buffer, BTB)来记录当前指令的地址,分支目标的地址,本次分支预测的结果.等待处理器执行到这条语句时,先查找BTB看看是否有对应的记录,若有则直接把上次结果的分支送入流水线.如果查找到的结果和真实执行的不对应了,清空流水线和BTB.
分支目标预测技术主要运用了时间局部性原理,最佳的例子就是循环语句,上次在循环内执行的代码下次很大概率还会执行.

第12章 进入保护模式

全局描述符表GDT和全局描述符表寄存器GDTR

在这里插入图片描述

问题: GDTR如图,请问GDT存放在内存中的哪个位置?这个GDT存放了多少个几个描述符?
在这里插入图片描述
存放在0x7e00处,结束地址是0x7e00+0x200-1=0x7fff.
段描述符需要8Bytes,所以0x200 / 8 = 0x40 = 512个描述符

描述符表的作用是: 作为代码段/数据段/过程入口信息/…的地址索引
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
X=0,代表段是不可执行的,是数据段,此时后面三个位是:

  • E(Expand,栈向上扩展还是向下扩展,注意这里是扩展方向不是推进方向,栈的推进方向只能是高地址向低地址推进)
  • W:是否可写
  • A:最近是否访问,这个访问时置1. 至于什么时候置0是操作系统负责的. 操作系统可以根据这个位来判断什么段不经常使用,可以放回磁盘上.
    在这里插入图片描述
    X=1是可执行的,即代码段.
  • C: 依存性,C=0即只有相同的DPL(描述符特权级,Descriptor Privilege Level)的程序才可以转到这个段内执行,C=1则是低DPL的代码段也可以转到这个段内执行. 此位通常是0
  • R: 该代码段是否允许读出(代码段总是不可写入的). R=0则不能读出,若尝试读出,会引发处理器中断.R=1则可以读出,则这个代码段可以当做ROM使用. 注意,这里是否可读指的是用户程序,而非处理器读指令.
  • A:同上

在这里插入图片描述
G=1时,有图中的公式来计算段界限

          ;代码清单12-1
         ;文件名:c12_mbr.asm
         ;文件说明:硬盘主引导扇区代码
         ;创建日期:2011-5-16 19:54;修改于2022-02-16 11:15

         ;设置堆栈段和栈指针
         mov ax, cs
         mov ss, ax
         mov sp, 0x7c00

		 ;
		 ;描述符表的作用是:
		 ;作为代码段/数据段/过程入口信息/...的地址索引
		 ;
         ;计算GDT所在的逻辑段地址(存放在ds),和段偏移地址(存放在bx)
		 ;0x7c00是主引导程序的起始地址,那么GDT(双字)的逻辑地址就是:
		 ;cs:gdt_base(主引导扇区程序起始地址(vstart=0)的相对偏移地址) + 0x7c00(主引导扇区程序加载的地址)
		 ;
         mov ax, [cs: gdt_base + 0x7c00]              ;低16位
         mov dx, [cs: gdt_base + 0x7c00 + 0x02]       ;高16位
         mov bx, 16
         div bx
         mov ds, ax                                   ;令DS指向该段以进行操作
         mov bx, dx                                   ;段内起始偏移地址

         ;创建0#描述符,它是空描述符,这是处理器的要求
         mov dword [bx+0x00],0x00
         mov dword [bx+0x04],0x00

		 ;
         ;创建#1描述符,保护模式下的数据段描述符(文本模式下的显示缓冲区)
		 ;安装的双字值,根据P211 图12-4解析后就可以知道有如下信息:
		 ;数据段,向上扩展,可写,基地址=0xb8000,界限=0xFFFF(大小64KB),G=0,P=1,特权级=0
		 ;
		 ;为什么保护模式下需要安装段描述符?
		 ;GDT的作用就是用来索引各个段的cs:ip,所以在保护模式下想让段被索引到
		 ;并且根据设置的段特性来工作,就要在GDT上登记段的信息
		 ;从这点我们也可以知道为什么称为保护模式了
		 ;要做什么操作,先从GDT上查找段是否存在,段是否允许这种操作,这就提高了安全性
		 ;
         mov dword [bx+0x08],0x8000ffff
         mov dword [bx+0x0c],0x0040920b

         ;初始化描述符表寄存器GDTR
		 ;填写gdt的界限值,gdt地址是双字,所以其界限是总字节数16减1
         mov word [cs: gdt_size+0x7c00],15            ;描述符表的界限(总字节数减一)

		 ;加载描述符表的线性基地址和界限到GDTR(共6个字节48bits)
		 ;前4个字节是GDT的线性地址,后2个字节是GDT的界限值,lgdt不影响任何标志位
         lgdt [cs: gdt_size+0x7c00]

		 ;打开A20目的是兼容8086的程序,是个历史包袱,只要记得打开就行
         in al,0x92                                   ;南桥芯片内的端口
         or al,0000_0010B
         out 0x92,al                                  ;打开A20

		 ;
		 ;这里关中断的原因和之前的完全不同:
		 ;之前关中断的原因通常是因为要设置中断向量表,担心设置到一半的时候发生了这个中断
		 ;但这里是因为保护模式的中断机制和实模式的完全不同
		 ;设置了PE位后会进入保护模式,于此同时我们的这个程序中没有建立保护模式的中断机制
		 ;如果此时响应了中断,进入了实模式的中断例程,那么会出现问题
		 ;所以必须要等待保护模式的中断建立完成后才能开启中断
		 ;同理,BIOS中断机制也不能再用了
		 ;
		 ;提一下所谓的保护模式中断机制和实模式中断机制
		 ;实模式中断是根据0(中断向量表起始地址)+4N(N是中断号)来查找cs:ip
		 ;能这么查找的原因是因为逻辑地址就是物理地址
		 ;
		 ;那么保护模式不能这么搞的原因也呼之欲出了,即逻辑地址不是物理地址,中间要进行转换
		 ;
         cli                                          ;保护模式下中断机制尚未建立,应
                                                      ;禁止中断
		 ;
		 ;将CR0寄存器的PE(Protection Enable,保护模式允许)位(第1位,位0)置1使得CPU进入保护模式
		 ;这步完成后,我们正式进入了保护模式....Woohoo...
		 ;
         mov eax,cr0
         or eax,1
         mov cr0,eax                                  ;设置PE位

         ;以下进入保护模式... ...
		 ;将描述符选择子0x0008传送到段选择器DS中
		 ;从选择子对应的二进制(00000000000_01_000B)可知:
		 ;指定的描述符索引号为1,指定的描述符表是GDT,请求特权级RPL是00
         mov cx,00000000000_01_000B                   ;加载数据段选择子(0x08)
         mov ds,cx

         ;以下在屏幕上显示"Protect mode OK."
         mov byte [0x00],'P'
         mov byte [0x02],'r'
         mov byte [0x04],'o'
         mov byte [0x06],'t'
         mov byte [0x08],'e'
         mov byte [0x0a],'c'
         mov byte [0x0c],'t'
         mov byte [0x0e],' '
         mov byte [0x10],'m'
         mov byte [0x12],'o'
         mov byte [0x14],'d'
         mov byte [0x16],'e'
         mov byte [0x18],' '
         mov byte [0x1a],'O'
         mov byte [0x1c],'K'
         mov byte [0x1e],'.'

         hlt                                          ;已经禁止中断,将不会被唤醒

;-------------------------------------------------------------------------------

		 ;gdt起始地址是随意定的,但不要超出16位实模式下的1MB地址空间范围[0,0xfffff]
         gdt_size         dw 0
         gdt_base         dd 0x00007e00               ;GDT的物理地址

         times 510-($-$$) db 0
                          db 0x55,0xaa

在这里插入图片描述

从sreg命令的输出可以看到在刚加电执行bios后的0x7c00时,gdtr就建立好了.这个gdtr是bios建立的,因为bios需要检测内存,为了检测1MB以上的内存空间,就必须进入保护模式,也就必须建立gdtr.
但是从creg命令输出可以看到,pe位是0,那么就是bios从保护模式又退回了实模式.
PE位置1后,可以看到creg输出,已经进入了保护模式.
在这里插入图片描述

保护模式的内存访问

32位模式下的段选择器,其中描述符高速缓存器是不可见的:
在这里插入图片描述
在这里插入图片描述
gdt中可以有8192个描述符,因为有13位
TI=0,描述符索引在gdt中,TI=1则在LDT中
RPL是特权级

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

寻址方式: 实模式 vs. 保护模式

以如下程序为例:

mov ax,[bx]
  1. 实模式下,是物理地址=ds*16+bx
  2. 保护模式下,ds充当段选择子,gdt[段选择子ds] -> 索引到段描述符 -> 段描述符加载到描述符高速缓冲器 -> 物理地址=段描述符中的基地址信息 + bx

学会用intel手册来转换汇编指令和机器码 (课时166)

举例:
在这里插入图片描述
https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html

Intel® 64 and IA-32 Architectures Software Developer’s Manual Combined Volumes 2A, 2B, 2C, and 2D: Instruction Set Reference, A- Z

  1. 手册2 P43 table 2-1中查找mod reg r/m 的二进制值,并填写在D/E/F列,D/E/F列结合的BCD码就是G列的值
  2. 手册2 P769 MOV指令中查找对应指令的二进制值,填写在C列
  3. 将C/G列结合,就得到A列的机器码的值
  4. 注意,MOV指令中opcode最后有 /r,就代表F列的操作数既可以对内存,又可以对寄存器
  5. 注意,MOV指令中opcode最后有 /0,就代表操作码扩展部分是0, 此时E列直接填写000即可
  6. 注意,Table 2-1中有Value Of ModR/M Byte,可以通过x/y轴来快速定位到对应的 mod reg , r/m 对应的机器码是多少.举例如下图:
  7. 注意,Table 2-1中有dispX,是立即数,[BX]+disp8 -> [bx+imm8] -> 如mov ax,[bx+3] 对应的机器码是 B8 47 03 , 其中03就是立即数的值
  8. 可以尝试多找几个不同的指令算算
    在这里插入图片描述
    在这里插入图片描述

x86处理器指令格式

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值