⑴ 高级语言源程序编译后产生的地址是逻辑地址还是物理地址
由于操作系统技术的发展,可重用二进制程序技术使用了内存重定位技术,所以从汇编的角度来看即不是逻辑地址也不是物理地址。而且这个概念有些不同,编译后产生的地址是相对地址,是相对于可执行头部位置的地址。而逻辑地址是指在指令系统内部使用的用来访问内存的一个逻辑表示,通常表现为相对于某个段基地址的偏移量。
当可执行程序被载入内存之后,才会有逻辑地址存在,此时可执行程序被如何加载于何处,地址为多少,由操作系统决定,此时cpu访问程序用的是逻辑地址。一个程序一旦被编译确定之后基本上变量初始化的顺序固定,资源分配位置也固定,设置有编译器使用预分配机制,然后采用相对地址引用。
注意:某些工具书也称二进制可执行文件内所有的相对地址范围是逻辑地址空间,相对地址就是逻辑地址。因为两者的访问方式相似,逻辑地址变换依赖cpu或者附加变换机构(硬件),而二进制程序地址空间变换需要操作系统插手管理。
反汇编分析中常常将二进制内部地址称为逻辑地址,因为反汇编器不能还原原来汇编代码的地址跳转空间特性,因此得到一个相对于二进制数据起点位置的相对地址,而和内存和物理存储都没有关系。
⑵ 什么是逻辑地址,什么是物理地址,它们之间有什么关系
http://ke..com/view/893778.htm
http://ke..com/view/883168.htm
这是网络里的介绍 我就不复制了
然后说下我自己的理解吧
在计算机存储单元中,是以字为单位存储的,而且数目众多,管理起来必须需要地址
逻辑地址为人可以理解的地址,分为段地址和基地址
段地址顾名思义,就是对大段的空间编排的地址如4G个字的内存空间,需要2^32个地址表示
把每2^16个空间分为一段,则一共有2^16个段,给每段一个地址,每段中每个单元一个偏移地址
则段地址1-2^16,确定大段位置,偏移址1-2^16就确定了单元位置
具体表示时 2^16 可用四位十六进制数表示
举例来说 实际物理地址 000a 0001 H (16进制的意思)的单元,是实际的地址
段地址000aH 偏移址0001 H ,这两个是逻辑地址,经过人为分段
实际中这样使用比较少 一般为段地址左移4位(乘以16)加上偏移址为物理地址,表示16M字空间
微机原理学得有点早了 可能有疏漏的地方 大概意思应该是对的
⑶ 在计算机编程中,我们知道在编译器里使用的是逻辑地址,但是CPU访问要用到实际物理地址,那这个地址是
计算机的cpu里面都有一张tlb映射表,是一种缓存。
当cpu接收到应用程序传过来的虚拟地址的时候,根据这张表转换成物理地址再去访问。是cpu边执行边换转的。
具体楼主可以搜索一下tlb的相关知识。
⑷ C语言:全局变量和局部动态变量,编译后逻辑地址就确定了吗
对啊,整个程序运行的地址要在运行时由操作系统来分配的,而逻辑地址则是在编译时就定下了。
⑸ 操作系统中 区分编译后的形成逻辑地址和链接后的形成的最终逻辑地址 什么意思啊
编译后产生若干个目标模块,编译后的逻辑地址指的是每个模块都从0号单元开始编址,而链接将这些模块链接在一起,形成一个完整的装入模块,此时的逻辑地址会重新编址,也就是说链接后的逻辑地址是将整个模块从0号单元开始编址。
⑹ 什么是物理地址和逻辑地址是如何产生的
这个问题啊,是网络运行必须有的
物理地址就是MAC地址,是网卡上自带的,全球唯一的地址,计算机在进行数据通讯的时候需要进行数据的封装和导址的,在OSI七层模型中是属于数据链路层的
逻辑地址就是IP地址,是虚拟的,实际不存在的,它在网络中用来定义不同的网络,使其不会发生数据混乱.在OSI七层模型中属于第三层网络层的.
它们都是网络产生初期随着OSI七层模型的建立而产生的.
⑺ 在编译时为内存分配了逻辑地址,之后连接生成了可执行文件,逻辑地址在运行时会发生变化吗
应该不会冲突,每个程序在内存中占用的空间都是独立的,逻辑地址只是在它自己的空间里的相对地址,正常情况下不会有交集。
⑻ 请问程序在编译和链接的时候,逻辑地址是否是连续的请高手解答。谢谢。
函数内部是连续的吧,因为一起分配的栈; 不同函数的栈可能就不连续了啊
⑼ C语言的&运算符取的是逻辑地址还是物理地址 每次重新编译运行后 输出变量的地址值都一样 怎么理解
您需要了解一下操作系统的虚拟内存机制。
操作系统会为新建立的每一个进程开辟一个独立却完整的地址空间(32位机器是4GB),其中除了一部分地址要交给操作系统的内核或用于某些特殊功用,程序可以自由地使用这些内存,就好像每个进程可以独自使用一台4GB内存的机器一样。但是要注意这是由操作系统虚拟出来的,系统的内存管理器要负责把这些虚拟的内存映射到真实的物理内存中。系统往往同时运行很多进程,要把真实的内存给每个进程都分配4GB当然不可能,所以系统往往还要借用硬盘来存放物理内存存不下的内容,协助虚拟内存的实现。实际的物理内存的状况是:零散无规律地分布着各个进程的内存页面。
当一个新进程启动时,操作系统首先为该进程创建虚拟内存空间,然后把程序的代码段和一部分数据放在固定的虚拟内存地址上。你说的那个变量A就是被包含这部分数据中,每次启动程序都可以看到它在一个固定的地址上,但是这个地址是在虚拟内存中的,实际它所对应的真实物理内存的地址是未知的,只有管理内存的系统内核知道。
当然,还有一部分数据在你的虚拟内存空间的地址也是未知的,这就是堆,堆允许程序在运行过程中动态分配和释放内存(其他的内存分配方式在程序启动时就在固定位置分配,不能改变),堆的分配和释放由C运行时库和操作系统协同管理,分配的内存地址是随机的。你说的那个变量A不是堆中的。
你说的逻辑地址就是在虚拟内存中的地址,物理地址就是在真实的物理内存中的地址。
对于以上有不懂的概念名词可网络查资料。
⑽ C语言,所有变量的逻辑地址都是编译后确定的吗
是的。程序都是在运行阶段分配内存,所有变量的逻辑地址都是在编译后就确定了,但都是相对的偏移地址,只不过全局变量是相对数据段的偏移,局部变量是相对程序栈顶的偏移。