2017-10-16 86 views
0

我正在努力正確實現內核螺旋鎖與返回語句的結合,該語句應該向用戶空間返回一個值。我實現了一個內核系統調用「sys_kernel_entropy_is_recording」這應該返回的內核變量「is_kernel_entropy_recording」的值:使用螺旋鎖返回值給用戶空間的linux系統調用

asmlinkage bool sys_kernel_entropy_is_recording(void) 
    { 
     spin_lock(&entropy_analysis_lock); 
     return is_kernel_entropy_recording; 
     spin_unlock(&entropy_analysis_lock); 
    } 

此時會出現兩個問題:

Q1:這是實現正確的在所有,意思是將'is_kernel_entropy_recording'的正確值返回給用戶空間,之後釋放自旋鎖?

我的擔憂是:

  • a)是它允許從內核空間返回一個值在所有用戶空間這樣?
  • b)返回語句位於之前 spin_unlock語句,因此spin_unlock會被調用嗎?

Q2:要回答這些質疑自己,我拆開編譯的.o文件,但決定(至少它看起來對我來說等)的用spin_lock/spin_unlock調用由編譯器完全忽略,因爲它只是移動「sys_kernel_entropy_is_recording」到EAX的調用RET(我不知道線「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

禁止使用spinlock從系統調用返回。並且,與通常的C代碼一樣,在return語句後沒有執行任何指令。

常見的做法是,以節省下鎖得到的數值爲局部變量,並解鎖後返回該變量的值:

bool ret; 

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

return ret;