关于WIN32的内存模式
以前发过一个贴子问关于far指针的时候,有人告诉我说WIN32的内存模式是平坦寻址,可以寻址独立连续的4GB空间
后来突然之间想到了一个问题
如果内存模式是平坦的话,并且每一个段描述符的基址都是0,那么有这样的一段汇编程序
hang:
jmp hang
编译出来的exe程序
每一次exe加载的地方都不同,那么hang的地址就不同,但是exe文件里面的指令不会变的啊。。
如果是16位的dos程序就很好理解了,因为它是段+偏移形式的,但是win32我就死啊想不通了
好头痛啊,哪位能够帮帮我啊
----------------解决方案--------------------------------------------------------
在WIN32下,固化在代码里的所有地址也是逻辑相对地址,而不是绝对地址。在exe文件里的段起始地址实际上是逻辑地址,加载到内存后影射到物理地址。也就是说即使不同的exe文件里面的段地址可能都是相同的地址,但是影射到物理内存上是不同的物理地址。即使逻辑地址相同,物理地址也因为影射关系式不同而不同。在win32的进程角度来看,你看到的4G内存实际是逻辑内存的概念(因为操作系统对进程做了隔离,所以你的进程内使用的所有地址都是逻辑的,仅对你自己的进程有效)。也就是进程之间透明,每个进程看起来好像都是独占4G内存,而物理内存和虚拟内存都是操作系统在程序员背后维护的,操作系统可能会对内存进行移动以消除内存碎片(类似磁盘整理),所以当你需要直接对物理内存进行底层操作(例如图像处理)时候,都需要向操作系统申请内存锁定(防止操作系统在此期间动这块内存)。对程序员透明。所以跨进程需要共享内存或者将对方进程视作“文件”的逻辑去访问其他进程的内存,也就是说,同一个物理内存地址,在不同进程之间被访问的时候可能是不同的逻辑地址。相对而言,什么是全局的呢?句柄就是一种全局的概念,例如,窗口的句柄是对全局的,也就是说不同的进程拿到的同一个窗口的句柄是永远相同的数据,直到这个窗口被销毁,这个句柄才失效,所以你可以用句柄来全局的标识某个资源,而不避担心操作系统忽然对它变更或者在不同进程中拿到不同的值。
在编译成EXE以后,这里面其实有三种地址概念:文件地址,段内相对偏移地址,内存实际物理地址。建议楼主可以看看西班牙那个16岁小孩写的编写DOS和WINDOWS病毒的教程。
[[it] 本帖最后由 hoodlum1980 于 2008-3-27 13:46 编辑 [/it]]
----------------解决方案--------------------------------------------------------
win32 是保护模式
----------------解决方案--------------------------------------------------------
2楼解释的好
----------------解决方案--------------------------------------------------------