图解Linux系统调用

在Linux下面,我们经常调用系统API来完成内核的操作,例如调用open打开一个文件。

这个过程看似简单,其实已经包括了一次从用户态到内核态,然后由内核态返回用户态的过程。

当然用户不会直接调用系统调用,而是调用glibc中的函数open打开文件。

在glibc中维护了一张表格,在syscalls.list里面,是c函数到系统调用的映射。

编译的过程会将这个映射表格变成代码。

真正调用系统调用的时候,会将参数放入CPU寄存器中,然后通过trap陷入内核,这里调用的是syscall。

ENTRY (syscall)

movq %rdi, %rax /* Syscall number -> rax.  */

movq %rsi, %rdi /* shift arg1 - arg5.  */

movq %rdx, %rsi

movq %rcx, %rdx

movq %r8, %r10

movq %r9, %r8

movq 8(%rsp),%r9 /* arg6 is on the stack.  */

syscall /* Do the system call.  */

cmpq $-4095, %rax /* Check %rax for error.  */

jae SYSCALL_ERROR_LABEL /* Jump to error handler if error.  */

ret /* Return to caller.  */

在内核中,也是有一个sys_call_table数组的。

数组中的内容来自与syscall_64.tbl,这是一个文本,编译的时候会将里面的系统调用名称放入代码中。

在内核中首先从CPU寄存器中拿到系统调用号,然后在这个表中查找open系统调用对应的内核函数,经过查抄对应的是sys_open,于是开始调用sys_open真正的打开一个文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值