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

当发生系统调用、产生异常,外设发生中断等事件时,会发生用户栈和内核栈之间的切换,本文从系统调用角度分析用户栈与内核栈的切换。
系统调用的演变
x86 的系统调用经历了 int / iret 到 sysenter / sysexit 再到 syscall / sysret 实现方式的转变,关于具体的演化和区别、系统调用的其他细节等将在以后的系统调用专栏里分析。本文从系统调用最原始的int 0x80开始分析用户栈与内核栈的切换,重点看系统调用过程用户栈与内核栈切换的过程中的一些细节。
系统调用-分析从用户栈切换内核栈
内核syscall 入口代码在entry_64.s中:
//arch/x86/entry/entry_64.sentry(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, %rsicall 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 */

恒讯科技分析:如何在Linux上使用rm命令删除文件和目录?
铁硅铝磁环电感通电后发热严重如何解决
星形接法为什么是220v 电机星形接法和三角形接法优缺点
微软+骁龙835=新Windows10 台式机来了!就问Intel你怕不怕?
宝马推出具有隐形控制功能的电动无人驾驶汽车
系统调用:用户栈与内核栈的切换(上)
Wifi无线插座给我们生活带来的变化!
什么是发光二极管
多重因素推动海外充电桩市场起飞,国内企业出海前要做哪些准备?
为阻止特朗普蝉联,硅谷科技行业砸钱助拜登
乐视莫干山超级汽车项目今日动工,计划年产40万量整车?
色深,灰度,什么是色深,灰度
预测到2023年 门禁系统市场规模将有望达到294亿元
具有Visuino的HMC5883L指南针
虹科案例 | 日产X-Trail压电式喷油器故障
深圳比克电池公司企业理念
车路协同体系的完善加速智能网联汽车产业的落地
如何构建一个简单的12V至19V升压转换器电路
一种异质多传感器的异步量测融合算法验证
直线马达3D打印的番茄闹钟了解下