【问题标题】:kernel oops messages - addresses内核 oops 消息 - 地址
【发布时间】:2012-10-19 17:10:06
【问题描述】:

在学习内核的过程中,我有两个问题:

1) 我想知道内核糟糕消息中显示的地址是虚拟的还是物理的? (我认为这些应该是虚拟的,只要 CPU 使用虚拟地址空间运行并进行 MMU 重新映射?)

2) 我的平台是基于 ARM 的,它支持 MMU,但是当我查看内核模块加载的地址时,我看到了:

# cat /sys/module/mydrv/sections/.data
0xbf00b4f4
# cat /sys/module/mydrv/sections/.text
0xbf006000

这些地址不应该是 0xffffffffa0110000、0xffffffffa011b948 之类的吗?我的意思是,在我的理解中,虚拟内存地址应该更大,从而提供更大的虚拟地址空间?同样,我是新手,当然不完全了解 VM 和 MMU :)

感谢您的 cmets,谢谢。

标记

【问题讨论】:

    标签: debugging linux-kernel


    【解决方案1】:

    1) 我想知道内核糟糕消息中显示的地址是虚拟的还是物理的? (我认为这些应该是虚拟的,只要 CPU 使用虚拟地址空间运行并且 MMU 重新映射?)

    OOPS/panic 堆栈跟踪中显示的地址都是虚拟的

    2) 这些地址不应该是 0xffffffffa0110000、0xffffffffa011b948 之类的吗?我的意思是在我的理解中虚拟内存地址应该更大,从而提供更大的虚拟地址空间?同样,我是新手,当然不完全了解 VM 和 MMU :)

    不,除非您使用新的 64 位 armv8 架构,否则您应该只看到 32 位地址 :-) 所以答案取决于您使用的架构以及您使用的是 3G/1G 还是 2G/2G内核分裂。 [大多数linux机器配置为内核占用4G地址空间的高1G(0xc0000000-0xffffffff),进程使用低3G(0x00000000-0xbfffffff)。但是,有些机器配置了 2G/2G 拆分,内核占用上层 2G (0x80000000 - 0xffffffff),进程使用下层 2G (0x00000000 - 0x7fffffff)。我认为内核配置 VMSPLIT_3G/VMSPLIT_2G 设置了这个]。

    【讨论】:

    • Bandicoot,非常感谢。内核启用了 CONFIG_VMSPLIT_3G,即内核内存空间为 1G,用户内存空间为 3G——正如您所描述的。但是我不明白为什么内核模块加载了用户空间地址(看看我原始消息中的 /sys/module/mydrv/sections/ 输出)。
    • 我不确定。我希望您启用了 2G 拆分,这可以解释为什么您看到内核模块地址低于 0xc0000000
    猜你喜欢
    • 2013-06-15
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 2012-06-13
    • 2014-06-24
    • 2014-11-10
    • 1970-01-01
    相关资源
    最近更新 更多