【问题标题】:Where does an ARM Linux store the current kernel SP while in user mode?ARM Linux 在用户模式下将当前内核 SP 存储在哪里?
【发布时间】:2015-10-09 16:15:09
【问题描述】:

我有以下情况:一个Linux操作系统(ARM)运行在一个虚拟平台上,一个简单的程序在操作系统内启动,断点在某个符号上。当这个断点被命中时,我们就进入了用户空间。

我的问题是:全面了解(当前运行的)进程(即内核 + 用户空间)的整个虚拟内存,我能否以某种方式找出 @987654321 的地址@ 或 thread_info 位于内核堆栈(底部)的结构?我知道在内核模式下,可以在 SP 上使用掩码来获取内核堆栈的底部,但是如果 SP 指向用户空间中的某个东西,这将不起作用。本质上,我正在尝试做类似于内核中的 current / current_thread_info() 宏的事情。

我认为这很难/不可能的原因是因为内核堆栈地址是随机的,因此会随着每个新进程而变化。

我需要避免的事情:

  1. 系统调用:操作系统、内核和进程被“冻结”,我们拥有内存的静态视图
  2. 调用任何需要运行操作系统的函数

【问题讨论】:

  • 是的,回到旧的 DOS 时代,每个进程都可能破坏系统。哎呀,我希望没有办法做到这一点!
  • 现在问真正的问题。
  • 可能是 /proc/self/task/ threadid /maps 它不会很快,就像内核宏一样。
  • 我看不出误导性标题与问题的关系,这似乎是关于调试已停止的 VM 或模拟系统 - 如果您从管理程序/模拟器级别获得“外部”调试访问权限,那么您拥有比“来自用户模式”所暗示的更多的权力——这需要澄清。也就是说,必须有可能从已停止目标上的活动内核中删除所有当前任务及其堆栈,因为我使用的调试器正是具有该功能;我从来没有研究过它如何管理它的细节,虽然......
  • 这归结为:ARM架构在用户模式下将当前内核SP保存在哪里。

标签: linux linux-kernel arm


【解决方案1】:

要在目标处于用户空间时确定主管模式 SP,您需要检查 R13_svc 寄存器。

如果您采用该值并将 13 个最低有效位设置为零,则您应该拥有当前线程的 struct thread_info 的虚拟地址。

【讨论】:

  • 完美,这就是我想要的。只是为了确保:该寄存器中保存的 SP 指向当前运行进程的内核堆栈中的地址,对吗?我会在星期一验证并标记为已接受。
  • @zbarni:据我所知,但实际上从未完全按照您的要求完成,我很想知道进展如何。
  • 主管模式SP的地址确实在r13_svc(我需要的),但是即使在这个虚拟平台上,内核空间也无法使用user mode中的核心。但是,将核心更改为system mode(设置模式位)解决了这个问题。
猜你喜欢
  • 2019-03-16
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 2021-08-17
  • 2010-10-02
  • 2017-05-23
  • 2015-05-05
  • 1970-01-01
相关资源
最近更新 更多