×
单片机 > 单片机程序设计 > 详情

ARM Linux下添加新的系统调用

发布时间:2020-08-27 发布时间:
|
    最近的项目需要在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__ ( "swit" "0x900143" "nt" : "=r" (__res) : "r" (__r0) : "lr");
        do { if ((unsigned long)(__res) >= (unsigned long)(-125))
                { errno = -(__res); __res = -1; }
                return (int) (__res);
        } while (0);
    }
    六、结束(注:多参数的情况请读者自行研究)

关键字:ARM  Linux  系统调用

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式