linux系统调用书写

操作环境

 系统版本: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值