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

时间:2018-10-11 17:16:36

标签: linux kernel

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

1 个答案:

答案 0 :(得分:0)

它存储在内核堆栈中。 Linux syscall进入代码非常冗长,尤其是现在它正在执行一些减轻幽灵和崩溃的措施,但是您可以查看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分别用于访问用户空间和内核空间中的线程本地数据。