求教:关于程序在运行时的内存分配、布局问题(会交叉吗?)

来源:百度知道 编辑:UC知道 时间:2024/06/30 07:58:21
在Windows中每个程序是运行在“保护模式”下的,一切程序都只能访问自己的4G内存空间,不会访问到其他程序的空间—— 请问这句话如何理解?每个程序都可以访问自己的4G,那我同时运行10个程序不就可以访问40G内存空间??这也太离谱了吧,哪有这么大的内存?!如果不是这样的话是否会出现内存交叉?

请用这个例子给我讲解一下,困饶我很长时间了:
一个名为app.exe的程序,我们拿IDA Pro等反汇编工具反编译后可以发现app.exe程序的内存布局都是固定的地址(比如0x0845FFC0等)——请问这里的“固定的地址”是怎么理解?

然后,我运行两次app.exe(不关闭),这样会出现两个app.exe的进程——难道它们的内存空间不会出现交叉冲突吗??比如第一个app.exe占的内存空间是0x00000001~0x33333333,那第二个app.exe占的内存也是0x00000001~0x33333333 .... 这样不是冲突了吗??为什么??

windows给程序提供服务的时候,每个程序都会有自己开的进程线程,windows会标记所有的进程和线程,动态的给他们分配地址。

内存的地址存在实际的物理地址和逻辑地址。windows会给每个程序分一个起始的位置,那里就是它的0X00000001。也就是说windows把程序提供的地址自动转化了。

咱们在使用汇编语言(或者Debug)的时候,可以获得物理地址,也可以把系统搞down了。