Win32汇编学习——windows基础知识(小甲鱼教程)

2024-03-20 22:32

本文主要是介绍Win32汇编学习——windows基础知识(小甲鱼教程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Win32汇编语言程序设计》(小甲鱼)

 

1)windows特权保护机制

1)80386的中断和异常

2)80386的保护机制

3)Windows的保护机制

2)80x86处理器的工作模式

1.实模式

2.保护模式

3.虚拟8086模式

3)Win7的启动过程

1.开启电源,加电自检(在主板上的一个BIOS芯片)

 检查完之后(检查一些硬盘,磁盘、CPU...看能不能通电),BIOS会读取主引导记录(MBR)。

MBR:是我们的存储区,位于我们硬盘的第一个扇区—硬盘读取的第一个位置,里面有系统加载信息以及各个分区的信息、状态和偏移地址。大小为512字节,可以分为两个部分——第一部分pre-boot区(预启动区),占446字节,记录着第二部分的内容。  第二部分是Partition table区(分区表),占66个字节,作用是判断哪个分区被标记为活动分区,然后去读取那个分区的启动区,并运行该区中的代码。 最后两个字节“55 AA”是标志位,标志着是正常的MBR。

MBR不属于任何一个操作系统,也不能用操作系统提供的磁盘操作命令来读取它,但可以用ROM-BIOS中提供的INT 13H中断的2号功能读取该扇区的内容。

Ps: 病毒元老级人物——引导性病毒,经常利用修改MBR里的记录,使病毒在系统加载之前被加载。例如鬼影病毒

2.启动菜单生成

Windows启动管理器读取“启动配置数据存储”中的信息——所有操作系统的配置信息(可自己配置)

   当选择的是进入Windows 7系统,windows启动管理器运行%SystemRoot%\System32文件夹中的OS loaderWinload.exe。这个时候还是黑屏。。。

   当选择的是自休眠状态恢复Windows7,那将会运行Winresume.exe先恢复先前的程序。

    当选择的是早期的Windows版本,启动管理器将加载Windows NT风格的早期OS loader(Ntlder.exe)——生成一个由boot.ini内容决定的启动菜单。

3.核心文件加载及登录

Windows7启动时,加载其核心文件Ntoskrnl.exe 和 hal.dll —— 从注册表中读取设置并加载驱动程序。接下来将运行Windows会话管理器(smss.exe)并且启动Windows启动程序(Wininit.exe)本地安全验证(Lsass.exe)与服务(services.exe)进程,完成后,就可以登录系统了。

4.绘制桌面

4)实模式

1)处理器被复位或者加电的时候以实模式启动。

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

3)实际上,80386就是通过在实模式下 初始化控制寄存器,例GDTR、LDTR、IDTR与TR等管理寄存器以及页表,然后加载CRO使其中的保护模式

 

5)所有保护模式的特性在实模式下都是不可行的,保护模式一定要从实模式进入

 

6)中断处理方式

   实模式下的中断处理方式和8086处理器相同,也用中断向量表来定位中断服务程序地址。中断向量表的结构也和8086处理器一样:每4个字节组成一个中断向量,其中包括两个字节的段地址和两个字节的偏移地址

 

7)80386 于 8086 的好处

   寄存器是32位的

   增加了两个辅助段寄存器FS和GS

 

8)保护模式

这时,80386所有功能都是可用的。这时80386所有的32根地址线都可寻址,物理寻址空间高达4GB。

①支持内存分页机制,提供了对虚拟内存的良好支持。

②支持多任务,可以依靠硬件仅在一条指令中实现任务切换。任务环境的保护工作是由CPU处理器自动完成的,物理上完成的,物理加速是最快的,因为它不考虑兼容。

③支持优先级机制,不同的程序可以运行在不同的优先级上。 1和2没有用上,0、3和4有。。。

 

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

 

DOS操作系统运行在实模式下,而Windows操作系统运行于保护模式下。。。所以想从Windows进入DOS是不可能的,要重开机加载DOS系统,要改MBR中某个区块的索引信息指向了DOS系统。

 

