全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

系统调用:用户栈与内核栈的切换(上)

时间:2023-07-31 11:27

人气:

作者:admin

标签: 内核 

导读:当发生系统调用、产生异常,外设发生中断等事件时,会发生用户栈和内核栈之间的切换, 本文从系统调用角度分析用户栈与内核栈的切换。 系统调用的演变 x86 的系统调用经历了 in...

当发生系统调用、产生异常,外设发生中断等事件时,会发生用户栈和内核栈之间的切换,本文从系统调用角度分析用户栈与内核栈的切换。

系统调用的演变

x86 的系统调用经历了 int / iret 到 sysenter / sysexit 再到 syscall / sysret 实现方式的转变,关于具体的演化和区别、系统调用的其他细节等将在以后的系统调用专栏里分析。本文从系统调用最原始的int 0x80开始分析用户栈与内核栈的切换,重点看系统调用过程用户栈与内核栈切换的过程中的一些细节。

系统调用-分析从用户栈切换内核栈

内核SYSCALL 入口代码在entry_64.S中:

//arch/x86/entry/entry_64.S
ENTRY(entry_SYSCALL_64)
 UNWIND_HINT_EMPTY
 /* Interrupts are off on entry. */
 swapgs
 // 将用户栈偏移保存到 per-cpu 变量 rsp_scratch 中
 movq %rsp, PER_CPU_VAR(rsp_scratch)
 // 切换到进程内核栈
 movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp

 /* 在栈中倒序构建 struct pt_regs */
 pushq $__USER_DS   /* pt_regs- >ss */
 pushq PER_CPU_VAR(rsp_scratch) /* pt_regs- >sp */
 pushq %r11    /* pt_regs- >flags */
 pushq $__USER_CS   /* pt_regs- >cs */
 pushq %rcx    /* pt_regs- >ip */
GLOBAL(entry_SYSCALL_64_after_hwframe)
 //rax 保存着系统调用号
 pushq %rax    /* pt_regs- >orig_ax */

 PUSH_AND_CLEAR_REGS rax=$-ENOSYS

 TRACE_IRQS_OFF

 /* 保存参数到寄存器,调用do_syscall_64函数 */
 movq %rax, %rdi
 movq %rsp, %rsi
call do_syscall_64  /* returns with IRQs disabled */

上面的汇编指令中先将当前用户栈(用户空间栈顶)记录在CPU独占变量区域里(PER_CPU变量),如下所示:

movq %rsp, PER_CPU_VAR(rsp_scratch)

然后将CPU独占区域里记录的内核栈顶放入rsp/esp寄存器

movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp

就是这么简洁,**上面两句汇编:就 将用户栈顶保存在了当前CPU的rsp_scratch这样一个PER_CPU变量里,完成了用户栈的保存 ,然后 将当前内核栈的地址存放到当前栈指针寄存器中 ,**那么此时栈寄存器指向的就是内核栈的栈顶,由此优雅、完美地完成了用户栈到内核栈的切换!

接下来所有的压栈操作都是在内核栈里操作了,依次将用户空间寄存器压栈,此时也是往内核栈push的, 内核使用struct pt_regs初始化内核栈,也就是通过push保存寄存器的值 (将用户栈信息:用户调用的系统调用号、参数、代码段地址、数据段地址等以struct pt_regs形式压入栈) ,形成一个pt_regs结构 ,如下图(源于上篇文章中的分析):

图片

在栈中顺序固定且倒序压栈(在x86_64中,内核栈rbx rbp r12 r13 r14 r15不是必须保存的项(为了访问不越界相应空间必须保留),根据需要保存,linux后续版本采取都保存方式),其中rax保存系统调用号

//rax 保存着系统调用号
 pushq %rax    /* pt_regs- >orig_ax */
温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信