linux系统调用分析
2017-10-12 13:57
197 查看
1. 什么是系统调用
简单来说,系统调用就是用户程序和硬件设备之间的桥梁。用户程序在需要的时候,通过系统调用来使用硬件设备。
系统调用的存在,有以下重要的意义:
1)用户程序通过系统调用来使用硬件,而不用关心具体的硬件设备,这样大大简化了用户程序的开发。
比如:用户程序通过write()系统调用就可以将数据写入文件,而不必关心文件是在磁盘上还是软盘上,或者其他存储上。
2)系统调用使得用户程序有更好的可移植性。只要操作系统提供的系统调用接口相同,用户程序就可在不用修改的情况下,从一个系统迁移到另一个操作系统。
3)系统调用使得内核能更好的管理用户程序,增强了系统的稳定性。
因为系统调用是内核实现的,内核通过系统调用来控制开放什么功能及什么权限给用户程序。
这样可以避免用户程序不正确的使用硬件设备,从而破坏了其他程序。
4)系统调用有效的分离了用户程序和内核的开发。
用户程序只需关心系统调用API,通过这些API来开发自己的应用,不用关心API的具体实现。
内核则只要关心系统调用API的实现,而不必管它们是被如何调用的。
用户程序,系统调用,内核,硬件设备的调用关系如下图:
2. Linux上的系统调用实现原理
要想实现系统调用,主要实现以下几个方面:通知内核调用一个哪个系统调用
用户程序把系统调用的参数传递给内核
用户程序获取内核返回的系统调用返回值
下面看看Linux是如何实现上面3个功能的。
2.1 通知内核调用一个哪个系统调用
每个系统调用都有一个系统调用号,系统调用发生时,内核就是根据传入的系统调用号来知道是哪个系统调用的。在x86架构中,用户空间将系统调用号是放在eax中的,系统调用处理程序通过eax取得系统调用号。
系统调用号定义在内核代码:arch/alpha/include/asm/unistd.h 中,可以看出linux的系统调用不是很多。
2.2 用户程序把系统调用的参数传递给内核
系统调用的参数也是通过寄存器传给内核的,在x86系统上,系统调用的前5个参数放在ebx,ecx,edx,esi和edi中,如果参数多的话,还需要用个单独的寄存器存放指向所有参数在用户空间地址的指针。一般的系统调用都是通过C库(最常用的是glibc库)来访问的,Linux内核提供一个从用户程序直接访问系统调用的方法。
参见内核代码:arch/cris/include/arch-v10/arch/unistd.h
里面定义了6个宏,分别可以调用参数个数为0~6的系统调用
_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)
超过6个参数的系统调用很罕见,所以这里只定义了6个。
2.3 用户程序获取内核返回的系统调用返回值
获取系统调用的返回值也是通过寄存器,在x86系统上,返回值放在eax中。相关文章推荐
- 【转】Linux-2.6.25 select系统调用源码分析
- Linux下汇编程序及系统调用的深入分析
- linux-kernel 3.5.3Tcp系统调用,源码分析4-inet_init
- linux内核剖析---Linux系统调用详解(实现机制分析)
- Linux系统调用的实现机制分析
- Linux中mmap系统调用原理分析与实现
- 《第三篇 linux 0.12 execve系统调用分析》
- Linux的IO系统惯用系统调用及分析
- linux中mmap系统调用原理分析与实现
- linux中mmap系统调用原理分析与实现
- linux-kernel 3.5.3Tcp系统调用,源码分析5-原子操作
- Linux内核分析——扒开系统调用的三层皮(上)
- Linux系统调用的实现机制分析
- linux中mmap系统调用原理分析与实现
- linux内核情景分析{中断 系统调用 内存}
- linux中mmap系统调用原理分析与实现
- linux内核剖析(六)Linux系统调用详解(实现机制分析)
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Linux系统调用的实现机制分析
- Linux系统调用getuid的简单分析
- Linux网络协议源代码分析 之 系统调用