【问题标题】:Tools to view logical address查看逻辑地址的工具
【发布时间】:2020-07-10 09:58:09
【问题描述】:

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

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

【问题讨论】:

    标签: c linux unix memory nm


    【解决方案1】:

    在 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 工具可以查看所有类型的地址 - 例如是否有工具可以查看逻辑地址 - 线性地址 - 虚拟地址?

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-05
        • 1970-01-01
        • 2012-03-10
        • 1970-01-01
        • 2019-04-05
        相关资源
        最近更新 更多