私は現在、ユーザースペースに値を返さなければならないreturnステートメントと組み合わせて、カーネルスピンロックの正しい実装に苦労しています。 2つの質問が生じた。この時点でLinuxのシステムコールを使用してスピンロックの値をユーザー空間に戻す
asmlinkage bool sys_kernel_entropy_is_recording(void)
{
spin_lock(&entropy_analysis_lock);
return is_kernel_entropy_recording;
spin_unlock(&entropy_analysis_lock);
}
:私は「の値is_kernel_entropy_recording」カーネル変数を返す必要があり、カーネルのシステムコール「sys_kernel_entropy_is_recording」を実装
Q1:は正しい、この実装では全くつまり、 'is_kernel_entropy_recording'の正しい値がuserspaceに返され、その後スピンロックが解放されることを意味しますか?
私の懸念は、以下のとおりです。
- a)は、それがすべてでこの方法をユーザ空間ためにkernelspaceから値を返すことが許されていますか?
- b)return文はの前にあり、のspin_unlock文の前にあるため、spin_unlockを呼び出すこともできますか? Q2
:それだけで動くようspin_lock/spin_unlockコールは完全に、コンパイラによって無視されているこれらに答えるためには自分自身に疑問を私は.oファイルにコンパイルが、決定解体(少なくとも、それはのように私を探します)通話のRETをEAXための「sys_kernel_entropy_is_recording」の値(I「のcallqの0xA5の」行についてはよく分からない):
(gdb) disassemble /m sys_kernel_entropy_is_recording
Dump of assembler code for function sys_kernel_entropy_is_recording:
49 {
0x00000000000000a0 <+0>: callq 0xa5 <sys_kernel_entropy_is_recording+5>
0x00000000000000a5 <+5>: push %rbp
0x00000000000000ad <+13>: mov %rsp,%rbp
50 spin_lock(&entropy_analysis_lock);
51 return is_kernel_entropy_recording;
52 spin_unlock(&entropy_analysis_lock);
53 }
0x00000000000000b5 <+21>: movzbl 0x0(%rip),%eax # 0xbc <sys_kernel_entropy_is_recording+28>
0x00000000000000bc <+28>: pop %rbp
0x00000000000000bd <+29>: retq
そこで私はスピンロックのアプリケーションが正しくないと思いますが...誰かが私にアドバイスをお願いでした適切なアプローチのために? ありがとうございます!
、 'callq'は、実際の関数呼び出しです。あなたの場合、おそらく 'spin_lock'を呼び出します(または、' spin_lock'がマクロまたはインライン関数の場合は、内部*関数*を呼び出します)。これを確認するには、逆アセンブルされたコードに再配置を適用するようにgdbに依頼します。 'spin_unlock'呼び出しに関しては、おそらくコンパイラは* unreachable *としてそれを見つけ、それを単に破棄します。 – Tsyvarev
を参考にして、_atomics_を使用して単一の変数 – myaut
をロックすることを考えましたか? 'return'ステートメントの後のコードに到達できません。私はあなたがコンパイラの警告を受け取らないことに驚いています(あなたはありませんか?) – Kaz