Debug 是“调试”的意思,Debug 版本就是为调试而生的,编译器在生成 Debug 版本的程序时会加入调试辅助信息,并且很少会进行优化,程序还是“原汁原味”的。
你没听错,不是任何一个程序都可以调试的,程序中必须包含额外的辅助信息才能调试,否则调试器也无从下手。
Release 是“发行”的意思,Release 版本就是最终交给用户的程序,编译器会使尽浑身解数对它进行优化,以提高执行效率,虽然最终的运行结果仍然是我们期望的,但底层的执行流程可能已经改变了。
编译器还会尽量降低 Release 版本的体积,把没用的数据一律剔除,包括调试信息。
最终,Release 版本是一个小巧精悍、非常纯粹、为用户而生的程序。
实模式
保护模式
虚拟8086模式
保护模式由实模式中进入
重启切换三种模式
实模式和虚拟86模式都是为了向下兼容,而保护模式是对80386的主要支持模式
“640KB限制”---是指操作系统和系统程序只能用从500h到A0000h不到640kb的地址空间
由于8086中的地址线有20位,而寄存器的长度只有16位,也就是说无法直接找到一个想达到的物理地址。例如:要找寻一个2ffffh地址单元中的内容,使用一个16位寄存器最多到FFFFh,所以需要组合形成最终的线性地址(物理地址)。
DOS中的段寄存器用于组合形成物理地址,默认是对段寄存器乘以10h,(例如 SR*10h+偏移地址),从而构成20位寻址,达到遍及内存的目的
80386中的通用寄存器都是32位,也就是32位,可以直接遍历到所有的内存地址单元。所以段寄存器就不需要了吗?也不是,段寄存器在80386中发挥着间接作用。看下面:
由于保护模式下的段信息需要被保存,长度为64位,被叫做段描述符(Segment Descriptor)
于是80386中的段寄存器(16位),用于索引存放在内存其他地方中的段描述符,于是在386的操作中,更多的将它叫做段选择器
80386中引入了48位的GDTR和16位的LGTR,全局DT寄存器和局部DT寄存器
可以看到,GDT中还存有LDT的位置信息,所以如果描述符存在于LDT中的话,我们还需要先拿到LDT的基地址
。。。碎片化优化,提高内存的利用率。
就是操作系统中的分页机制,现下就是细节处理
页表与映射
CR3寄存器 用于保存页目录表页面的物理地址,因此被称为PDBR。由于目录是页对齐的,所以仅高20位有效,低12 位保留供更加高级的处理器使用。向CR3中装入一个新值时,低12位必须为0;但从 CR3中取值时,低12位被忽略
为什么是高20位有效?
每页4kb,这个和win32的虚拟模式有关,想想他是怎么欺骗8086程序的?同样只有20位内存单元,但内存单元缺扩大了4k倍
想想磁盘划分时,单位内存的大小是怎么实现的?==》放弃部分地址线的使用,间隔性的扩大
线性内存与物理内存的关系?【转】 物理内存和线性空间 - neba - 博客园 (cnblogs.com)
线性地址是在针对程序员来说的,就是说理论上是如此的。
分页-分段-段页式-缺页中断
每个程序都有自己4GB的寻址空间
为什么是4GB,不是8GB或者16GB呢?
这个是针对cpu最大的寻址空间来算的,也就是说如果是64位的寻址能力,其虚拟空间就是4GB*4GB了
不同应用的线性地址空间是隔离的,但物理上是处于同一个内存区
DLL程序都是被插入到主程序中执行的,所以没有自己独有的空间,当他被插入时,也就算是主程序的一部分了
中断和异常
DOS中使用中断向量表 int 3 >找到3号中断向量(4B)》前两个字节作为基地址,后两个地址作为偏移地址,从而获得中断入口
一个中断或异常程序的信息使用8B进行存贮,于是采用中断描述符以及对应的中断描述符表(Interrupt Descriptor Table)
引入48位IDTR,高32位表示向量表的入口地址,低16位表示长度,也就是说
门的概念
就是在对高级别程序代码进行访问时,规定了访问入口
指令集的检查
1.特权指令--能改变GDTR,LDTRIDTR等关键寄存器的指令--只允许优先级0运行
2.敏感指令--操作IO端口以及CLI STI等中断允许的指令(CLI Clear Interrupt | STI Start Interrupt--eflags寄存器IOPL位高于规定的优先级即可以执行
IO处理保护
MMU 内存管理单元 https://gitlib.com/page/pc-mmu.html
手机扫一扫
移动阅读更方便
你可能感兴趣的文章