Linux内核之系统调用

59 篇文章 1 订阅
1. 应用程序通过API而不是直接调用系统调用来编程;



2. getpid()系统调用示例:

asmlinkage long sys_getpid(void)

{

return current->tgid;

}

asmlinkage 编译器仅从栈中提取参数

系统调用的命名规则:sys_syscallname()



3. 每个系统调用都对应一个唯一的系统调用号,如果系统调用被删除,但它占用的系统调用号不回收。



4. 系统调用通过软中断实现(int $0x80),通过引发一个异常陷入懂啊内核态去执行异常处理程序system_call。最近的x86处理器已经支持了sysenter指令。



5. 参数和返回值通过寄存器来传递。



6. 指针参数的合法性验证:

(1)指针指向的内存区属于用户空间;

(2)指针指向的内存区在进程的地址空间里;

(3)指针指向的内存区必须被标记为可读(读)/可写(写)。

系统提供了两个方法来完成内核空间与用户空间的数据拷贝:copy_to_user()和copy_from_user()。



7. 内核执行系统调用的时候处于内核上下文,此时内核可以休眠并可以被抢占。



8. 系统调用必须编译进内核映像,不能编译成模块。



9. 通常通过C库来使用系统调用(包含头文件并链接相应的库),但也可以通过宏来直接访问系统调用,如open()的调用:

先通过下面的宏将系统调用扩展为内嵌汇编的C函数:

#define_NR_open 5

_syscall3(long, open, const char*, filename, int, flags, int, mode)

这样,应用程序就可以直接使用open()了。


转自<http://www.cnblogs.com/feisky/archive/2011/12/11/2284060.html>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值