Linux系统调用

系统调用可以简单说是用户程序使用系统资源的接口,但是用户程序一般都不是直接调用系统调用,而是通过系统API、C库等间接调用,执行内陷命令,进入核心态执行。[img]http://dl.iteye.com/upload/picture/pic/80902/96c4277d-75e7-376a-bdda-20b356cc9e98.jpg[/img]

在Linux系统中,每个系统调用被赋予一个系统调用号。这样,通过这个独一无二的编号就可以关联一个系统调用。用户空间程序需要调用系统调用时,只需要给出其对应的系统调用号就可以。内存记录了系统调用表中所有已经注册过的系统调用的列表,存储在sys_call_table中。

用户程序通过软中断实现内陷操作。通过引发一个异常来促使系统切换到内核态去执行异常处理程序。在x86上,内陷之前,需要通过eax寄存器把系统调用号传递到内核。sys_call()函数通过给定的系统调用号与NR_syscalls做比较来检查其有效性。如果它大于或者等于NS_syscalls,该函数就返回-ENOSYS。否则执行相应的系统调用。一般情况下,系统调用都需要传递参数,在x86下,通过ebx,ecx,edx,esi和edi传递依次为1到5的参数。

系统调用必须检查它们所有的参数是否合法。(因为这是要在内核态运行的)。Linux系统一般提供两个方法来完成必须的检查和内核空间与用户空间的数据的来回拷贝。copy_to_user()/copy_from_user(),这俩个方法都需要三个参数,(src,dst,length)。

绑定一个自定义的系统调用,如:
asmlinkage long sys_getPID(){return current->tgid}

首先我们需要把sys_getPID加入系统调用表中,见entry.s文件。依次得到系统调用号,把系统调用号加入asm/unistd.h文件中。最后我们要实现这个系统调用,可以把它放进kernel/sys.c或者kernel/sched.c文件中。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值