Linux系统调用学习小结

1API、POSIX、C

      应用程序通过api接口而不是系统调用来编程。

      posix的目标是提供给予unix的可操作系统标准,其定义的操作系统应该为应用程序提供的编程接口。为一个posix的操作系统编写的程序可以在任何其他的posix系统上运行。

      c库实现了posix的绝大部分api

2系统调用

      entry.s中定义的sys_call_table位每一个有效的系统调用制定了唯一的系统调用号

3系统调用处理程序

      用户空间无法直接执行内核代码,不能直接调用内核空间的函数。通过系统调用从用户态进出内核态,通知内核的机制是靠软终中断实现的,通过引发一个异常促使系统切换到内核态执行异常处理程序。x86系统的软中断有int$0x80指令产生,这条指令会触发一个异常切换到内核态并执行128号异常处理程序,128号处理程序为系统调用处理程序即system_call(),在entry.s文件中用汇编语言编写。

     所有系统调用陷入内核的方式一样,如何区别?因此需要把系统调用号一并传给内核。x86通过eax寄存器把系统调用号传给内核,在用户态时就已经放入。system_call()函数通过讲给定的系统调用号与NR_syscalls作比较来检查有效性,当大于等于NR_syscalls时,返回-ENOSYS.

     参数传递:外部参数输入,过寄存器进行参数传递,ebx、ecx、edx、esi、edi。给用户空间的返回值存放在eax寄存器中。

4系统调用的实现

     参数验证:系统调用必须检查他们参数的合法性。比如:与I/o相关的操作检查文件描述符是否有效,与进程相关的函数要检查pid是否有效,最重要的是检查用户提供的指针是否有效。内核提供了两种方法来完成必须的检查和内核空间与用户空间之间的数据的来回拷贝,内核无论如何都不能轻率的的接受来自用户空间的指针。内核提供了copy_to_user()和copy_from_user()来实现。最后一项检查针对是否有合法权限,用capable()函数还不太了解。

5系统调用上下文

   内核在执行系统调用的时候处于进程上下文。(系统调用和异常处理是对内核明确定义的接口,进程只有通过这些接口才能陷入内核执行,对内核所有的访问必须通过这些接口)

   添加一个系统调用:1将系统新添调用函数加入到系统调用表中sys_call_table(),在entry.s中。2把系统调用号加入到<asm/unist.d>.3实现系统调用

   从用户空间访问系统调用,除了通过c库,linux本身提供了一组宏,用于直接对系统调用进行访问,它会设置好纪存希并陷入指令,这个宏是_syscalln().

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值