保护模式

四、保护模式之内存分段管理机制

江枫思渺然 提交于 2019-12-02 18:51:07
以我的理解,内存的分段管理机制,就是人为的把内存分成几个小段(Segment),各段独立使用。 为什么要把内存分成很多小段使用呢?原因一是要多个程序同时运行:开QQ勾搭妹子,开网易云音乐听歌,开浏览器看网页。。。。。。好几个程序一起开着呢!如果几个程序都用同一块内存,那就乱了!所以,把内存分成几段:QQ用一段,别的程序不能访问; 网易云音乐用另一段,其他程序也不能访问。。。。。。原因二是不同程序的权力不一样:操作系统可以启动、关闭应用程序,应用程序可不能对操作系统指手画脚,也就是各段内存的被访问权限是不同的。 很明显,要准确定义一个段要三个参数:该段从物理内存的哪个位置开始(段开始的实际内存地址)、该段占用多大的内存空间(段的长度)、该段能被哪些程序访问(段的属性),用专业术语说就是段基址(Segment Base)、段界限(Segment Limit)、段属性(Segment Attritbute)。 用一个数据结构来描述段的三个属性,这个数据结构就叫 段 描述符(Descriptor)。由于历史的原因( 为了和80286兼容 ),这个数据结构看起来相当纠结: 三个参数竟然不各自独立连续存放,而是被拆开混存的! ; 段描述符图示 ; ; ------ ┏━━┳ ━ ━ ━┓内存高地址 ; ┃ 7 ┃ 段 ┃ ; ┣━━┫ 基 ┃ ; ┆ ┆ 址 ┆ ; 字节 ┆ ┆ 高 ┆ ;

Selenium 配置IE浏览器

吃可爱长大的小学妹 提交于 2019-12-02 15:39:41
1.安装selenium pip install selenium 2.安装IE浏览器driver http://selenium-release.storage.googleapis.com/index.html 进入索引页,首先选择版本号,IEDriverServer的版本号和Selenium的版本号一定要一致 解压缩得到IEDriverServer.exe,并将其所在目录添加到环境变量 针对windows vista和windows 7上的IE7或者更高的版本,必须在IE选项设置的安全页中,4个区域的启用保护模式的勾选都去掉(或都勾上),即保持四个区域的保护模式是一致的。如下图所示: 针对IE10和更高的版本,必须在IE选项设置中的高级页中,取消增强保护模式。如下图所示: 浏览器的缩放比例必须设置为100%,这样元素定位才不会出现问题,如下图所示: 针对IE11,需要修改注册表。 注册表位置:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones 1-4号Key下面都有名叫2500的属性,则将其值改为相同的非零值 参考自: https://www.cnblogs.com/onetheway2018/p/8603190.html http://www

保护模式中的PDE与PTE

萝らか妹 提交于 2019-12-02 00:05:47
Windows内核分析索引目录 :https://www.cnblogs.com/onetrainee/p/11675224.html 保护模式中的PDE与PTE 1. PDE与PTE的认知    我们在上一节,10-10-12模式中已经见过下表。    PDT(Page Direcotry Table)y页目录表,其中每一个成员被称为页目录表成员。    PTT(Page Table)页表,其中每一个成员被称为页表成员。       页目录表、页表与物理页,本质上都是页。   10-10-12模式遵循4KB大小的机制,即每一个页大小为4KB。     页目录表与页表存内存,所以可以一共有 1KB = 2^10个;而物理页存储字节,共存2^12个;因此10-10-12分页就是这么来的。 二、向零地址读写内存   我们有编程经验的人知道,零地址其实不可以读写的。   其本质原因是因为 00000000h 这个线性地址对应的物理地址没有挂靠物理页,也即对应的PTE=0,自然物理页索引就不存在。   但是,我们可以通过windbg往0地址中挂靠物理页,这样就很容易实现对零地址的内存读写。 测试代码 1 #include "stdafx.h" 2 3 int main(int argc, char* argv[]) 4 { 5 // 将X的物理页挂靠0地址上 6 int x = 1; 7

保护模式101012分页机制

痞子三分冷 提交于 2019-12-01 23:50:41
Windows内核分析索引目录 :https://www.cnblogs.com/onetrainee/p/11675224.html 保护模式101012分页机制   在保护模式中,我们都知道,所谓的内存地址是虚拟地址,不是物理地址。   但是,我们是否想过,虚拟地址是随便产生的吗?当然不是,其实一些数字的组合。   可这些数字是什么意思呢?答案:序号。   通过序号查找表,一个序号对应找一张(物理表地址+属性),这样通过连续的序号,我们可以查找最终数据存放的物理地址。   现在,我们了解一下 10-10-12分页方式,即一个32位地址分别拆分成10-10-12位,每位组成一个新的序号。 一、WindowsXp设置以101012分页启动方式   在C:\boot.init(默认为隐藏文件,工具-文件夹选项-显示隐藏文件),将 "nonexecute-optin" 改为 "execute-optin"。   修改完之后重启即可。    二、利用101012分页算法将线性地址转换为物理地址,并从物理页中读出内容 1. 打开记事本,输入"hello world"这个字符;之后使用CheatEngine工具附加,搜索该字符串,找到线性地址      2. 现在我们得到该字符串的线性地址为 000B0C40,拆分成2进制,并按照10-10-12来分:   00 0000 0000 | 00

