gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:28 29 4
gpt4 key购买 nike

我知道内核模式栈是用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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com