色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > ARM Linux下添加新的系統(tǒng)調用

          ARM Linux下添加新的系統(tǒng)調用

          作者: 時間:2016-11-21 來源:網絡 收藏
          最近的項目需要在ARMLinux核心中添加新的系統(tǒng)調用,才能滿足項目的需要,于是乎打開google和百度去搜索,結果很不能令人滿意。結果自己只好解決!現(xiàn)將添加步驟公布如下(注:我用的核心是2.6.14.7,其他版本請讀者自行修改):
          一、打開arch/arm/kernel/calls.S,找到“#define NR_syscalls 328”這句修改之,需要特別注意的是,這里的系統(tǒng)調用數(shù)必須是4的倍數(shù)增加,否則編譯會有錯,比如:“#define NR_syscalls 332“。接下來添加系統(tǒng)調用的函數(shù)原型的指針,例如:.long sys_set_senda
          二、打開include/asm-arm/unistd.h,添加系統(tǒng)調用號的宏(個人感覺這步可以省略),例如:
          #define __NR_plan_set_senda (__NR_SYSCALL_BASE+323)
          這里的編號添加時,必須按順序來。否則會導致核心運行錯誤。
          三、實例化該系統(tǒng)調用,即編寫新添加系統(tǒng)調用的實現(xiàn),這個就是你的事了,例如:
          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添加函數(shù)聲明
          asmlinkage long sys_set_senda(int iset);
          五、在應用程序中調用該系統(tǒng)調用
          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);
          }
          六、結束(注:多參數(shù)的情況請讀者自行研究)



          評論


          技術專區(qū)

          關閉