Arm Linux系统调用流程详细解析
Posted: 2025-03-06T03:03:52+00:00
Arm Linux系统调用流程详细解析
Linux系统通过向内核发出系统调用(system call)实现了用户态进程和硬件设备之间的大部分接口。
系统调用是操作系统提供的服务,用户程序通过各种系统调用,来引用内核提供的各种服务,系统调用的执行让用户程序陷入内核,该陷入动作由swi软中断完成。
1、用户可以通过两种方式使用系统调用:
第一种方式是通过C库函数,包括系统调用在C库中的封装函数和其他普通函数。
第二种方式是使用_syscall宏。2.6.18版本之前的内核,在include/asm-i386/unistd.h文件中定义有7个_syscall宏,分别是:
其中,type表示所生成系统调用的返回值类型,name表示该系统调用的名称,typeN、argN分别表示第N个参数的类型和名称,它们的数目和_syscall后面的数字一样大。
这些宏的作用是创建名为name的函数,_syscall后面跟的数字指明了该函数的参数的个数。
比如sysinfo系统调用用于获取系统总体统计信息,使用_syscall宏定义为:
展开后的形式为:
可以看出,_syscall1(int, sysinfo, struct sysinfo *, info)展开成一个名为sysinfo的函数,原参数int就是函数的返回类型,原参数struct sysinfo *和info分别构成新函数的参数。
Linux系统通过向内核发出系统调用(system call)实现了用户态进程和硬件设备之间的大部分接口。
系统调用是操作系统提供的服务,用户程序通过各种系统调用,来引用内核提供的各种服务,系统调用的执行让用户程序陷入内核,该陷入动作由swi软中断完成。
1、用户可以通过两种方式使用系统调用:
第一种方式是通过C库函数,包括系统调用在C库中的封装函数和其他普通函数。
第二种方式是使用_syscall宏。2.6.18版本之前的内核,在include/asm-i386/unistd.h文件中定义有7个_syscall宏,分别是:
Code: Select all
_syscall0(type,name)
_syscall1(type,name,type1,arg1)
_syscall2(type,name,type1,arg1,type2,arg2)
_syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)
_syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)
_syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5)
_syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5,type6,arg6)
这些宏的作用是创建名为name的函数,_syscall后面跟的数字指明了该函数的参数的个数。
比如sysinfo系统调用用于获取系统总体统计信息,使用_syscall宏定义为:
Code: Select all
_syscall1(int, sysinfo, struct sysinfo *, info);
Code: Select all
int sysinfo(struct sysinfo * info)
{
long __res;
__asm__ volatile("int $0x80" : "=a" (__res) : "0" (116),"b" ((long)(info)));
do {
if ((unsigned long)(__res) >= (unsigned long)(-(128 + 1)))
{
errno = -(__res);
__res = -1;
}
return (int) (__res);
} while (0);
}