最近的项目需要在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__ ( "swi\t" "0x900143" "\n\t" : "=r" (__res) :
"r" (__r0) : "lr");
do { if ((unsigned long)(__res) >= (unsigned long)(-125))
{ errno = -(__res); __res = -1; }
return (int) (__res);
} while (0);
}
六、结束(注:多参数的情况请读者自行研究)
阅读(2088) | 评论(0) | 转发(0) |