地址空间重定位和链接器完成的重定位任务之间有什么区别??据我所知,链接器完成的重定位任务包括将符号引用连接到符号定义的过程。地址空间重定位是关注什么时候将可执行文件带入内存并且所有地址引用都是参考它放在内存中的地方的起始地址来解决的,不是吗?我也想知道是谁做的地址空间重定位??
答案 0 :(得分:1)
是的,你是对的。操作系统中的进程加载程序执行加载时重定位。它实际上充当运行时链接器。
答案 1 :(得分:1)
处理器中有MMU(Memory Manegememt Unit)。它为每个进程/程序提供了自己有限的内存空间。这就是程序中缓冲区溢出现在不会造成太大损害的原因。这样每个程序都存在于自己的记忆中。操作系统处理这个。
编辑:
程序通常从仅红色位置(ROM /磁盘/闪存)运行,并且它们需要堆栈用于临时值。对于c / c ++中的instatnce几乎外翻,但是定义为char / int / long / float和数组的特定值当然会进入堆栈。 这意味着链接器使用并期望只有堆栈或程序本身的数据(通常只读)
当程序需要额外的内存大小时,无法在编译时定义它需要堆。堆分配为malloc或new(c / c ++)
但是因为从ram读取通常比从其他类型的内存存储设备读取更快,OS在ram上从磁盘复制程序并从那里开始执行程序。