共计 1626 个字符,预计需要花费 5 分钟才能阅读完成。
这篇文章主要讲解了“linux 中系统调用的概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“linux 中系统调用的概念是什么”吧!
在 linux 中,系统调用是指操作系统提供给用户程序调用的一组特殊接口,用户程序可以根据这组接口获得操作系统内核的服务;系统调用规定了用户进程陷入内核的具体位置,或者说规划了用户访问内核的路径,只能从固定位置进入内核。
本教程操作环境:linux7.3 系统、Dell G3 电脑。
linux 中什么是系统调用
1. 什么是系统调用
系统调用,指的是操作系统提供给用户程序调用的一组特殊接口,用户程序可以根据这组接口获得操作系统内核的服务。它规定了用户进程陷入内核的具体位置,或者说规划了用户访问内核的路径,只能从固定位置进入内核。
2.linux 的系统调用
对于现代操作系统来说,系统调用是用户空间和内核通讯的普遍手段,linux 也不例外。按照功能区域,linux 系统调用大致分为进程控制,文件访问,系统控制,存储管理,网络管理,进程通讯等,详细说明可以通过 man 2 syscalls 命令查看 manpage 说明。
系统调用,仅仅通过软中断机制向内核提交请求,进入系统调用对应服务。linux 提供的用户编程接口遵循了 POSIX 标准,这套标准除了定义一些标准的 C 函数外,提供了一套封装例程将系统调用封装供用户编程使用。不过封装并非必须的,如果你愿意直接调用,linux 内核也提供了一个 syscall() 函数来实现调用。通过下面一个例子了解 C 库调用和直接调用的区别。
/*
** file: demo.c
** author: eric.xu
** date: 2016-02-25
#include syscall.h
#include unistd.h
#include sys/types.h
#include stdio.h
int main(void)
long id1, id2;
/* system call no 20, __NR_getpid equal to SYS_getpid */
id1 = syscall(__NR_getpid);
printf(sys_call getpid %ldn , id1);
/* libc getpid */
id2 = getpid();
printf(libc getpid %ldn , id2);
return 0;
}
编译运行,可以看到两者结果一致。
sys_call getpid 2899
libc getpid 2899
3.linux 系统调用实现
当用户态的进程调用一个系统调用时,CPU 切换到内核态并开始执行内核函数。因为内核中每个系统调用都有唯一的标号,所以用户态调用必须传递一个系统调用号的参数来确定具体的系统调用函数。所有的系统调用函数都是整数,在内核中,整数和 0 表示系统调用成功结束,负数则表示出错条件,而这个错误值会存放在 errno 变量中作为出错码返回给应用程序。
linux 系统调用使用软中断实现,在 x86 架构中调用 int $0x80 汇编指令,这条指令会产生向量为 128 的异常。而在 arm 架构中通过 SWI 指令进入内核空间,下面看下这条指令的格式:
SWI {cond} immed24; 其中 immed24 表示 24 位立即数
SWI 异常中断处理程序需要通过读取引起软件中断的 SWI 指令,取得 24 位立即数。基本步骤是在 SWI 异常产生后,访问 SPSR 寄存器判断该指令是 ARM 指令还是 Thumb 指令,然后通过访问 LR 寄存器得到整条指令地址,紧接着拿到该条指令,获取最低 24 位立即数。
感谢各位的阅读,以上就是“linux 中系统调用的概念是什么”的内容了,经过本文的学习后,相信大家对 linux 中系统调用的概念是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!