【发布时间】:2015-10-09 16:15:09
【问题描述】:
我有以下情况:一个Linux操作系统(ARM)运行在一个虚拟平台上,一个简单的程序在操作系统内启动,断点在某个符号上。当这个断点被命中时,我们就进入了用户空间。
我的问题是:全面了解(当前运行的)进程(即内核 + 用户空间)的整个虚拟内存,我能否以某种方式找出 @987654321 的地址@ 或 thread_info 位于内核堆栈(底部)的结构?我知道在内核模式下,可以在 SP 上使用掩码来获取内核堆栈的底部,但是如果 SP 指向用户空间中的某个东西,这将不起作用。本质上,我正在尝试做类似于内核中的 current / current_thread_info() 宏的事情。
我认为这很难/不可能的原因是因为内核堆栈地址是随机的,因此会随着每个新进程而变化。
我需要避免的事情:
- 系统调用:操作系统、内核和进程被“冻结”,我们拥有内存的静态视图
- 调用任何需要运行操作系统的函数
【问题讨论】:
-
是的,回到旧的 DOS 时代,每个进程都可能破坏系统。哎呀,我希望没有办法做到这一点!
-
现在问真正的问题。
-
可能是
/proc/self/task/threadid/maps它不会很快,就像内核宏一样。 -
我看不出误导性标题与问题的关系,这似乎是关于调试已停止的 VM 或模拟系统 - 如果您从管理程序/模拟器级别获得“外部”调试访问权限,那么您拥有比“来自用户模式”所暗示的更多的权力——这需要澄清。也就是说,必须有可能从已停止目标上的活动内核中删除所有当前任务及其堆栈,因为我使用的调试器正是具有该功能;我从来没有研究过它如何管理它的细节,虽然......
-
这归结为:ARM架构在用户模式下将当前内核SP保存在哪里。
标签: linux linux-kernel arm