zStack

zStack

马上订阅 zStack RSS 更新: https://blog.noicdi.com/atom.xml

【xv6】system call

2022年8月19日 17:00

system call 调用过程

sleep 为例,追踪整个调用过程。启动 GDB 后,在 user/sleep.cmain() 处打上断点,然后在命令行中输入指令 sleep 25,会调用 user/user.h 声明的 sleep()

xv6-systemcall-1

步入后会调用 user/usys.S,可以看到 sleep 的调用汇编代码。首先将 SYS_sleep 的值写入寄存器 a7,然后调用 ecall 指令陷入内核态,进入真正的 system call,最后通过 ret 返回到用户级程序。

user/usys.S 的汇编代码由 user/usys.pl 脚本生成。

xv6-systemcall-2

寄存器 a7 可以看到值最终修改为 13,对应了 kernel/syscall.hSYS_sleep 的值。

xv6-systemcall-3

调用 ecall 会切换到内核态,并调用 kernel/syscall.c/syscall(),获取 a7 中的调用号,然后根据调用号,在 *syscalls[] 中寻找对应的系统调用 sys_sleep()

xv6-systemcall-4

xv6-systemcall-5

在找到对应的系统调用 kernel/sysproc.c/sys_sleep() 并执行后,会在其中获取保存在寄存器中的参数,并执行真正的实现 kernel/proc.c/sleep()

xv6-systemcall-6

如何实现一个 system call

以即将实现的 trace()...

剩余内容已隐藏

查看完整文章以阅读更多