最近的项目需求在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);
}
六、完毕(注:多参数的状况请读者自行研讨)
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/262837.html