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