Linux系统调用详解

一、用户空间和内核空间

在现代操作系统中,处理器的运行模式通常分成两个空间:用户空间和内核空间。大部分程序运行在用户空间,而内核和设备驱动运行在内核空间。

二、系统调用层及作用

在现代操作系统架构中,内核空间和用户空间中间增加了一个中间层:系统调用层
系统架构系统调用层的主要作用:

  • 为用户空间程序提供一层硬件抽象接口。让应用程序编程者从学习硬件设备底层编程中解放出来。
  • 保证系统稳定和安全。应用程序要访问内核必须通过系统调用层,内核可以在系统调用层对应用程序的访问权限、用户类型、和其他一些规则进行过滤,避免用用程序不正确地访问内核。
  • 可移植性。

三、系统调用和POSIX标准

一般来说,应用程序调用用户空间实现的应用编程接口(API)来编程,而不是直接调用系统调用。一个API可能由一个或多个系统调用实现,也可能不使用任何的系统调用。
而在UNIX的世界,最通用的系统调用接口是POSIX(可移植操作系统接口)标准。

四、系统调用表

在系统调用时,由于用户态和核心态是运行两个独立栈上面,所以我们不能仅仅简单地传递函数指针,因为对于核心态空间用户态是不可见的,所以系统调用函数指针对于用户态不可见;另外一个问题是参数传递,由于两个栈之前独立运行的,所以不能用普通的压栈出栈的形式进行参数传递。
所以我们需要分别就1.系统调用函数的名称转换(使用系统调用表);2.系统调用函数的参数传递。
Linux系统为每一个系统调用赋予了一个系统调用号。当应用程序执行一个系统调用时,应用程序就知道执行和调用哪个系统调用了,从而不会造成混乱。例如,在ARM32中,open对应的系统调用号是5。

五、用程序直接访问系统调用

#include <unistd.h>
#include <sys.syscall.h>
long syscall(long number, ...);

syscall()可以直接调用一个系统调用,第一个参数是系统调用海马;“…”是可变参数,用来传递参数到内核。open的系统调用可以直接用以下代码直接调用。

#define NR_OPEN 5
syscall(NR_OPEN, filename, flags, mode);

六、新增的系统调用

在Linux中新增一个系统调用是很容易的事,但是同时也意味着你的代码将失去可移植性。Linux的系统调用由Linux社区决定。
Linux内核里提供了很多机制来让用户程序和内核进行信息交互,我们应该首先考虑一下方式:
设备节点。实现一个设备节点后,就可以对该设备进行read()和write()等操作。甚至可以通过ioctl()接口来定义一些操作。
sysfs接口。sysfs接口也是一种推荐的用户程序和内核直接的通信方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值