windows内存分段

一曲冷凌霜 提交于 2019-12-01 10:41:12
1.3.2 Windows 的内存管理 在这一节中,读者可以解决初学Win32汇编的两个大疑问: ● Win32汇编中,每个程序都可以用4 GB的内存吗? ● Win32汇编源代码中为什么看不到CS,DS,ES和SS等段寄存器的使用? 1. DOS操作系统的内存安排 Win32编程相对于DOS编程最大的区别之一就是内存的使用。 先来回顾一下DOS操作系统的内存使用,如图1.1所示。DOS操作系统运行于实模式中,由于8086处理器的寻址范围只有1 MB,当时把系统硬件使用的内存安排在高端,地址是从A0000h(即640 KB)开始的384 KB中,其中有用于显示的视频缓冲区和BIOS的地址空间。而在内存低端,安排了中断向量表和BIOS数据区;剩下从500h开始到A0000h总共不到640 KB的内存是操作系统和应用程序所能够使用的;应用程序不可能使用这640 KB以外的内存。这就是著名的“640KB限制”。但即使在这640 KB中,DOS操作系统又占领了低端的一部分内存,最后剩下600 KB左右的内存才是应用程序真正可以用的。如果系统中有内存驻留程序存在,那么应用程序还要和这些TSR程序共同分享这段内存空间。 当80386处理器推出后,可以寻址的内存范围达到了4 GB,利用XMS驱动程序可以访问到所有的4 GB地址空间。但16位的段寻址方式限制了DOS程序,“可见

Linux的分段和分页机制

邮差的信 提交于 2019-11-28 03:09:38
1.分段机制 80386的两种工作模式   80386的工作模式包括实地址模式和虚地址模式(保护模式)。Linux主要工作在保护模式下。 分段机制   在保护模式下,80386虚地址空间可达16K个段,每段大小可变,最大达4GB。   从逻辑地址到线性地址的转换由80386分段机制管理。段 寄存器CS、DS、ES、SS、FS或GS标识一个段。这些段寄存器作为段选择器,用来选择该段的描述符。 分段逻辑地址到线性地址转换图 图9_7 分段逻辑地址到线性地址转换图 2. 分页机制 分页机制的作用   分页机制是在段机制之后进行的,它进一步将线性地址转换为物理地址。   80386使用4K字节大小的页,且每页的起始地址都被4K整除。因此,80386把4GB字节线性地址空间划分为1M个页面,采用了两级表结构。 两级页表   两级表的第一级表称为页目录,存储在一个4K字节的页中,页目录表共有1K个表项,每个表项为4个字节,线性地址最高的10位(22-31)用来产生第一级表索引,由该索引得到的表项中的内容定位了二级表中的一个表的地址,即下级页表所在的内存块号。 第二级表称为页表,存储在一个4K字节页中,它包含了1K字节的表项,每个表项包含了一个页的物理地址。二级页表由线性地址的中间10位(12-21)位进行索引,定位页表表项,获得页的物理地址

保护模式特权级概述

ε祈祈猫儿з 提交于 2019-11-26 20:22:07
在IA32的操作系统中,段被分为了4个特权级,分别为0-3级,有时候我们也叫做ring0-ring3,其中,数值越小特权级越高。如下图所示: 图中,核心代码和数据所在的段的特权级都比较高,一般在ring0,而用户程序所在的段的特权级较低,一般在ring3。当低特权级的任务试图在未被允许的情况下访问高特权级的段时,将会产生常规保护错误。 而处理器是如何区分所在段的特权级,进而对其进行保护的呢?这就不得不提到CPL、DPL和RPL三者了。但是在开始之前,我们需要先了解一下一致代码段和非一致代码段。 一致代码段和非一致代码段 在操作系统中,我们有些高特权级的代码是希望被低特权级的程序所访问的,比如一些库函数,于是我们将这些高特权级代码放在一个叫做一致代码段的段里。而有些高特权级的代码,我们并不想让低特权级的程序所访问,于是我们把他们放在一个叫做非一致代码段的段里。具体来说,当通过call或者jmp指令转移到其它段时(即访问其他段),当转移的目标是一个优先级更高的一致代码段时,我们是可以进行访问的,但是当前的特权级会被延续下去;当转移的目标是一个优先级更高的非一致代码段时,这时的访问会引起常规保护错误(除非使用调用门或任务门)。 总结来说: 一致代码段:由系统(高特权级)共享给低特权级的程序的代码所在的段,主要有下面两点限制: 高特权级程序不能访问低特权级的数据