10)虚拟8086模式

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

②在Windows操作系统中,有一部分程序专门用来管理虚拟86模式的任务,称为虚拟86管理程序。

③工作模式是实模式与保护模式的混合。

④与8086寻址方式一样,空间为1MB。

⑤多个虚拟86任务不能同时使用同一位置的1MB地址空间

⑥8086代码有相当一部分指令在保护模式下属于特权指令,如屏蔽中断的cli和中断返回指令iret(可能会威胁到保护模式)。为了解决这个问题,虚拟86管理程序采用模拟的方法来完成这些指令。  虚拟86管理程序在异常处理程序中检查产生异常的指令,如果是中断指令,则从虚拟86任务的中断向量表中取出中断处理程序的入口地址,并将控制转移过去。如果是危及操作系统的指令,如cli等,则简单地忽略这些指令,在异常处理程序返回的时候直接返回到下一条指令。

 

11)内存管理机制

DOS操作系统的内存使用——

①系统硬件使用的存储器地址被安排在高端(高地址)

②从A0000h开始的384kb中,用于显示的视频缓冲区和BIOS数据区;剩下从500h开始到A0000h总共不到640kb的内存是操作系统和应用程序所能使用的,应用程序不可能使用这640kb以外的内存,这就是著名的“640kb限制”

③如果系统中有内存驻留程序(TSR)存在,那么应用程序还要和这些TSR程序共同分享这段内容空间。

在80386中很少见到段寄存器——是因为32位的通用寄存器可以访问4GB的空间,所以不需要段地址了,偏移地址就够了。但是段寄存还是再使用着的。因为涉及属性和保护模式下段的其它参数,要表示的信息太多了,64位长的数据才能表示,这64位的属性数据叫做段描述符。(用户不需要关心段寄存器的值,已经指向正确的描述符)

又:80386的段寄存器是16位(放不下64位),所以把所有段的段描述符顺序放在内存中的指定位置,组成一个段描述符表。而段寄存器中的16位用来做索引信息(称之为段选择器),指定这个段的属性用段描述符表中的第几个描述符来表示。实际上只有高13位表示索引值,剩下的3位第0,1位表示程序的当前优先级,第2位(TI位)用来表示在段描述符的位置,0表示在GDT中,1表示在LDT中。   

80386中引入了两个新的寄存器来管理段描述符表:一个是48位的全局描述符表寄存器GDTR(整个系统只有一个),一个是16位的局部描述符表寄存器LDTR(每个任务都有,放在不同内存段,又将这些描述这些描述符当作系统描述符放在全局描述符表中)。

GDTR直接指向内存地址,LDTR和CS,DS等段选择器只存放索引值

Ps:每个应用程序拿到的都是虚拟地址,经过转换器,才得到物理地址

 

80386内存寻址机制—— 解决多任务操作系统中碎片内存合并。

1)80386处理器把4KB大小的一块内存当做“一页”内存,每页内存可以根据“页目录”和“页表”,随意映射到不同的线性地址上(像C++的链表一样)。

2)在80386处理器中,除了和CR3寄存器(指定当前页目录的地址)相关的指令使用的是物理地址外,其它所有指令都是用线性地址寻址的

3)内存分页机制是由80386处理器新增的CRO寄存器中的位31(PG位)决定的。 PG==0,分页机制不启用,这时所有指令寻址的地址(线性地址)就是系统中实际的物理地址,和8086一样。 PG==1,80386处理器进入内存分页管理模式,所有的线性地址要经过页表的映射才得到最后的物理地址。

4)内存分页管理只能在保护模式下才可以实现,实模式不支持分页机制。但不管在哪种模式下,所有寻址指令使用的都是线性地址。 PG==0时,也是线性地址,只不过此时的线性地址就是实际的物理地址。

5)页表规定的不仅是地址的映射,同时还规定了页的访问属性(只读、可读)。Windows的保护机制就建立在这之上

 

线性地址与物理地址

尽管线性空间的大小和物理内存的大小之间没有任何关系,但使用线性空间的应用程序最终还是要运行在物理内存中。应用所给出的任何线性地址最终必须被转化为物理地址,才能够真正的访问物理内存。所以,线性内存空间必须被映射到物理内存空间中,这个映射关系需要通过使用硬件体系结构所规定的数据结构来建立

 

11)Windows的内存安排

1)每个应用程序都有自己的4GB的寻址空间,就算这个程序只占1kb的内存。

2)不同应用程序的线性地址空间是隔离的,尽管他们在内存中是混乱在一起的。

3)DLL程序是没有自己私有的空间。插在其它程序里面,它们总是被映射到其它应用程序的地址空间中,当做其它应用程序的一部分运行。

4)虚拟内存安排,Windows系统一般在硬盘上建立大小为物理内存两倍左右的交换文件用作虚拟内存。利用80386处理器的内存分页机制,交换文件的寻址,只需要在真正调用的时候将其读入物理内存并同时修改线性地址映射到这块内存即可。

5)CPU只能看到线性地址,在调用一个程序的时间片中,和这个程序执行无关的部分,并不会映射到线性地址中。

 

12)Windows的特权保护

1)  Windows的特权保护和处理器硬件的支持是分 不开的。

2)优先级的划分、指令的权限检查和超出权限访问的异常处理等是构成特权保护的基础

 

Win32汇编中为什么找不到中断指令的应用?

     保护模式下,中断或异常处理往往从用户代码切换到操作系统代码中执行。由于保护模式下的代码有优先级之分,因此出现了从优先级低的应用程序转移到优先级高的系统代码中的问题,优先级低的不能调用高的。
80386共设置4个优先级(0~3)
    0级是最高的(特权极)3级是最低级(用户级)

    为了使低优先级安全的调用高优先级,保护模式增加了“门”的概念。 “门”指向某一个优先级高的程序所规定的入口点,所有优先级低的程序调用优先级高的程序只能通过门重定向,避免了低级别的程序从任意位置进入优先级高的程序的问题。
    保护模式下的中断和异常等服务程序也要从“门”进入,80386的门分为中断门、自陷门和任务门。。。

    在Windows中,操作系统使用动态链接库来代替中断服务程序提供系统功能,所以Win32汇编中int指令也就失去了存在的意义。其实那些调用API的指令 原本是用int指令实现的。(暗中调用)

Windows错误蓝屏怎么产生?

    程序违反了Windows规定的“保护条例”,引发了保护异常。
保护条例——段的类型检查、页的类型检查、访问数据时的级别检查、控制转移的检查、指令集的检查、I/O操作的保护

 

 

这篇关于Win32汇编学习——windows基础知识(小甲鱼教程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/830966

相关文章

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

windows端python版本管理工具pyenv-win安装使用

《windows端python版本管理工具pyenv-win安装使用》:本文主要介绍如何通过git方式下载和配置pyenv-win,包括下载、克隆仓库、配置环境变量等步骤,同时还详细介绍了如何使用... 目录pyenv-win 下载配置环境变量使用 pyenv-win 管理 python 版本一、安装 和

Linux下MySQL8.0.26安装教程

《Linux下MySQL8.0.26安装教程》文章详细介绍了如何在Linux系统上安装和配置MySQL,包括下载、解压、安装依赖、启动服务、获取默认密码、设置密码、支持远程登录以及创建表,感兴趣的朋友... 目录1.找到官网下载位置1.访问mysql存档2.下载社区版3.百度网盘中2.linux安装配置1.

Python使用pysmb库访问Windows共享文件夹的详细教程

《Python使用pysmb库访问Windows共享文件夹的详细教程》本教程旨在帮助您使用pysmb库,通过SMB(ServerMessageBlock)协议,轻松连接到Windows共享文件夹,并列... 目录前置条件步骤一:导入必要的模块步骤二:配置连接参数步骤三:实例化SMB连接对象并尝试连接步骤四: