给Mediatek智能机(arm)增加新的系统调用

来源:互联网 发布:御彩轩计划软件免费 编辑:程序博客网 时间:2024/05/05 18:17

适用于mediatek,65xx智能机系列

先看一个已有的系统调用

(1) 系统调用号
//./include/linux/syscalls.h

./kernel/include/linux/unistd.h  -->#include <asm/unistd.h>

./kernel/arch/arm/include/asm/unistd.h

#define __NR_restart_syscall            (__NR_SYSCALL_BASE+  0)
#define __NR_exit                       (__NR_SYSCALL_BASE+  1)
#define __NR_fork                       (__NR_SYSCALL_BASE+  2)
#define __NR_read                       (__NR_SYSCALL_BASE+  3)
#define __NR_write                      (__NR_SYSCALL_BASE+  4)
#define __NR_open                       (__NR_SYSCALL_BASE+  5)
#define __NR_close                      (__NR_SYSCALL_BASE+  6)
...
#define __NR_setns                      (__NR_SYSCALL_BASE+375)
#define __NR_process_vm_readv           (__NR_SYSCALL_BASE+376)
#define __NR_process_vm_writev          (__NR_SYSCALL_BASE+377)

(2) 系统调用表
kernel/arch/arm/kernel/calls.S
/* 0 */         CALL(sys_restart_syscall)
                CALL(sys_exit)
                CALL(sys_fork_wrapper)
                CALL(sys_read)
                CALL(sys_write)
/* 5 */         CALL(sys_open)
                CALL(sys_close)
...
/* 375 */       CALL(sys_setns)
                CALL(sys_process_vm_readv)
                CALL(sys_process_vm_writev)

(3) sys_open的系统调用实现
在代码中找不到sys_open的实现,其实sys_open的实现在文件fs/open.c中

SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)

./include/linux/syscalls.h
#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
#define __SYSCALL_DEFINEx(x, name, ...)                                 \
        asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))

SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
==> SYSCALL_DEFINEx(3, _##open, const char __user *, filename, int, flags, umode_t, mode)
==> askmlinkage long sys_open(const char __user *, filename, int, flags, umode_t, mode)

(4)新的系统调用

a, ./kernel/arch/arm/include/asm/unistd.h

#define __NR_my_syscall                 (__NR_SYSCALL_BASE+378)

b. //kernel/arch/arm/kernel/calls.S
 /* 375 */      

 CALL(sys_setns)            

CALL(sys_process_vm_readv)
                CALL(sys_process_vm_writev)
                CALL(sys_my_syscall)  

 

c .  //mediatek/kernel/drivers/xlog/xlog_printk.c文件中增加(随便找了一个文件)

asmlinkage void sys_my_syscall(void)
{
        printk("**********sys_mysyscall***********\n");
}

EXPORT_SYMBOL(sys_my_syscall);

 

d. 编译kernel

./mk mbk77_twn_cu_jb r k bootimage

编译完成后烧写boot.img

 

e. main.cpp

#include <stdio.h>
#include <linux/unistd.h>
#include <sys/syscall.h>

extern "C" {
#define __NR_my_syscall 378

int main()
{
        syscall(__NR_my_syscall);

  return 0;
}

}

f. 通过mm编译,adb push到/data目录下,chmod 0777 修改属性

运行程序,并通过dmesg查看。

下面是运行的结果: