能力值:
( LV3,RANK:30 )
|
-
-
2 楼
段式地址,类似
cs:0084
windows系统下,段寄存器永远是0
所以windows来说段式寻址实际和线性地址没区别。
所谓页式内存管理,这个仅仅是物理内存的管理方式而已,与怎么寻址根本不是一个事情。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
逻辑地址,线性地址,和windows内存管理,到底什么关系?有大神能给小弟讲明白吗?
|
能力值:
( LV8,RANK:130 )
|
-
-
4 楼
自己看书更好一些。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
如果看书能看明白,我就不会来这里问了
|
能力值:
( LV5,RANK:60 )
|
-
-
6 楼
先别管操作系统,把 X86保护模式 弄熟了再说,然后在去了解 WINDOWS内核 的知识
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
多看多理解把!如果是学习windows的话暂时不用考虑分段机制,因为windows采用的是平坦段模式,意思就是32的虚拟地址就是32位的逻辑地址,然后将该地址采用分页机制转换成物理地址。好好研究下分页吧!有非PAE和PAE机制等,慢慢研究,自然就一通百通了
|
能力值:
( LV9,RANK:170 )
|
-
-
8 楼
百度文库我帮你找了,你看看
http://wenku.baidu.com/link?url=8SBNUkHF6xIQBOySDnsSSpuph8SNgt2D8uKytOZCC1aHhtHsNUKWcyiyOV8qRaa3EHnVetzRjit51yWAKBYgDgy71zX9gSSj3CBGo2VFppW
像这些基础的东西,我觉得先自己思考,实在不会再尝试通过网络解决,依然找不到答案,再上论坛发贴求助比较好!
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
以下是我看 罗云彬 win32汇编 学习的一些笔记 其实并没有吃透这些理论.
有什么不对的清高人再指点下哈.
对于楼主的问题 我感觉 线性地址其实是逻辑上来说的. 因为物理地址的有限性,限制了系统的性能发挥,微软迫于无奈才想出了
这种方式来解决当时的微机内存吃紧的局面(XP刚推行那会1G内存是很不错的配置哦~). 当然这样的设计也带来了多进程实现机制.
WIN32特色(保护模式下):
虚拟内存:
每个应用程序都有4G内存空间?
优先级:
优先级分4个级别(0~3)
操作系统在0级 应用程序在3级
寻址方式:
win32下所有寄存器都是32位的可以寻址4G的内存;
名词解释:
SS cs,ds...等段选择器(Segment Selector)
用于索引下面的 段描述符.
SD 64位的段描述符(Segment Descriptor)
存放一些 地址能否写入 优先级 是否允许执行 等等
DT 段描述表(Descriptor Table)
段描述符的集合
GDTR 寄存器
48位 指向GDT
GDT 全局描述符表GDT(Global Descriptor Table)
这个表包含了系统中所有任务可用的段描述符
通常包含描述操作系统使用的 代码段 数据段 和栈段 的描述符 及各任务的Ldt段
全局描述表只有唯一的一个
LDTR 寄存器
16位
LDT 局部描述符表LDT(Local DescriptorTable)
每个任务都有一个这样独立的LDT 他包含每个任务私有的 代码段 数据段 和栈段
的描述符. 也包含一些改任务 的 门描述符
局部描述符描述不同的内存段
获取一个程序的实际物理地址:
xxxx : xxxx xxxx
根据段选择寄存器TI位
TI = 0
1: 在GDTR(全局描述表寄存器) 取GDT的位置.
2: 根据(XXXX的13位)取索引在 GDT 中 取得段描述符.
3: 根据段描述符 取得实际的物理基址
加上偏移 XXXXXXXX 才是线性地址
TI = 1
1:在GDTR(全局描述表寄存器) 取GDT的位置
2:在LDTR(局部描述表寄存器) 取LDT在GDT中的的位置 假设 L_index
3:用 L_index 在 GDT中获取 局部描述符的位置
4:在局部描述符中用 (XXXX的13位)取得 段描述符
5: 根据段描述符 取得实际物理地址的基址
加上偏移 XXXXXXXX 才得到线性地址
总体理解: TI = 0 则在GDT中直接XXXX索引DT
TI = 1 则在GDT中根据LDTR索引到LDT 然后在XXXX索引DT
分页机制:
每个分页 4K
用页表存放.(页表中的内容是 分页 组成的线性地址)
而是通过映射 相对联系到 物理地址,这时物理地址可以是不连续的.
只要页表中的页是连续存放即可(这时这里也就是可以当成线性的地址了)
页表中还存放这访问属性 可读 可写 可执行
控制分页是否开启的寄存器(CR0 的第31位 PG决定 PG = 0不启动 PG =1 启动)
虚拟内存:
把页表直接指向硬盘物理 把硬盘某部分文件作为内存交换文件
页表可以把交换文件当物理内存寻址..(windows会先在物理内存中找 如果没有则引发 异常 异常处理中把虚拟内存中的代码装载到物理内存中 重新写页表 然后继续运行)
windows多进程 是通过切换页表来实现. 一个页表共享系统dll (也就是说都映射到了DLL的地址 中)那么进程之间也就有不同的页表 页表中有不同的线性地址.
线性地址不受物理地址的限制 每个页表中的页目录表示的线性地址可以是4G的寻址范围 所 以说每个进程 都能有4G的内存地址.(很大一部分映射的都是相同的地址 1对多 多对多 的关系 系统DLL和系统就是1对多的关系)
为什么说DLL能被共享呢 因为DLL的访问都是映射机制.同理EXE也可以被共享只要被某进程 映射到了就行.
注: 一个执行文件或DLL的是否加载到物理内存中 是看是否用到了他的代码,页表可以映射到他所在 的位置 但不加载到内存中.先放在虚拟内存中.
猜想虚拟内存的必要性: 物理内存总是有限的,速度是快 但什么都装进去 资源马上就耗尽了,用硬 盘虚拟文件 非活动的系统进程或者程序映射到虚拟内存中.需要用了再加载.实际上也就是 个备胎,先放些不是马上要用的东西,用到了再拿.这样的话一个程序加载就不需要一次性什 么都往内存里加.内存也就能尽量的跑一些活动的程序了. 必要时 还可以直接把虚拟内存当 物理内存使用(如物理内存低于%25)
保护模式和非保护模式的感受:
非保护模式没有页表所有内存都是可以访问的没有限制.直接操作物理内存.所有程序的东西 必须一次性加载进内存.并且代码执行是直线行的,,,A程序完成才能B程序跑起.(理论上来说 这里也可以加多任务)
保护模式下 都要通过页表取访问 在页表这层中做了访问限制.相当于做了一个内存管理机 制.(而且暂时没用到的可以先通过页表映射了关系 用到了再加载)没有直接操作物理内存, 在加上虚拟内存的使用 内存使用效率更高.
CPU加了时间片的概念之后 只要保存当前的环境 然后切换至另个任务 如此反复.就实现了 多任务.
总结下 在段描述符(DT)中查找到 段基址, 而段基址是在也目录中的.通过页表中的也目录查 看映射到了哪块 实际物理地址.
windows:
windowsXP下所有关于描述符的操作都是不对外开放的,关于这些的东西都是系统操作的.所以这些CS DS之类的 选择寄存器 我们都是无法操作的.关于地址也不必取关心他们的实际情况系统都为我们做好了一切.
windows9X下是描述表可写的(所以9X 是不安全的). 所有这一切都是处于安全性的考虑.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
windows特权保护:
非保护机制下 中断什么的都是 可以程序直接访问并调用的.并且是可以修改的.
保护模式下 加了一层 门的概念. 所有 低优先级(比如应用程序) 都是通过门 重定向来访问 高优先级的代码.
中断和异常都是优先级代码 所以我们选择在R3下些的应用程序都无法直接调用.
没有中断直接访问的话 windows就通过api的方式 来提供系统的功能(系统功能如:响应键盘输入,显示 什么的 ).相当于间接的访问中断.只是现在不能去改写中断系统更封闭和安全.
门也分好几种 中断门 任务门 自馅门(比如等待键盘输入 是自己调用的)
IDT 中断描述表 相关寄存器是 IDTR.
80386CPU下对于保护
段类型检查
页类型检查
访问数据级别检查
控制转移检查
指令集检查
I/O保护
WINDOWS的保护机制
系统的都在 优先级R0 下运行
应用程序都在优先级R3 下运行
只有在些驱动程序的时候才能RO优先级的访问.
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
仔细了解他们之间的映射机制
|
|
|