linux系统调用书写

来源:互联网 发布:js 金币掉落效果 编辑:程序博客网 时间:2024/05/29 12:01

操作环境

 系统版本: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;}
0 0