linux - 在 linux 中,用户模式堆栈存储在哪里?

标签 linux linux-kernel x86 kernel stack-pointer

我知道内核模式栈是用task_struct结构的thread_info结构存储的。 但是用户模式堆栈存储在哪里。 我想,它将作为内存区域存储在进程地址空间中,因为在页面错误期间,内核会检查错误是否是由于用户堆栈扩展引起的。 我需要有关用户堆栈的更多详细信息。 ss(stack segment register)的作用是什么

最佳答案

它存储在内核堆栈中。 Linux 系统调用入口代码非常复杂,尤其是现在它正在执行一些幽灵和崩溃缓解措施,但您可以查看 entry_SYSCALL_64 的定义。 .

具体来说,此序列将用户态线程的状态保存到内核堆栈。它正在构建 struct pt_regs 的最后一部分稍后将传递给 do_syscall_64 的结构。

/* Construct struct pt_regs on stack */
pushq   $__USER_DS              /* pt_regs->ss */
pushq   PER_CPU_VAR(cpu_tss_rw + TSS_sp2)   /* pt_regs->sp */ // This is where it's put on the stack.
pushq   %r11                    /* pt_regs->flags */
pushq   $__USER_CS              /* pt_regs->cs */
pushq   %rcx                    /* pt_regs->ip */
GLOBAL(entry_SYSCALL_64_after_hwframe)
pushq   %rax                    /* pt_regs->orig_ax */

PUSH_AND_CLEAR_REGS rax=$-ENOSYS

至于ss寄存器,在x86有虚拟内存之前,就有段的想法。每个程序都会存在于它自己的一系列内存段中。每个段寄存器(ss、gs 等)都在全局描述符表中保存一个索引,该表确定段从哪里开始以及它具有什么权限。 ss 保存堆栈的段。如果您尝试在 esp 指向堆栈段之外的情况下进行压入、弹出或调用,您将获得分段异常。现在 x86_64 ss 和大多数其他分段寄存器大多是残留的,除了 fs 和 gs 分别用于访问用户空间和内核空间中的线程本地数据。

关于linux - 在 linux 中,用户模式堆栈存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52765688/

相关文章:

linux - 通过 ssh 运行持久化进程

Linux套接字编程调试?

linux - GNU 汇编程序 sys_write 不工作

x86 - IA-32中的基本数据类型是什么?

c - 在 C 中调用系统调用函数的问题

assembly - 如何通过AND运算得到SF = 1?

linux - 内核空间中的优先级

linux - 在单个 session 中运行 VSCode 任务

linux - 特定端口的 tcp 连接列表

linux - linux-2.6.38.1.tar.xz、linux-2.6.38.2.tar.xz等文件名中 'linux-2.6.38.'后面的数字是什么意思?