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)
}