一、打開arch/arm/kernel/calls.S,找到“#define NR_syscalls 328”這句修改之,需要特別注意的是,這里的系統(tǒng)調(diào)用數(shù)必須是4的倍數(shù)增加,否則編譯會有錯,比如:“#define NR_syscalls 332“。接下來添加系統(tǒng)調(diào)用的函數(shù)原型的指針,例如:.long sys_set_senda
二、打開include/asm-arm/unistd.h,添加系統(tǒng)調(diào)用號的宏(個人感覺這步可以省略),例如:
#define __NR_plan_set_senda (__NR_SYSCALL_BASE+323)
這里的編號添加時,必須按順序來。否則會導(dǎo)致核心運行錯誤。
三、實例化該系統(tǒng)調(diào)用,即編寫新添加系統(tǒng)調(diào)用的實現(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);
五、在應(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ù)的情況請讀者自行研究)
評論