【发布时间】:2020-07-10 09:58:09
【问题描述】:
我是linux系统编程的新手。我的问题是:
- 当我们运行命令“nm a.out”时,地址类型是什么? 地址?
- 是否有 linux 工具可以查看所有类型的地址 - 例如是否有工具可以查看所有类型的地址? 查看逻辑地址 - 线性地址 - 虚拟地址?
- 这段代码中地址&x的类型是什么:
int x;
printf("%p", &x);
【问题讨论】:
我是linux系统编程的新手。我的问题是:
int x;
printf("%p", &x);
【问题讨论】:
在 x86_64 CPU 中,有 3 种地址:
逻辑地址(0x08:0x12345678):这种地址有段:偏移量格式。 segment部分控制权限(kernel、user)、mode(32bit或64bit)、base、limit。偏移部分是该段的偏移量。逻辑 -> 线性地址转换为:线性地址 = 段基址 + 偏移量。在64位模式下,所有段的base=0和limit=0xffffffff,被cpu忽略(fs和gs段除外),这使得所有逻辑地址=线性地址
线性地址(虚拟地址):这是现代操作系统使用的地址,因为它对于 64 位长模式是强制性的
物理地址:先到系统总线再到 RAM 的地址
关于您的问题:
我们运行命令“nm a.out”时的地址类型是什么 - 是逻辑地址吗?
这段代码中地址&x的类型是什么:int x; printf("%p", &x);
是否有 linux 工具可以查看所有类型的地址 - 例如是否有工具可以查看逻辑地址 - 线性地址 - 虚拟地址?
【讨论】:
在用户空间中,您正在处理线性寻址,其中线性地址 == 逻辑地址 == 虚拟地址。换句话说,只有一个地址空间。如果您有两个具有相同值的指针,则它们指向内存中的同一个对象。
【讨论】: