操作环境
系统版本:Ubuntu12.04.5
内核版本:Linux3.3.8
何为系统调用
它是内核层暴露给用户层的一组接口
但与应用接口API的存在一定的区别
应用接口API仅仅为一组函数声明
而系统调用则是通过软中断向内核发出请求
系统调用的组成
系统调用名的声明
在linux-3.3.8/arch/x86/syscalls/目录下
x86 : 根据你的处理器选择目录进入
我的处理器为x86的 所以进入此目录
有五个文件 选择我们需要的说
syscall_64.tbl
如果是32位操作系统,打开syscall_32.tbl
以下为文件内容
系统调用号 处理器类型 用户层函数名 内核层函数名
如:
0 64 read sys_read
内核版本不同系统调用的数量也会有些许的差异
本机系统调用一共有312个(0 ~ 311)
系统调用的声明
在linux-3.3.8/include/linux/目录下
打开syscalls.h的头文件
文件内容为内核数据结构的声明和系统调用的声明还有宏函数的实现
我们在#endif的上面添加自己的系统调用的声明
如:
asmlinkage long sys_test(int number)
实现系统调用
在linux-3.3.8/的目录下创建一个文件夹test/
在文件夹内部创建test.c 和 Makefile文件
在test.c里实现我们的系统调用
#include <kernel.h>//test.c
asmlinkage long sys_test(int number)
{
printk(KERN_ERR"called sys_test %d",number);
return 0;
}
在当前文件夹下的Makefle文件中添加如下内容
obj-y := test.o
在等号之后以.o的形式写你需要的.c文件
返回linux-3.3.8/目录后修改此文件夹下的Makefile文件
core-y := usr/ test/
在core后添加你在linux-3.3.8/目录下添加的目录
修改完毕后进行编译即完成自己的系统调用书写
使用系统调用
在应用层调用系统调用
前面我们已经在内核层实现了我们的系统调用
接着我们就要在应用层来调用它
下面为系统调用的接口
syscall(n,perm1,perm2);
n为我们在syscall_64.tbl中的系统调用号,之后为系统调用的参数表
编写函数来调用syscall
#include <stdio.h>
#include <sys/syscall.h>
int main(void){
int rc = 0,number = 5;
rc = syscall(312,number);
return rc;
}