Win32汇编语言1---基础知识

80386处理器的工作模式

1.实模式

80386处理器以实模式启动,这时候各个寄存器以实模式初始化,80386处理器在实模式下的存储器寻址方式和8086一样,段寄存器的内容×16当作段基址,加上偏移地址形成最终的物理地址,这时候32根物理地址总线只使用了低20位,在实模式下,80386处理器不能对内存进行分页管理,所以指令寻址的地址就是内存中实际的物理地址,实模式下所有的段都是可读写的,执行的

实模式不支持优先级,它可以执行所有特权指令,包括读写控制寄存器CR0等,实际上,80386就是通过在实模式下初始化控制寄存器,GDTR,LDTR,IDTR和TR等管理寄存器以及页表,然后再通过加载CR0使其中的保护模式使能位置置位而进入保护模式,实模式下不支持硬件上的多任务切换。

实模式下的中断处理方式和8086一样,都是用中断向量表来定位中断服务程序地址,每四个字节组成一个中断向量,其中包括两个字节的段地址和两个字节的偏移地址


2.保护模式

  当80386工作在保护模式的时候,32根物理总线全部用上,物理寻址可以达到4GB,在保护模式下支持分页,提供了对虚拟内存的良好支持,支持多任务。

从实模式切换到保护模式是通过修改控制寄存器CR0的控制位PE(位0)来实现的,在这之前还需要建立保护模式必须的一些数据表,比如全局描述符表GDT和中断描述符表IDT

3.虚拟86模式

虚拟86模式是以任务形式在保护模式上执行的


windows的内存管理

80386中,2 的32次方等于4GB,所以不存在分段限制问题,是不是段就没有用处了呢?在保护模式下,一个地址空间是否可以被写入,可以被优先级多少的代码写入,是不是允许执行等涉及保护的问题就出来了。所以段寄存器这个时候就对地址空间定义一些安全上的属性,但是涉及安全的属性太多了,要用64位长的数据才能表示。我们把64位的属性数据叫做段描述符


80386的段寄存器是16位的,无法放下保护模式下的64位的段描述符,如何解决?

把所有段的段描述符顺序放在内存中的指定位置,组成一个段描述符表,而段寄存器中的16位用来做索引信息,指定这个段的属性用段描述符表中的第几个描述符来表示,这时候段寄存器中的信息就不再是段地址了,而是段选择器,可以通过它在段描述符表中“选择”一个项目以得到段的全部信息

段描述符表放在哪里呢?80386种引入了两个寄存器来管理段描述符表,一个是48位的全局描述符表GDTR,一个是16位的局部描述符表LDTR

GDTR指向全局描述符表GDT,包含所有任务都可使用的段描述符,通常包含描述操作系统的所有代码段,数据段和堆栈段的描述符及各任务的LDT段等,全局描述符表只有一个


LDTR指向局部描述符表LDTR,80386处理器设计每个任务都有独立LDT,包含每个任务私有的代码段,数据段和堆栈段,也包含该任务所使用的一些门描述符比如任务门和调用描述符门。

不同任务的局部描述符表分别组成不同的内存段,描述这些内存段的描述符当作系统描述符放在全局描述符表中,和GDTR直接指向内存地址不同,LDTR和CS,DS等段选择器一样只存放索引值,指向局部描述符表内存段对应的描述符在全局描述符表中的位置,随着任务的切换,只要改变LDTR的值,系统当前的局部描述符表LDT也随之切换,这样便于各任务之间数据的隔离,但GDT并不随着任务的切换而且换。

16位的段选择器只有高13位表示索引值,第0位,第1位表示程序当前的优先级,第2位T1位用来表示段描述符的位置,0表示GDT,1表示LDT


在保护模式下,xxxx:yyyyyyyy格式表示一个虚拟地址,单凭段选择器中的数值xxxx根本无法反映出段基址在什么地方,对于这个地址,首先要看xxxx的T1位是否为0,如果是的话,则先从GDTR寄存器中获取GDT的基址,然后再GDT中以段选择器xxxx的高13位当作位置索引得到段描述符,段描述符包含段的基址,限长,优先级等各种属性,就得到了段起始地址

如果T1位为1的话就更加复杂了,这表示段描述符在LDT中,首先还是从GDTR中获取GDT的基址,并且要从LDTR中获取LDT所在段的位置索引,然后以这个位置索引在GDT中得到LDT的位置,然后是用xxxx做索引从LDT段中获得段描述符,再以这个段描述符得到段的基址等信息,分别这个两种情况,基址加上段偏移地址yyyyyyyy,才得到最后的线性地址。




80386处理器把4KB大小的一块内存当作一‘页’内存,每页物理内存可以根据‘页目录’和‘页表’,随意映射到不同的线性地址上,这样,就可以将物理地址不连续的内存的映射连到一起,在线性地址上视为连续,在80386处理器中,除了CR3寄存器(指定当前页目录的地址)相关的指令使用的物理地址外,其他所有指令都是用线性地址寻址的

是否启用分页机制是由80386处理器新增的CR0寄存器的位31(PG位)决定的,为0不启用,这时候所有指令寻址的地址就是系统中实际的物理地址,为1的时候,启用内存分页管理,所有的线性地址都要经过页表的映射得到最后的物理地址。


页表规定的不仅是地址的映射,同时还规定了页的访问属性,是否可读可写可执行等。



80386的保护机制

1.段的类型检查--------由段描述符指定的,只要属性有是否可以读写,执行等,而cs,ds和ss等段选择器是否能装入某种类型的段描述符是有限制的,不可执行的段不能装入cs,不可读的段不能装入ds和es,不能写的段不能装入ss

2.页的类型检查--------在页表中也为每个页指定是否可读写,执行。ring0写的执行代码,所有的页都是可写的。

3.访问数据时的级别检查----优先级低的不可以访问高的

3.控制转移的检查---------jmp,call,ret,int等指令,优先级低的不能随便转移到优先级高的代码中

4.指令集的检查------有两类指令可以影响保护机制,第一类是改变GDT,LDT以及控制寄存器等关键寄存器的指令,称为特权指令,第二类是I/O端口等改变中断的指令,称为敏感指令。

5。I/O操作的保护

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【1】项目代码完整且功能都验证ok,确保稳定可靠运行后才上传。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 【2】项目主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 【3】项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 【4】如果基础还行,或热爱钻研,可基于此项目进行二次开发,DIY其他不同功能,欢迎交流学习。 【注意】 项目下载解压后,项目名字和项目路径不要用中文,否则可能会出现解析不了的错误,建议解压重命名为英文名字后再运行!有问题私信沟通,祝顺利! 基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值