现在的位置: 首页 > 综合 > 正文

MIPS Linux 下添加系统调用

2013年03月30日 ⁄ 综合 ⁄ 共 1460字 ⁄ 字号 评论关闭

 

添加一个系统调用有以下几个步骤:

1.  在 kernel 的系统调用表 sys_call_table 中添加你的系统调用入口

根据你用的内核位数(32/64bit) 选择需要修改的文件:

arch/mips/kernel/scall32-o32.S  ------> 32bit kernel
arch/mips/kernel/scall64-64.S    ------> 64bit kernel

64bit内核,如果支持兼容32 bit ABI (o32, n32 ) 则还需修改 scall64-o32.S 或 scall64-n32.S

以32bit 内核为例,在 arch/mips/kernel/scall32-o32.S  中找到宏定义

  .macro  syscalltable          /* 系统调用号从 4000 开始 */
    ......
    ......
    sys sys_timerfd        4
    sys sys_eventfd       1
    sys sys_fallocate       6   /* 4320 */
    sys sys_comcat        0         
/* 系统调用号为 4321 */
  .endm

最后加入自定义的系统调用 sys_comcat 于 sys_call_table 中, sys 为辅助宏,调用名后的数值 0 指示该系统调用所需的参数个数。

只能加在 sys_call_table 的最后,否则会扰乱标准的系统调用。

2. 实现系统调用

可以在 arch/mips/kernel/syscall.c 中给出一个实现,如:

asmlinkage void sys_comcat(void)
{
    printk(KERN_EMERG "This's comcat syscall/n");
}

3. 修改 include/asm-mips/unistd.h

根据你的内核位和支持的ABI版本修改相应的宏定义,32bit 内核需修改:

#define __NR_Linux_syscalls     320    ---------> 321        (The number of linux syscalls)
#define __NR_O32_Linux_syscalls     320  ---------> 321  (The number of linux O32 syscalls)

相应的在其上的宏集的最后加入:
.......
#define __NR_timerfd            (__NR_Linux + 318)
#define __NR_eventfd            (__NR_Linux + 319)
#define __NR_fallocate          (__NR_Linux + 320)
#define __NR_comcat             (__NR_Linux + 321)

4. 测试新的系统调用sys_comcat

用重新编译后的内核启动,如下程序测试之:


.text
.globl  main
.ent    main

main:

    li  $2, 4321         /* sys_comcat 的系统的调用号 */
    syscall

.end    main

其中 MIPS 下系统调用的约定为:

v0:         用于置系统调用号
a0~a3:      置前四个参数,后面的参数用栈传
syscall      系统调用触发指令

编译 gcc cat.S -o cat

执行 ./cat

正确的话应有如下输出:

Message from syslogd@localhost at Wed Aug 29 13:15:37 2007 ...
localhost kernel: This's comcat syscall

抱歉!评论已关闭.