标题:关于WIN32的内存模式
只看楼主
lingluoz
Rank: 2
来 自:苏州科技学院
等 级:新手上路
威 望:4
帖 子:749
专家分:0
注 册:2008-2-2
结帖率:100%
 问题点数:0 回复次数:3 
关于WIN32的内存模式
以前发过一个贴子问关于far指针的时候,有人告诉我说
WIN32的内存模式是平坦寻址,可以寻址独立连续的4GB空间
后来突然之间想到了一个问题
如果内存模式是平坦的话,并且每一个段描述符的基址都是0,那么有这样的一段汇编程序
hang:
jmp hang
编译出来的exe程序
每一次exe加载的地方都不同,那么hang的地址就不同,但是exe文件里面的指令不会变的啊。。
如果是16位的dos程序就很好理解了,因为它是段+偏移形式的,但是win32我就死啊想不通了
好头痛啊,哪位能够帮帮我啊
搜索更多相关主题的帖子: 内存 模式 
2008-03-27 13:11
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:289
专家分:23
注 册:2008-2-24
得分:0 
在WIN32下,固化在代码里的所有地址也是逻辑相对地址,而不是绝对地址。在exe文件里的段起始地址实际上是逻辑地址,加载到内存后影射到物理地址。也就是说即使不同的exe文件里面的段地址可能都是相同的地址,但是影射到物理内存上是不同的物理地址。即使逻辑地址相同,物理地址也因为影射关系式不同而不同。在win32的进程角度来看,你看到的4G内存实际是逻辑内存的概念(因为操作系统对进程做了隔离,所以你的进程内使用的所有地址都是逻辑的,仅对你自己的进程有效)。也就是进程之间透明,每个进程看起来好像都是独占4G内存,而物理内存和虚拟内存都是操作系统在程序员背后维护的,操作系统可能会对内存进行移动以消除内存碎片(类似磁盘整理),所以当你需要直接对物理内存进行底层操作(例如图像处理)时候,都需要向操作系统申请内存锁定(防止操作系统在此期间动这块内存)。对程序员透明。所以跨进程需要共享内存或者将对方进程视作“文件”的逻辑去访问其他进程的内存,也就是说,同一个物理内存地址,在不同进程之间被访问的时候可能是不同的逻辑地址。相对而言,什么是全局的呢?句柄就是一种全局的概念,例如,窗口的句柄是对全局的,也就是说不同的进程拿到的同一个窗口的句柄是永远相同的数据,直到这个窗口被销毁,这个句柄才失效,所以你可以用句柄来全局的标识某个资源,而不避担心操作系统忽然对它变更或者在不同进程中拿到不同的值。

在编译成EXE以后,这里面其实有三种地址概念:文件地址,段内相对偏移地址,内存实际物理地址。建议楼主可以看看西班牙那个16岁小孩写的编写DOS和WINDOWS病毒的教程。

[[it] 本帖最后由 hoodlum1980 于 2008-3-27 13:46 编辑 [/it]]
2008-03-27 13:35
lw_China
Rank: 1
来 自:peking
等 级:新手上路
帖 子:73
专家分:0
注 册:2007-11-4
得分:0 
win32 是保护模式

在这里推荐一本书 <The C Programming Language>
2008-03-27 19:28
shy1201
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2008-3-18
得分:0 
2楼解释的好
2008-03-27 19:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-205642-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.724518 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved