2017-10-16 5 views
0

私は現在、ユーザースペースに値を返さなければならない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 

そこで私はスピンロックのアプリケーションが正しくないと思いますが...誰かが私にアドバイスをお願いでした適切なアプローチのために? ありがとうございます!

+0

、 'callq'は、実際の関数呼び出しです。あなたの場合、おそらく 'spin_lock'を呼び出します(または、' spin_lock'がマクロまたはインライン関数の場合は、内部*関数*を呼び出します)。これを確認するには、逆アセンブルされたコードに再配置を適用するようにgdbに依頼します。 'spin_unlock'呼び出しに関しては、おそらくコンパイラは* unreachable *としてそれを見つけ、それを単に破棄します。 – Tsyvarev

+0

を参考にして、_atomics_を使用して単一の変数 – myaut

+0

をロックすることを考えましたか? 'return'ステートメントの後のコードに到達できません。私はあなたがコンパイラの警告を受け取らないことに驚いています(あなたはありませんか?) – Kaz

答えて

2

スピンロックを保持してシステムコールから戻ることは禁止されています。そして、Cコードではいつものように、return文の後には何も実行されません。

一般的な方法は、ローカル変数にロックの下で得られた値を保存し、ロックを解除した後、この変数の値を返すことです。逆アセンブルコードについては

bool ret; 

spin_lock(&entropy_analysis_lock); 
ret = is_kernel_entropy_recording; 
spin_unlock(&entropy_analysis_lock); 

return ret; 
関連する問題