我没分了,但是还是请大家帮一下,这个问题我郁闷很久了 T_T
在Windows中每个程序是运行在“保护模式”下的,一切程序都只能访问自己的4G内存空间,不会访问到其他程序的空间—— 请问这句话如何理解?每个程序都可以访问自己的4G,那我同时运行10个程序不就可以访问40G内存空间??这也太离谱了吧,哪有这么大的内存?!如果不是这样的话是否会出现内存交叉?
请用这个例子给我讲解一下,困饶我很长时间了:
一个名为app.exe的程序,我们拿IDA Pro等反汇编工具反编译后可以发现app.exe程序的内存布局都是固定的地址(比如0x0845FFC0等)——请问这里的“固定的地址”是怎么理解?
然后,我运行两次app.exe(不关闭),这样会出现两个app.exe的进程——难道它们的内存空间不会出现交叉冲突吗??比如第一个app.exe占的内存空间是0x00000001~0x33333333,那第二个app.exe占的内存也是0x00000001~0x33333333 .... 这样不是冲突了吗??为什么??
------解决方案--------------------------------------------------------
保护模式不是需要描述符吗?
描述符中不是有一个存在位p吗?
如果该位为1就表示这个代码或数据在内存中,否则就表示不在内存中,到硬盘中进行页交换
------解决方案--------------------------------------------------------
如果是默认加载,两个进程所使用的虚拟地址是完全一样的,但是系统自己会管理它们,不会发生错误。进程间是不相互干扰的。
而其实更深来说,这两个进程的代码段code在内存中只有一份是唯一的。只有它们的数据段是不同的(虚拟地址相同)。但是你不需要担心任何问题,操作系统会管理好这些事情的。
建议好好看一下《操作系统》。
------解决方案--------------------------------------------------------
两个app.exe的文本节在内存中分别存到两个不同内存块,虽然程序中的地址(虚拟地址)是同一个,但app.exe在A进程运行时这个程序地址映射到一个内存块,在B进程下运行时映射到另一个内存块。映射意思是通过内存管理单元把程序地址转变为物理地址