新聞中心

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

        ARM Linux下添加新的系統調用

        作者: 時間:2016-11-21 來源:網絡 收藏
        最近的項目需要在ARMLinux核心中添加新的系統調用,才能滿足項目的需要,于是乎打開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);
        }
        六、結束(注:多參數的情況請讀者自行研究)



        關鍵詞: ARMLinux系統調

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 上虞市| 蓬溪县| 泾川县| 营口市| 佛学| 奉化市| 惠东县| 岳池县| 镇沅| 汝阳县| 昭觉县| 古蔺县| 巨鹿县| 法库县| 桦甸市| 化德县| 灌南县| 普洱| 陕西省| 长岛县| 南安市| 临城县| 施甸县| 黄梅县| 清水河县| 渭源县| 海阳市| 商洛市| 茶陵县| 庆阳市| 襄垣县| 邛崃市| 达日县| 西峡县| 冕宁县| 蓝田县| 浪卡子县| 乌苏市| 民乐县| 西丰县| 洪泽县|