第四十一期-ARM Linux内核的系统调用(1)

本文深入探讨了ARM Linux内核中的系统调用,包括其作为同步异常的特性,以及如何通过SVC指令触发。系统调用是内核提供给用户程序的服务接口,通过特定的宏定义如SYSCALL_DEFINEn进行声明。文章通过kill系统调用为例,详细解释了系统调用的定义过程,涉及到参数转换、类型检查和系统调用表的注册。
摘要由CSDN通过智能技术生成

作者:罗宇哲,中国科学院软件研究所智能软件研究中心

上一期中我们介绍了工作队列相关的关键函数,这一期我们将介绍ARM Linux内核中的系统调用。

一、ARM Linux内核中的系统调用

在ARM Linux内核中,系统调用是一种特殊的异常,通常被归于同步异常的范畴,这是因为它是通过SVC指令触发的。我们在第二十七期中提到过,同步异常是由正在运行的指令或指令运行的结果造成的异常。

SVC指令在ARMv8体系中被归于异常处理类指令,该指令能允许用户程序调用内核,其格式如下[1]:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WlqHkA2P-1592910198500)(media/b6887918b5edc1b4f6580e21e126843e.png)]
异常处理程序可以从异常症状寄存器(Exception Syndrome Register,ESR)中得到SVC指令使用的立即数。从异常返回则可以使用ERET指令,该指令从SPSR寄存器中恢复处理器状态PSTATE,而且将返回到ELR寄存器保存的返回地址上。以上过程的具体情况我们在第三十期中提到过。

系统调用是操作系统内核为用户程序提供系统服务的接口,操作系统将一些需要在内核态运行的公共服务通过系统调用封装并提供给应用程序。用户程序在使用系统调用时将陷入内核态,并调用系统用的处理函数。不同的系统调用有不同的编号,它们被称为系统调用号。ARM64处理器中使用SVC指令触发系统调用的约定如下[2]:

  • 64位用户程序使用寄存器x8传递系统调用号,32位用户程序使用寄存器x7传递系统调用号;
  • 使用寄存器x0-x6传递系统调用所需参数,最多可传递7个参数;
  • 系统调用执行完后,用寄存器x0存放返回值。

二、系统调用的定义

ARM Linux内核中使用SYSCALL_DEFINEn(…)宏来定义一个系统调用,其中n为非负整数,表示后面括号中参数的数目。以内核中用于向进程发送信号的kill系统调用为例,其定义代码在openeuler/kernel/blob/kernel-4.19/kernel/signal.c文件中可以找到:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o3HRE4XB-1592910198501)(media/17ee641bde87539f86dae5fad19403a5.png)]
SYSCALL_DEFINE的相关宏定义可以在openeuler/kernel/blob/kernel-4.19/include/linux/syscalls.h中找到(以下相关汇编代码在同一文件中):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V7tbG30t-1592910198503)(media/0b66deba72cce893ee76253a4ef9f93a.png)]
在C语言宏定义中##被解释成分隔与连接一个符号,符号可以是一个变量,也就是说“##name”被编译器理解为两段:“”和“name”,而name和前面的输入参数可以匹配,所以“##name”实际上是将输入参数name前面加了“”,例如输入“kill”就会变成“_kill”。__VA_ARGS__关键字等价于可变参数列表…中省略的内容。

SYS

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值