系统调用

原创 2012年03月24日 17:46:35

用户程序请求内核程序为其服务主要通过以下几种方式:

  • 中断

  • 系统调用

  • 信号

其中,系统调用是一种常见方式,它在用户进程与硬件之间提供了一个层,该层主要提供以下三个目的:

  • 它为用户空间提供了一个抽象的硬件接口

  • 它确保了系统的安全与稳定性。

  • 为虚拟化系统的实现提供支持。

操作系统内核提供了许多系统调用接口,一个典型的系统调用过程如下:

x86平台上,系统调用是通过软件中断来实现的,中断号为128(或0x80)。系统调用需要提供系统调用号(传递给eax)以及一些参数(依次传递给ebx,ecx, edx, esi, edi,系统调用处理函数通常名为system_call(),定义在entry.Sentry_64.S中。它会检查系统调用号的合法性,即是否大于NR_syscalls,如果是的话,返回-ENOSYS,否则调用对应的函数:call*sys_call_table(,%rax,8)

自定义一个系统调用

Linux中实现一个系统调用不用户关心系统调用处理函数的行为,因此增加一个系统调用非常容易。

SYSCALL_DEFINE0~6分别声明一个参数为0~6个的系统调用。

定义完系统调用函数后,剩下的工作就是将其注册为一个内核系统调用函数:

  • 在系统调用表中末尾添加一项,通常赋给该系统调用一个调用号(即在entry.S中的ENTRY(sys_call_table))。

  • 对每个支持的平台,在<asm/unistd.h>中定义系统调用号。

  • 将系统调用编译到内核镜像中(而不是编译成一个模块),可以将系统调用函数放在kernel/sys.c文件中。

例子如下,我们要定义一个foo系统调用函数:

/*
* sys_foo – everyone’s favorite system call.
*
* Returns the size of the per-process kernel stack.
*/
asmlinkage long sys_foo(void)// SYSCALL_DEFINE0(sys_foo)
{
return THREAD_SIZE;
}

添加fooentry.S文件中:

ENTRY(sys_call_table)
.long sys_restart_syscall /* 0 */
.long sys_exit
.long sys_fork
.long sys_read
.long sys_write
.long sys_open /* 5 */

	…
.long sys_rt_tgsigqueueinfo /* 335 */
.long sys_perf_event_open
.long sys_recvmmsg
.long sys_foo

我们的系统调用号为:338

<asm/unistd.h>

增加宏定义:

#define__NR_foo 338

在用户空间中调用,_syscall0~6对应不同参数个数的系统调用

#define __NR_foo 283
__syscall0(long, foo)
int main ()
{
long stack_size;
stack_size = foo ();
printf (“The kernel stack size is %ld\n”, stack_size);
return 0;
}



系统调用之二:参数传递

服务调用的返回值必须被存进eax中。服务调用没有出参
  • proware
  • proware
  • 2010年10月27日 22:31
  • 3114

7.3 Close系统调用

应用进程如果不再想使用socket,可以使用close系统调用将其关闭。close系统调用的基本功能是关闭文件描述符并释放其对应的内核资源。如果在调用close前调用了shutdown,则不会发送FI...
  • u011130578
  • u011130578
  • 2015年04月06日 06:40
  • 939

操作系统实验——增加系统调用(详细图文解释)

Linux新增系统调用,详细的图文教程
  • yj3254
  • yj3254
  • 2015年04月02日 19:26
  • 2614

系统调用实现

当用户态的进程调用一个系统调用时,CPU从用户态切换到内核态并开始执行一个内核函数。Linux通过由向量为128(0x80)的编程异常实现CPU由用户态到内核态的转换。 因为内核实现了许多不同的系统...
  • wrx1721267632
  • wrx1721267632
  • 2016年01月20日 11:51
  • 575

Linux内核添加系统调用

1、目的: 在现有的系统中添加一个不用传递参数的系统调用。这个系统调用的功能是实现遍历系统中的所有进程。实验主要内容: 添加系统调用的名字利用标准 C 库进行包装添加系统调用号在系统调用表中添...
  • rk2900
  • rk2900
  • 2012年12月11日 11:32
  • 19939

Linux下简单的系统调用

嵌入式汇编实现简单的系统调用
  • ven_kon
  • ven_kon
  • 2017年03月17日 21:31
  • 255

0x80系统调用的参数传递规则

系统调用的参数传递规则: 传递给系统调用的参数则必须按照参数顺序依次存放到寄存器ebx,ecx,edx,esi,edi中,当系统调用完成之后,返回值存放在eax中; A.当系统调用所需参数的个数不...
  • u011640816
  • u011640816
  • 2014年06月27日 09:05
  • 1018

linux strace命令--跟踪系统调用

简介 strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内...
  • jk110333
  • jk110333
  • 2014年11月18日 15:35
  • 1833

系统调用基本概念

系统调用时值就是函数调用,值时调用的函数是系统函数,处于内核态而已。用户在调用系统调用时会向内核传递一个系统调用号,然后系统调用处理程序通过此号从系统调用表中找到相应的内核函数执行(系统调用服务例程)...
  • wrx1721267632
  • wrx1721267632
  • 2016年01月18日 16:17
  • 1154

系统调用概念

“操作系统”通常包含以下两种含义: 1、表示完整的软件包,包括用来管理计算机资源的核心层软件,以及附带的所有标准软件工具,诸如命令行解释器、图形用户界面、文件操作工具和文本编辑器等; 2、狭义上的...
  • u012877472
  • u012877472
  • 2015年11月18日 14:53
  • 779
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:系统调用
举报原因:
原因补充:

(最多只允许输入30个字)