Debugging 内核oops消息-地址

Debugging 内核oops消息-地址,debugging,linux-kernel,Debugging,Linux Kernel,在内核学习过程中,我有两个问题: 1) 我想知道内核Oops消息中显示的地址是虚拟的还是物理的?(我认为这些应该是虚拟的,只要CPU使用虚拟地址空间运行并且MMU重新映射?) 2) 我的平台是基于ARM的,它支持MMU,但是当我查看内核模块加载地址时,我看到: # cat /sys/module/mydrv/sections/.data 0xbf00b4f4 # cat /sys/module/mydrv/sections/.text 0xbf006000 这些地址不应该类似于0xFFFFFF

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

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

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

# cat /sys/module/mydrv/sections/.data
0xbf00b4f4
# cat /sys/module/mydrv/sections/.text
0xbf006000
这些地址不应该类似于0xFFFFFF011000、0xFFFFFFFF011B948吗?我的意思是,在我的理解中,虚拟内存地址应该更大,从而提供更大的虚拟地址空间?我还是个新手,当然不完全了解VM和MMU:)

谢谢你的评论,谢谢

Mark

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

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

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


不,除非您使用的是新的64位armv8体系结构,否则您只能看到32位地址:-),因此答案取决于您使用的体系结构以及您是否使用3G/1G与2G/2G内核拆分。[大多数linux机器配置为内核占用4G地址空间的上1G(0xc0000000-0xFFFFFF),进程使用下3G(0x00000000-0xBFFFFF)。但是,有些机器配置为2G/2G拆分,内核占用上2G(0x8000000-0xFFFFFF),进程使用下2G(0x00000000-0x7fffffff)。我认为内核配置VMSPLIT_3G/VMSPLIT_2G设置了这个]。

Bandicoot,非常感谢。内核启用了config_VMSPLIT_3G,即1G用于内核内存空间,3G用于用户内存空间——正如您所描述的。但是我不明白为什么内核模块加载了用户空间地址(查看我原始消息中的/sys/module/mydrv/sections/output)。我对此不确定。我希望您启用了2G拆分,这可以解释为什么内核模块地址低于0xc0000000