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

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

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

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

时间:2023-07-31 11:29

人气:

作者:admin

标签: 内核 

导读:...

接下来:call
do_syscall_64,进入do_syscall_64函数:

__visible void do_syscall_64(struct pt_regs *regs)
{
 struct thread_info *ti = current_thread_info();
 unsigned long nr = regs- >orig_ax;

 enter_from_user_mode();
 local_irq_enable();

 if (READ_ONCE(ti- >flags) & _TIF_WORK_SYSCALL_ENTRY)
  nr = syscall_trace_enter(regs);

 /*
  * NB: Native and x32 syscalls are dispatched from the same
  * table.  The only functional difference is the x32 bit in
  * regs- >orig_ax, which changes the behavior of some syscalls.
  */
 if (likely((nr & __SYSCALL_MASK) < NR_syscalls)) {
  regs- >ax = sys_call_table[nr & __SYSCALL_MASK](
   regs- >di, regs- >si, regs- >dx,
   regs- >r10, regs- >r8, regs- >r9);
 }

 syscall_return_slowpath(regs);
}

上述函数的主逻辑很简单:

1、 通过之前保存下来的pt_regs(往内核栈中格式化压入的),获取用户传入的系统调用号nr,系统调用号保存在了regs->orig_ax:

unsigned long nr = regs- >orig_ax;

2、 通过系统调用号nr,执行对应的回调函数,sys_call_table是函数指针数组,不同nr对应不同系统调用对应的函数。其中regx->di、regx->si、regs->dx、regs->r10、regs->r8、regs->r9分别是之前保存到内核栈(以struct
pt_regs格式化)保存到pt_regs中的,对应着用户传入该系统调用的参数1~6:

if (likely((nr & __SYSCALL_MASK) < NR_syscalls)) {
  regs- >ax = sys_call_table[nr & __SYSCALL_MASK](
   regs- >di, regs- >si, regs- >dx,
   regs- >r10, regs- >r8, regs- >r9);
 }

以上就完成了用户调用系统调用,并从用户栈切换到内核栈,并执行到系统调用号对应函数的过程。 具体的系统调用相关细节将在以后系统调用相关文章中分析。

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

上面分析到了执行系统调用对应的函数,如下所示,并将返回值保存在regs->ax中了

regs- >ax = sys_call_table[nr & __SYSCALL_MASK](
   regs- >di, regs- >si, regs- >dx,
   regs- >r10, regs- >r8, regs- >r9);

函数执行到do_syscall_64->syscall_return_slowpath(regs),开始为返回用户态做准备.

并最终回到系统调用 内核SYSCALL 入口:ENTRY(entry_SYSCALL_64)->return_from_SYSCALL_64,继续完成系统调用返回工作,并切换用户栈与内核栈,使用struct pt_regs恢复用户态寄存器值。

总之

用户栈——>内核栈 cpu保存用户当前堆栈信息保存到内核的栈中(恢复时用到),然后将cpu指向内核堆栈,去执行内核代码。完成用用户栈到内核栈转换。

内核栈——>用户栈 再切换到内核堆栈前,将用户堆栈信息压入到内核栈中,内核函数执行完回退栈帧,会将用户的堆栈信息POP出栈,然后cpu堆栈寄存器就知道怎么回去了,返回的用户程序中断的地方继续执行。

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

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

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

关注微信