c语言程序经过编译后,每条指令都有一个内存地址,那两个程序如果有相同内存地址的指令怎么办?

c语言程序经过编译后,每条指令都有一个内存地址,那两个程序如果有相同内存地址的指令怎么办?
问在线客服
扫码问在线客服

加载到内存中不就会把另一个程序的指令覆盖了吗补充:是经过objdump以后,每条指令前面都有的那个地址,一般是0x400000左右,然后我还发现一些常数一般在0x 查看全部

  • 回答数

    10

  • 浏览数

    1,023

10个回答 默认排序
  • 默认排序
  • 按时间排序

现在每个进程都是操作系统提供的虚拟地址

取消 评论

编译后程序的运行环境和编译器没有指明。如果没有操作系统采用虚拟地址管理的条件下,程序地址重叠会出问题。

取消 评论

这个 硬件上 的 mmu,以及操作系统 支持的 多进程,虚拟地址空间,就是起这个作用,解决这个问题的 。这样,两个进程,有两个独立的地址空间,相互不会干扰,虽然有可能引用了同一地址,但经过每个 进程的 页表 映射 以后,映射到 不同的 物理地址 上去。这样的例子,典型的有linux 操作系统

某些实时 操作系统,不支持虚拟地址空间,所以,所有在系统上运行的 程序,必须一次性编译好,这样才不会有地址方面的冲突,这样的系统,不支持操作系统启动以后,再加载应用程序 。没有mmu 的 cpu 都采用这样的 操作系统,比如ecos

取消 评论

谁告诉你的?是每个映像加载到一块内存,也就是简单算是一个可执行文仲eⅹe或dll什么的,内存不够就加载不了,不过有页面文件,会把一些暂时不用的的进程占用的内存保存到磁盘,空出来的内存再加载新程序,切换时直接从磁盘恢复,所以内存用90%以上时,切换程序就卡

取消 评论

写时拷贝

取消 评论

实模式下,程序中有个重装载地址表,程序装载到内存时,按实际装载地址对表中指定位置进行地址修改。

虚拟内存模式下就不用担心了,每个程序都有独立的地址空间,由操作系统将虚地址映射到物理地址。

取消 评论

通俗说,这好比各个小区都有101房号,会冲突不。

程序的地址并不是绝对地址,而是相对地址。操作系统给运行的程序先安排起始地址存放在某寄存器中,再从相对地址0开始安排程序的相对地址。

安排的程序起始地址不同,不会冲突的。

绝对地址=起始地址+相对地址

取消 评论

首先,操作系统下的c程序在编译过程中,并不会将自己的数据占用的内存地址,变成一个绝对地址码,而是一个相对地址码。程序数据使用的所有地址都是被编译为: “基地址+偏移量”这样的形式。程序的基地址在不运行时为0,通常被隐藏,你看到的其实就是偏移量。

在操作系统下运行c程序时,系统会按照程序的内存使用量,给这个程序分配一块内存区域,也就是从地址A开始的一段内存空间。这个地址A,就是程序的基地址,也是首地址。假设一个程序编译完成后,需要占用20k的运行空间,当他运行时,系统就会给他规划一块20k的空间,但基地址并非固定的,而是系统根据当时的内存状况随机分配的。只有当程序运行时,其相对地址才会变成绝对地址,而且每一次运行,同一数据的绝对地址都会不一样。系统一般不会让一个程序的运行空间和另一个程序的空间发生干涉,那会带来太多不可控的后果。

当然,如果你是直接对硬件编程的话,数据地址也有可能被直接编译为绝对地址码,例如各种单片机C程序。但那就是另一个故事了。

取消 评论
加载全部10个答案 加载中...
ZOL问答 > 空调 > 格力空调 > 格力云锦天猫精灵语言互联空 > c语言程序经过编译后,每条指令都有一...

举报

感谢您为社区的和谐贡献力量请选择举报类型

举报成功

经过核实后将会做出处理
感谢您为社区和谐做出贡献

c语言程序经过编译后,每条指令都有一个内存地址,那两个程序如果有相同内存地址的指令怎么办?

点击可定位违规字符位置

扫码参与新品0元试用
晒单、顶楼豪礼等你拿

扫一扫,关注我们
提示

确定要取消此次报名,退出该活动?