在用户模式下,ARM Linux 将当前内核 SP 存储在哪里?
Where does an ARM Linux store the current kernel SP while in user mode?
我有以下情况:LinuxOS(ARM)在虚拟平台上运行,在OS中启动了一个简单的程序,在某个断点处象征。当命中断点时,我们在用户 space.
我的问题是:全面了解(当前运行)进程(即内核+用户space)的整个虚拟内存, 我能以某种方式找出位于内核堆栈(底部)的 task_struct
或 thread_info
结构的地址吗?我知道在内核模式下,可以在 SP 上使用掩码来获取内核堆栈的底部,但是如果 SP 指向用户 space 中的某些内容,这将不起作用。本质上,我正在尝试做一些类似于内核中的 current / current_thread_info() 宏的事情。
我认为这很难/不可能的原因是因为内核堆栈地址是随机的,因此会随着每个新进程而变化。
我需要避免的事情:
- 系统调用:OS、内核和进程是 'frozen',我们有内存的静态视图
- 调用任何需要 运行 OS
的函数
要在目标位于用户空间时确定管理员模式 SP,您需要检查 R13_svc
寄存器。
如果您采用此值并将 13 个最低有效位设置为零,则您应该具有当前线程的 struct thread_info
的虚拟地址。
我有以下情况:LinuxOS(ARM)在虚拟平台上运行,在OS中启动了一个简单的程序,在某个断点处象征。当命中断点时,我们在用户 space.
我的问题是:全面了解(当前运行)进程(即内核+用户space)的整个虚拟内存, 我能以某种方式找出位于内核堆栈(底部)的 task_struct
或 thread_info
结构的地址吗?我知道在内核模式下,可以在 SP 上使用掩码来获取内核堆栈的底部,但是如果 SP 指向用户 space 中的某些内容,这将不起作用。本质上,我正在尝试做一些类似于内核中的 current / current_thread_info() 宏的事情。
我认为这很难/不可能的原因是因为内核堆栈地址是随机的,因此会随着每个新进程而变化。
我需要避免的事情:
- 系统调用:OS、内核和进程是 'frozen',我们有内存的静态视图
- 调用任何需要 运行 OS 的函数
要在目标位于用户空间时确定管理员模式 SP,您需要检查 R13_svc
寄存器。
如果您采用此值并将 13 个最低有效位设置为零,则您应该具有当前线程的 struct thread_info
的虚拟地址。