C 查看逻辑地址的工具

C 查看逻辑地址的工具,c,linux,unix,memory,nm,C,Linux,Unix,Memory,Nm,我是linux系统编程的新手。我的问题是: 当我们运行命令“nm a.out”时,地址类型是什么?是逻辑类型吗 地址 是否有linux工具可以查看所有类型的地址?例如,是否有工具可以 查看逻辑地址-线性地址-虚拟地址 此代码中的地址&x的类型是什么: 在用户空间中,您正在处理线性寻址,其中线性地址==逻辑地址==虚拟地址。换句话说,只有一个地址空间。如果有两个指针具有相同的值,则它们引用的是内存中的同一对象。在x86_64 CPU中,有3种类型的地址: 逻辑地址(0x08:0x123456

我是linux系统编程的新手。我的问题是:

  • 当我们运行命令“nm a.out”时,地址类型是什么?是逻辑类型吗 地址
  • 是否有linux工具可以查看所有类型的地址?例如,是否有工具可以 查看逻辑地址-线性地址-虚拟地址
  • 此代码中的地址&x的类型是什么:

在用户空间中,您正在处理线性寻址,其中线性地址==逻辑地址==虚拟地址。换句话说,只有一个地址空间。如果有两个指针具有相同的值,则它们引用的是内存中的同一对象。

在x86_64 CPU中,有3种类型的地址:

  • 逻辑地址(0x08:0x12345678):此类地址具有段:偏移量格式。段部分控制权限(内核、用户)、模式(32位或64位)、基、限制。偏移部分是到该段的偏移量。逻辑->线性地址转换为:线性地址=段基+偏移量。在64位模式下,所有段都有base=0和limit=0xffffff,cpu会忽略这一点(fs和gs段除外),这使得所有逻辑地址都是线性地址

  • 线性地址(虚拟地址):这是现代操作系统使用的地址,因为它对于64位长模式是必需的

  • 物理地址:发送到系统总线然后再发送到RAM的地址

关于你的问题:

  • 当我们运行命令“nm a.out”时,地址类型是什么?是逻辑地址吗

    • 不,它是线性(虚拟)地址
  • 此代码中地址&x的类型是什么:int x;printf(“%p”、&x)

    • 线性(虚拟)地址
  • 是否有linux工具可以查看所有类型的地址?例如,是否有工具可以查看逻辑地址-线性地址-虚拟地址

    • 不,线性(虚拟)地址->物理地址转换由称为分页结构的结构控制,每个进程都有一个。该结构位于内核空间内,由内核控制,因此用户空间程序无法访问它。但在调试程序时,您可以看到所有的程序线性(虚拟)地址
    int x;
    printf("%p", &x);