鱼C论坛

 找回密码
 立即注册
查看: 3188|回复: 0

[学习笔记] 《解密系列-基础篇》第五讲:保护模式

[复制链接]
发表于 2017-12-21 16:45:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 shuiyu 于 2017-12-21 16:49 编辑

越努力,越幸运。欢迎大家来看我的笔记,不对的请各位大佬指正,谢谢

CUP的三种模式:实模式、保护模式、虚拟8086方式

一、实模式
(1)程序运行的实质:指令的执行。

(2)80x86系列是使用CS寄存器配合IP寄存器来通知CPU指令在内存中的位置.

(3)定位索引内存(寻址):段地址 + 偏移地址 = 20位物理地址

(4)x86系列使用中断机制来实现系统服务。

(5)关于寄存器的兼容问题:AL(8位)->AX(16位)->EAX(32位)->RAX(64位)
当要使用32位时:就把RAX前半段都填上0,后半段就是32位的了;以此类推。

二、保护模式
(1)无论实模式还是保护模式,根本的问题还是程序如何在其中运行。保护模式下程序运行的实质仍是“CPU执行指令,操作相关数据”。主要改变的是寻址的方式,保护模式在寻址方式上“动了手脚”,为的是起到“保护的作用”。

(2)在每一任务之内定义了4种保护级别。分别为0、1、2、3,按环的方式表示。0级代表最高的权限级别,3级代表最低的权限级。按环的方式来表示,其中,环0、1、2为系统级,环3为用户级。

(3)等级示意图:
图片1.png
系统级:
0环:内核(kernel),内核的代码(code)和内核的数据(data)
1环:操作系统(OS),操作系统的代码和操作系统的数据
2环:没说
用户级:
3环:应用程序(两个程序之间是隔开的):应用程序1的代码和数据、应用程序2的代码和数据、应用程序3.........

(4)如果应用程序拥有第0级的权限,那么它就可以执行所有的指令并访问所有的数据;如果应用程序拥有的权限级别是第3级,它能执行的指令是有限的,能访问的数据也是有限的(被保护)。

(5)操作系统的核心层是运行在Ring 0级,而WIN32子系统(如KERNEL32.DLL、USER32.DLL、GDI32.DLL等)是运行在Ring 3级的,以提供与子程序的接口。
KERNEL32.DLL:负责内存的管理
USER32.DLL:操作用户的界面
GDI32.DLL:图像的界面
DLL:动态链接库文件(没有自己的私有空间)
EXE:可执行文件

三、虚拟内存
(1)虚拟内存并不是真正的内存,它是通过映射(Map)的方法,使可用的虚拟地址(VA)达到4GB(因为EIP32位索引的最大范围是4GB)。规定:每个应用程序可以被分配到2GB的虚拟地址,剩下的2GB留给操作系统自己用。(Windows NT中,应用程序甚至有3GB的虚拟地址。)

(2)虚拟内存真正存在的地方是在你的硬盘里,并不是真正的加上了一根内存条。(有一个虚拟内存管理器)

(3)Windows 是一个分时的多任务操作系统,CPU的时间被分割成一个个的时间片后分配给各个不同的应用程序,在一个时间片里,和这个应用程序执行无关的东西并不会又映射到线性地址中(这样EIP就索引不到)。因此可以做到每个程序都拥有自己独立的4GB寻址空间,互不干扰。

(4)关于Windows多线程:其实原理就是上面的分时机制,即:将CPU的一秒钟分为很多份,每一份都执行不同应用程序(如:第0.01秒执行A程序,第0.02秒执行B程序,第0.03秒又回来执行A程序)这样就让我们感觉系统同时执行很多任务。

(5)虚拟内存的实现方法和过程:
1、当一个应用程序被启动时,操作系统创建一个新的进程,并给这个进程分配2GB的虚拟地址(不是内存哦,是地址);
2、虚拟内存管理器将应用程序的代码映射到哪个程序的虚拟地址中的某个位置,并把当前所需要的代码读取到内存物理地址中;
3、如果使用动态链接库DLL,那么DLL程序也会被映射到进程的虚拟地址空间,在需要的时候才被读入物理内存;
4、其他项目(像数据、堆栈等)的空间是首先从物理内存中分配,再反向映射到虚拟地址空间中的;
5、应用程序通过使用的他的虚拟地址空间中的地址开始执行,然后由虚拟内存管理器把每次的内存访问映射到物理位置去。

(6)使用虚拟内存的好处是:简化了内存的管理,并可弥补物理内存的不足,另外可以防止多任务环境下各个应用程序之间的冲突!

(7)不理解没关系,只要记下下面几点就好了,以后会慢慢了解的:
1、应用程序是不会直接访问物理地址的;
2、虚拟内存管理器通过虚拟地址的访问请求,控制所有的物理地址访问;
3、每个程序都有独立的4GB寻址空间,不同程序的地址空间是被互相隔离的;
4、DLL程序没有自己的“私有”空间,它们称之为动态链接库文件,它们总是被映射到其他应用程序的地址空间中的,作为其他应用程序的一部分运行。





谢谢小甲鱼带来的视频教程,感谢!!

本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记,不对的请各位大佬指教,谢谢

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 20:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表