这篇文章主要讲解了“linux中系统调用的概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux中系统调用的概念是什么”吧!
在linux中,系统调用是指操作系统提供给用户程序调用的一组特殊接口,用户程序可以根据这组接口获得操作系统内核的服务;系统调用规定了用户进程陷入内核的具体位置,或者说规划了用户访问内核的路径,只能从固定位置进入内核。
本教程操作环境:linux7.3系统、Dell G3电脑。
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中系统调用的概念是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。