zoukankan      html  css  js  c++  java
  • Win32汇编--02必须了解的基础知识

    80x86 处理器的工作模式
    实模式
    保护模式
    虚拟8086模式

    Windows 的内存管理机制
    Dos 操作系统的内存安排情况
    80386 的内存寻址机制
    80386 的内存分页机制
    Windows 的内存安排
    从Win32 汇编的角度看内存寻址

    Windows 的特权保护机制
    80386 的中断和异常
    80386 的保护机制
    Windows 的保护机制

    80x86 处理器的工作模式
    这是我们需要了解的一些基础知识,无论学习哪门编程语言,只要在Windows 下编程,这些不能不知 _

    80386以后的处理器有 3 种工作模式:实模式、保护模式和虚拟8086模式。
    其实,实模式和虚拟8086模式是为了向下兼容而设置的。而保护模式是我们的主角,是我们现代系统实际上的工作模式。
    只有在保护模式下,32位CPU的寻址才能达到4GB的地址空间,同时,也能实现多任务、内存分页管理和优先级保护等先进的机制。

    Windows7的启动过程
    1、开启电源  
    计算机系统将进行加电自检(POST)。如果通过,之后BIOS会读取主引导记录(MBR)——被标记为启动设备的硬盘的首扇区,并传送被Windows 7建立的控制编码给MBR。

    注:硬盘的0磁道的第一个扇区称为MBR,它的大小是512字节,而这个区域可以分为两个部分。第一部分为pre-boot区(预启动区),占446字节;

    第二部分是Partition table区(分区表),占66个字节,该区相当于一个小程序,作用是判断哪个分区被标记为活动分区,然后去读取那个分区的启动区,并运行该区中的代码。

    MBR他是不属于任何一个操作系统,也不能用操作系统提供的磁盘操作命令来读取它。但我们可以用ROM-BIOS中提供的INT13H中断的2号功能来读出该扇区的内容。(介绍BIOS指令)

    2、启动菜单生成
    Windows启动管理器读取“启动配置数据存储(Boot Confi guration Data store)中的信息。此信息包含已被安装在计算机上的所有操作系统的配置信息。并且用以生成启动菜单。  

    当您在启动菜单中选择下列动作时:  
    如果您选择的是Windows 7,Windows 启动管理器(Windows Boot Manager)运行%SystemRoot%System32文件夹中的OS loader —— Winload.exe。  

    如果您选择的是自休眠状态恢复Windows 7,那么启动管理器将装载Winresume.exe并恢复您先前的使用环境。 

    如果您在启动菜单中选择的是早期的Windows版本,启动管理器将定位系统安装所在的卷,并且加载Windows NT风格的早期OS loader(Ntldr.exe)——生成一个由boot.ini内容决定的启动菜单。 

    3、核心文件加载及登录
    Windows7启动时,加载其核心文件 Ntoskrnl.exe和 hal.dll —— 从注册表中读取设置并加载驱动程序。

    接下来将运行Windows会话管理器(smss.exe)并且启动 Windows启动程序(Wininit exe),本地安全验证(Lsass.exe)与服务(services.exe)进程,完成后,您就可以登录您的系统了。


    实模式
    处理器被复位或者加电的时候以实模式启动。
    这时候处理器中各寄存器以实模式的初始化值工作。

    80386处理器在实模式下的存储器寻址方式和8086是一样的,由段寄存器的内容乘以 16当做基地址,加上段内的偏移地址形成最终的物理地址,这时候它的32位地址线只使用了低20位。

    在实模式下,80386处理器不能对内存进行分页管理,所以指令寻址的地址就是内存中实际的物理地址。在实模式下,所有的段都是可以读、写和执行的。
    实模式下80386不支持优先级,所有的指令相当于工作在特权级(优先级0),所以它可以执行所有特权指令,包括读写控制寄存器CR0等。

    实际上,80386就是通过在实模式下初始化控制寄存器,GDTR,LDTR,IDTR与TR等管理寄存器以及页表,然后再通过加载CR0使其中的保护模式使能位置位而进入保护模式的。当然,实模式下不支持硬件上的多任务切换。
    实模式下的中断处理方式和8086处理器相同,也用中断向量表来定位中断服务程序地址。

    中断向量表的结构也和8086处理器一样:每4个字节组成一个中断向量,其中包括两个字节的段地址和两个字节的偏移地址。

    从编程的角度看,除了可以访问80386新增的一些寄存器外,实模式的80386处理器和8086有什么进步呢?
    其实最大的好处是可以使用80386的32 位寄存器,用32位的寄存器进行编程可以使计算程序更加简捷,加快了执行速度。
    比如在8086时代用16位寄存器来完成32位的乘法和除法时,要进行的步骤实在是太多了,现在用32位寄存器一条指令就可以完成。

    80386中增加的两个辅助段寄存器FS和GS在实模式下也可以使用,这样,同时可以访问的段达到了6个而不必考虑重新装入的问题;最后,很多80386的新增指令也使一些原来不很方便的操作得以简化。


    保护模式
    当 80386工作在保护模式下的时候,它的所有功能都是可用的。这时80386所有的32根地址线都可供寻址,物理寻址空间高达4GB。

    在保护模式下,支持内存分页机制,提供了对虚拟内存的良好支持。虽然与8086可寻址的1 MB物理地址空间相比,80386可寻址的物理地址空间可谓很大,但实际的微机系统不可能安装如此大的物理内存。所以,为了运行大型程序和真正实现多任务,虚拟内存是一种必需的技术。
    保护模式下80386支持多任务,可以依靠硬件仅在一条指令中实现任务切换。任务环境的保护工作是由处理器自动完成的。

    在保护模式下,80386处理器还支持优先级机制,不同的程序可以运行在不同的优先级上。

    优先级一共分0~3 共 4个级别,操作系统运行在最高的优先级0上,应用程序则运行在比较低的级别上。
    配合良好的检查机制后,既可以在任务间实现数据的安全共享也可以很好地隔离各个任务。从实模式切换到保护模式是通过修改控制寄存器CR0的控制位PE(位0)来实现的。在这之前还需要建立保护模式必需的一些数据表,如全局描述符表GDT和中断描述符表IDT等。

    DOS操作系统运行于实模式下,而Windows操作系统运行于保护模式下。


    虚拟8086模式
    虽说实模式兼容以前的系统,但是设想一下,如果Windows或80386处理器推出的时候宣布不能运行以前的MS-DOS程序,那么就等于放弃了一个巨大的软件库,Windows以及80386处理器可能就会落得和苹果机一样的下场,这是Microsoft 和Intel都不愿看到的。
    举个简单的例子,当你正兴高采烈地计划利用80386多任务并行的特性,边欣赏《小甲鱼大战仓小姐》的大片边完成小甲鱼的编程作业时,发觉原来的文档要用到原来的系统才能打开……
    由于这种特殊需求的普遍性,虚拟8086应运而生!

    虚拟86模式是以任务形式在保护模式上执行的,在 80386上可以同时支持由多个真正的80386任务和虚拟86模式构成的任务。

    在虚拟86模式下,80386支持任务切换和内存分页。在Windows 操作系统中,有一部分程序专门用来管理虚拟86模式的任务,称为虚拟86管理程序。

    既然虚拟86模式以保护模式为基础,它的工作方式实际上是实模式和保护模式的混合。
    为了和8086程序的寻址方式兼容,虚拟86模式采用和8086一样的寻址方式,即用段寄存器乘以16当做基址再配合偏移地址形成线性地址,寻址空间为1 MB。

    但显然多个虚拟86任务不能同时使用同一位置的1 MB地址空间,否则会引起冲突。操作系统利用分页机制将不同虚拟86任务的地址空间映射到不同的物理地址上去,这样每个虚拟86任务看起来都认为自己在使用0~1 MB的地址空间。
    8086代码中有相当一部分指令在保护模式下属于特权指令,如屏蔽中断的cli和中断返回指令iret 等。

    这些指令在8086程序中是合法的。如果不让这些指令执行,8086代码就无法工作。为了解决这个问题,虚拟86管理程序采用模拟的方法来完成这些指令。

    虚拟86管理程序在异常处理程序中检查产生异常的指令,如果是中断指令,则从虚拟86任务的中断向量表中取出中断处理程序的入口地址,并将控制转移过去。
    如果是危及操作系统的指令,如cli等,则简单地忽略这些指令,在异常处理程序返回的时候直接返回到下一条指令。

    通过这些措施,8086程序既可以正常地运行下去,在执行这些指令的时候又觉察不到已经被虚拟86管理程序做了手脚。MS-DOS应用程序在Windows 操作系统中就是这样工作的。


  • 相关阅读:
    【XilinxVDMA模块学习】00开始
    【USBHID在STM32上的实现】00开始
    【XilinxZYNQ ucosiii的移植与开发】00开始
    【XilinxLVDS读写功能实现】00开始
    算法与数据结构
    页面进度条
    前端SEO优化
    正则表达式(Regular Expression)
    对网页中层的固定
    c#排序算法
  • 原文地址:https://www.cnblogs.com/poli/p/4731619.html
Copyright © 2011-2022 走看看