저는 현재 사용자 공간에 값을 반환해야하는 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
나는 스핀 록의 응용 프로그램이 올바르지 않은 것 같다 .. 누군가가 나에게 조언을 전해 주 시겠어요 적절한 접근을 위해서? 미리 감사드립니다.
을,'callq' 실제로 함수 호출이다. 당신의 경우에, 그것은 아마도'spin_lock'을 호출 할 것입니다. (또는'spin_lock'이 매크로 또는 인라인 함수 인 경우, 내부 함수 *를 호출합니다). gdb가 디스 어셈블 된 코드에 재배치를 적용 할 수 있는지 확인하십시오. 'spin_unlock' 호출에 관해서는, 컴파일러는 아마 * 도달 할 수없는 * 것으로 그것을 발견하고 간단히 삭제합니다. – Tsyvarev
을 보조 노트로 사용하여 _atomics_를 사용하여 단일 변수를 잠그는 것으로 생각 했습니까? – myaut
'return' 문 다음에 코드에 도달 할 수 없습니다. 컴파일러 경고 메시지가 표시되지 않는다는 것에 놀랐습니다. (그렇습니까?) – Kaz