关于跟踪程序时的地址问题。。。。

你我他111 2004-10-10 10:20:33
不管是 MS windows 还是 linux下,在单步
跟踪一段程序的时候,我们可以在调试窗口看到变量的
地址,那么,这个地址是虚拟地址,还是实际的物理地址?
假如在DOS下面跟踪,看到的又是什么呢?
...全文
55 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
akyca 2004-10-10
  • 打赏
  • 举报
回复
应该算是偏移地址

调试窗口一般都会显示当前的段,和段相关的一个概念是段基址。那么在当前显示的数据和代码地址都是其虚拟地址减去段基址之后的偏移量。这是Windows系统的情况。

Linux系统2.4.20的内核没有使用分段的机制,仅仅采用了二级页表来管理内存。因此调试窗口看到的应该是虚拟地址。

你我他111 2004-10-10
  • 打赏
  • 举报
回复
前面各位大哥的意思都是指偏移地址了,
那么我就这样理解了:
全局变量的地址是相对于数据段的地址(由DS标志基址)
局部变量的地址是相对于栈的偏移量(由SS标志基址)

还有一个疑问,就是动态分配的变量(它是从堆中分配的)的地址
是相对什么的呢,由哪个寄存器标志?
sharkhuang 2004-10-10
  • 打赏
  • 举报
回复
当然是虚地址啊
smaxll 2004-10-10
  • 打赏
  • 举报
回复
linux中也是虚拟地址,
全局变量地址是相对于数据段的偏移量
局部变量运行时储存于栈地址空间。

由操作系统为进程分配实际的物理内存,并记录到该进程的页表。
虚拟地址转化为线性地址,并由CPU传入MMU单元进行页表查询,
最后生成32位物理地址。

对程序来说,内存是由操作系统动态分配的,物理地址没有意义

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