微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM Linux下添加新的系统调用

ARM Linux下添加新的系统调用

时间: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);
}

六、结束(注:多参数的情况请读者自行研究)


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top