2017-10-16 20 views
0

저는 현재 사용자 공간에 값을 반환해야하는 return 문과 함께 커널 스핀 록을 올바르게 구현하는 데 어려움을 겪고 있습니다. 이 질문에 발생하는이 시점에서스핀 락을 사용하여 리눅스 사용자의 스패 락 값 반환하기

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'의 올바른 값이 사용자 공간으로 반환되고 이후에 스핀 락이 해제 될 것인가?

내 문제는 다음과 같습니다

  • A) 전혀 이런 식으로 사용자 공간 kernelspace에서 값을 반환 할 수있다?
  • b) return 문은 앞에 있으며, spin_unlock 문 앞에 있으므로 spin_unlock을 호출 할 수도 있습니까?

Q2 :이 내가 파일 된 .o 컴파일하지만 결정 어셈블 된 자신을 질문이 단지를 이동할 때 spin_lock/spin_unlock 호출이 완전히 컴파일러에 의해 무시된다 (적어도이 같은 날을 찾습니다)에 응답하려면 통화 RET를 EAX하는 'sys_kernel_entropy_is_recording'(나는 '0xa5 callq'라인에 대해 확실하지 않다)의 값은 : 따라서

(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' 호출에 관해서는, 컴파일러는 아마 * 도달 할 수없는 * 것으로 그것을 발견하고 간단히 삭제합니다. – 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;