全部博文(105)
分类: 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.该文件最后会被include进entry-common.S. 该文件中有类似如下的清单: CALL(NAME) 该清单是个系统调用表。在最后添加一行 CALL(mycall) 。mycall 是系统调用名称。
3,arch/arm/kernel/sys_arm.c. 该文件包含了非标准的系统调用的实现。编写系统调用源程序,就是添加到内核的一个函数,该函数的名称应该是新的系统调用名称前面加上sys_ 标志。下面是我创建的一个名为mycall(int umber)
点击(此处)折叠或打开
只要这三步就可以添加新的系统调用。最后新系统调用的源程序中的内容就可以根据自己的需求来添加。
应用层利用新的系统调用来与内核进行通信例程如下:
点击(此处)折叠或打开
上面这只是一个简单的框架。Syscall可以增加参数,在系统调用实现的源程序中可以实现内核态与用户态数据的相互交换。例如put_user ,get_user 等函数。
最后利用syscall来加密的话就可以用以下思路来具体实现。在系统调用实现中,得到用户空间的密钥,然后去访问加密驱动,然后得到相应的返回值,最后返回用户空间。这样在没有源码的情况下,不知道是什么设备节点来做加密的。