新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM Linux下添加新的系統(tǒng)調(diào)用

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

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



關(guān)鍵詞: ARMLinux系統(tǒng)調(diào)

評論


技術(shù)專區(qū)

關(guān)閉