linux系统调用

linux系统调用-----

系统调用和普通函数区别----

系统调用由操作系统内核实现,运行于内核态;而普通的函数调用由函数库或用户自己提供,运行于用户态


库函数---linux系统还提供了一些c函数库,这些库函数对系统调用进行了一些包装和扩展。

在linux2.6.29内核中,共有系统调用360个,可在arch/arm/include/asm/unistd.h中找到它们。

系统调用工作原理概述---

void mian()

{

create("testfile",0666)<0

}

应用程序首先用适当 的值填充寄存器,然后调用一个特殊的指令跳转到内核某一个固定的位置,内核根据应用程序所填充 的固定值来找到相应的函数执行。


1--适当的值

在文件include/asm/unistd.h中为每个系统调用规定了唯一的编号,这个号称为系统调用号。

#define __NR_restart_syscall           (_NR_SYSCALL_BASE + 0)

2---特殊的指令

在intel cpu中,这个指令由中断0x80实现。

在arm中,这个指令是swi(已经重命名为SVC指令)


3---固定的位置

在arm体系中,应用程序跳转到的固定内核位置是ENTRY(vector_swi)<entry-common.S>


4---相应的函数

内核根据应用程序传递来的系统调用号,从系统调用表sys_call_table找到相应的内核函数。CALL(sys_restart_syscall)



实现系统调用---向内核中添加新的系统调用,需要执行3个步骤:

1--添加新的内核函数

2--更新头文件unistd.h

3--针对这个新函数更新系统调用表calls.S


1--在kernel/sys.c中添加函数:

asmlinkage int sys_add(int a, int b)

{

return a+b;

}asmlinkage---使用栈传递参数。


2---在arch/arm/include/asm/unistd.h中添加如下代码:

#define __NR_add (__NR_SYSCALL_BASE+361)

3---在arch/arm/kernel/calls.S中添加代码,指向新实现的系统调用函数:

CALL(sys_add)


使用系统调用----

#include <stdio.h>

#include <linux/unistd.h>


mian()

{

int result;

result=SYSCALL(361,1,2)

printf("result=",result)

}













你可能感兴趣的:(工作,linux,vector,table,扩展,360)