Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1224407
  • 博文数量: 105
  • 博客积分: 127
  • 博客等级: 入伍新兵
  • 技术积分: 962
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-29 15:22
文章分类

全部博文(105)

文章存档

2021年(1)

2019年(3)

2018年(1)

2017年(11)

2016年(47)

2015年(32)

2014年(4)

2012年(6)

我的朋友

分类: LINUX

2012-12-11 22:04:39

 

   最近在做一个arm  linux 下的加密设备的驱动。一般应用层都是通过设备节点文件与驱动层通信的。但是发现这个加密设备,如果没有设备节点文件的就更好,显得更隐秘。这时想到了syscall。通过自己添加syscall来实现应用层与驱动层的通信。而实现自己的syscall又相对来说很简单。

Arm linux 是通过swi 软中断来实现syscall 的。添加亲的syscall的步骤如下:

1 /arch/arm/include/asm/unistd.h. 该文件中包含了系统调用清单,用来给每个系统调用分配一个唯一的号码。文件中每一行的格式如下:

#define __NR_NAME            (__NR_SYSCALL_BASE+ NNN)

其中name用系统调用的名字代替, NNN这是该系统调用说对应的号码。应该将新的系统调用名称加到清单的最后,并为它分配号码序列中的下一个可用系统调用号。如:

#define __NR_mycall      (__NR_SYSCALL_BASE+366)

 

2,  /arch/arm/kernel/calls.S.该文件最后会被includeentry-common.S. 该文件中有类似如下的清单:    CALL(NAME)  该清单是个系统调用表。在最后添加一行 CALL(mycall) mycall  系统调用名称

 

3arch/arm/kernel/sys_arm.c. 该文件包含了非标准的系统调用的实现。编写系统调用源程序,就是添加到内核的一个函数,该函数的名称应该是新的系统调用名称前面加上sys_ 标志。下面是我创建的一个名为mycall(int umber)

点击(此处)折叠或打开

  1. asmlinkage int sys_mycall(int number)    //mycall 系统调用名称 ,函数名称为sys_mycall
  2. {

  3.       //可以实现你要实现的内容

  4.        return number;
  5. }

 

只要这三步就可以添加新的系统调用。最后新系统调用的源程序中的内容就可以根据自己的需求来添加。

应用层利用新的系统调用来与内核进行通信例程如下:


点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <errno.h>
  3. #define __KERNEL__
  4. #include <unistd.h>
  5. #include <sys/syscall.h>
  6. int myksecure()
  7. {
  8.          syscall(__NR_SYSCALL_BASE+366);
  9.          // 第一个参数为系统调用的编号
  10.          // syscall可以加多个参数,来实现数据交换
  11. }

  12. int main(int argc, char *argv[])
  13. {
  14.          printf("%d\n", myksecure(100));
  15.          return 0 ;
  16. }
 

上面这只是一个简单的框架。Syscall可以增加参数,在系统调用实现的源程序中可以实现内核态与用户态数据的相互交换。例如put_user ,get_user 等函数。

 

  最后利用syscall来加密的话就可以用以下思路来具体实现。在系统调用实现中,得到用户空间的密钥,然后去访问加密驱动,然后得到相应的返回值,最后返回用户空间。这样在没有源码的情况下,不知道是什么设备节点来做加密的。

阅读(5204) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~