Linux内核之系统调用

一.系统调用概念
系统调用(systemcall):操作系统提供给用户程序调用的一组“特殊”接口。通过这些“特殊”接口,用户程序可以获得操作系统内核提供的服务。
举例:
1.文件系统相关(打开,读写以及关闭文件)
2.进程控制相关(创建进程,实现进程调度,进程管理)
3.时钟相关(获得和设置系统时间)
作用:实现用户空间到内核空间的交互,方便用户操作硬件
文件:syscalls.h(2.6.25)
用户编程接口:用户编程过程中提供的各种功能库函数,如打开文件,分配空间
Linux用户编程接口(API)遵循的标准:POSIX(unix中最流行的应用编程界面标准)
系统调用和用户编程接口的区别与联系

系统调用用户编程接口
区别通过软中断向内核态发出一个明确的请求,底层函数定义,说明如何获得一个给定的服务,上层
联系0个,一个或者多个系统调用对应一个用户编程接口一个用户编程接口由0个或者多个系统调用组成

二.系统调用与服务例程的对应关系
系统调用表:系统调用号与内核服务函数的映射,通过系统调用号来调用不同的内核服务例程。
Linux使用sys_call_table表示这张表,表项为对应内核服务例程的指针,下标为该内核服务例程的系统调用号。

三.系统调用过程
举例:
一般情况,用户编程接口abc()对应的服务例程的名字为sys_abc().
系统调用过程如下
1.用户程序调用库函数abc()。
2.系统加载libc库调用索引和参数后,执行init $0x80 或者sysenter汇编指令进入系统调用,执行system_call函数。
3.system_call函数根据传递过来的参数处理所有系统调用。使用sys_call_table[参数]执行系统调用。
4.系统调用返回。
5.执行iret或者sysexit汇编指令两种方式退出系统调用,并调用resume_userspace()函数进入用户空间。
6.继续在libc库中执行,执行完成后返回到用户程序中。

四.系统调用传递的参数
输入输出参数:
1.实际传递的值
2.用户态进程的地址
3.指向用户态函数指针的数据结构的地址
存放的位置:寄存器eax
寄存器传递参数的个数满足的要求:
1.参数的长度不超过寄存器的长度
2.不包括exa中的系统调用号,参数的个数不超过6个
注意:内核在为用户请求服务时,还会检查所有系统调用的参数的权限和参数表示的地址空间的有效性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值