我是内核新手,正面临一个奇怪的问题。我编写了一个概念验证计算器系统调用,虽然它适用于大多数计算,但当 SUBTRACTION 结果介于 -1 到 -256 之间时,它会返回 -1。如果有人可以对可能发生的事情有所了解,将不胜感激。下面是系统调用代码。
SYSCALL_DEFINE3(calc, int, a, int, b , char, op) {
int res_int;
switch(op) {
case '+': res_int = a + b;
break;
case '-': res_int = a - b;
break;
case '*': res_int = a * b;
break;
case '/': res_int = (a*1000) / b;
break;
}
printk(KERN_INFO "KERNEL CALC RESULT : %d %c %d = %ld",a, op, b, res_int);
return res_int;
}
编辑:内核版本:Android Linux Kernel 3.10.xxx。平台:Nexus7 ARM EABI。我不明白为什么它会失败。errno 根本没有用,因为它将 -res_int 设置为 errno。另外,我不明白为什么只有当 res_int 为 {-1,-256} 时它才会失败。
a=1200, b=1300 op='-' => res_int=-100 是 printk 打印 -100 的示例,但在我的用户空间应用程序中,我收到 -1。
看起来当 res_int 为 {-1, -256} 时,errno 被设置为 -res_int。
root@android:/data/local # ./calc
Please enter request in 'num1 oper num2' format:
2.45 - 2.2
returned from syscall with res_int = 250
errno = 22, strerror(errno) = Invalid argument
Calculator result = 0.250000
root@android:/data/local # ./calc
Please enter request in 'num1 oper num2' format:
2.2 - 2.45
returned from syscall with res_int = -1
errno = 250, strerror(errno) = Unknown error 250
Calculator result = -0.001000
root@android:/data/local #