私はカーネル初心者で、奇妙な問題に直面しています。概念実証の電卓システムコールを作成しましたが、ほとんどの計算では問題なく動作しますが、SUBTRACTION の結果が -1 から -256 の間の場合は -1 を返します。誰かが何が起こっているのかに光を当てることができれば、それを感謝します. 以下はsyscallコードです。
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 カーネル 3.10.xxx。プラットフォーム: Nexus7 ARM EABI。私が理解していないのは、なぜそれが失敗しているのかです。-res_int を errno に設定しているため、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 #