直接引用数字地址的C程序,这些进程物理上引用同一个位置?

直接引用数字地址的C程序,这些进程物理上引用同一个位置?,c,memory,C,Memory,假设我们编译了一个直接引用数字地址的C程序,然后执行了两个。那么这两个过程实际上指的是同一个地方?如果没有,如何引用不同的物理空间?这取决于实际的平台。在许多嵌入式系统上可能会出现这种情况,但例如在x86的受保护模式下,每个应用程序都有自己的地址空间,并将每个应用程序的虚拟地址转换为物理内存地址。这样,应用程序最终会彼此隔离,并且可以让它们的代码在完全相同的地址上运行 当进程(或模块)必须共享相同的地址空间时,一种常见的技术是使用可重新定位的二进制文件,也称为。这是通过在链接时创建一个修复表,并

假设我们编译了一个直接引用数字地址的C程序,然后执行了两个。那么这两个过程实际上指的是同一个地方?如果没有,如何引用不同的物理空间?

这取决于实际的平台。在许多嵌入式系统上可能会出现这种情况,但例如在x86的受保护模式下,每个应用程序都有自己的地址空间,并将每个应用程序的虚拟地址转换为物理内存地址。这样,应用程序最终会彼此隔离,并且可以让它们的代码在完全相同的地址上运行


当进程(或模块)必须共享相同的地址空间时,一种常见的技术是使用可重新定位的二进制文件,也称为。这是通过在链接时创建一个修复表,并在加载后立即“修复”加载的二进制文件来实现的。

答案取决于硬件

在具有虚拟内存管理的系统上,进程在其自己的“沙箱”中运行,其整个内存空间都可用。多个进程可以访问同一地址,但虚拟内存管理器将在物理地址空间中为每个进程提供一个单独的页面,因此这两个进程不会在内存中的同一项上“冲突”

在没有虚拟内存管理的系统上,没有保护:如果两个进程引用同一地址,它们将访问内存中的同一位置


注意:访问未分配给程序的地址是未定义的行为。因此,访问硬编码地址的程序可能无效。

不,它们不是。至少在现代操作系统中不是这样

每个进程都有自己的虚拟内存空间。它与物理DRAM中的实际地址无关

简言之,这意味着理论上每个进程都有4GB内存(在32位体系结构中),但大部分内存甚至没有映射到实际的物理内存。如果是这样,它通常不会在不同的进程中指向相同的物理地址


但这是可以做到的。两个进程可以共享内存!如果您愿意慷慨地要求操作系统为这两个进程映射相同的内存。这称为映射内存。查找它。

大多数现代非嵌入式系统(Linux、Windows、macOS、BSD等)都使用虚拟内存映射。大多数嵌入式RTO不使用虚拟内存映射。值得一提。例如:VxWorks