Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2123297
  • 博文数量: 288
  • 博客积分: 10594
  • 博客等级: 上将
  • 技术积分: 3469
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-27 19:27
文章分类

全部博文(288)

文章存档

2012年(4)

2011年(30)

2010年(40)

2009年(32)

2008年(71)

2007年(79)

2006年(32)

分类: LINUX

2009-02-19 15:46:55

最近的项目需要在ARM 
Linux核心中添加新的系统调用,才能满足项目的需要,于是乎打开google和百度去搜索,结果很不能令人满意。结果自己只好解决!现将添加步骤公布如下(注:我用的核心是2.6.14.7,其他版本请读者自行修改):
    一、打开arch/arm/kernel/calls.S,找到“#define NR_syscalls 328”这句修改之,需要特别注意的是,这里的系统调用数必须是4的倍数增加,否则编译会有错,比如:“#define NR_syscalls 332“。接下来添加系统调用的函数原型的指针,例如:.long sys_set_senda
    
    二、打开include/asm-arm/unistd.h,添加系统调用号的宏(个人感觉这步可以省略),例如:
    #define __NR_plan_set_senda             (__NR_SYSCALL_BASE+323)
这里的编号添加时,必须按顺序来。否则会导致核心运行错误。
    
    三、实例化该系统调用,即编写新添加系统调用的实现,这个就是你的事了,例如:
    asmlinkage long sys_set_senda(int iset)
    {
       if(iset)
          UART_PUT_CR(&at91_port[2],AT91C_US_SENDA);
       else
          UART_PUT_CR(&at91_port[2],AT91C_US_RSTSTA);
       return 0;
     }
    
    四、打开include/linux/syscalls.h添加函数声明
    asmlinkage long sys_set_senda(int iset);
    
    五、在应用程序中调用该系统调用
    int set_senda(int isset)
    {
       register long __r0 __asm__("r0") = (long)isset;
        register long __res __asm__("r0");
        __asm__ __volatile__ ( "swi\t" "0x900143" "\n\t" : "=r" (__res) : "r" (__r0) : "lr");
        do { if ((unsigned long)(__res) >= (unsigned long)(-125))
                { errno = -(__res); __res = -1; }
                return (int) (__res);
        } while (0);
    }
    六、结束(注:多参数的情况请读者自行研究)
阅读(2075) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~