我目前正在努力正确实现内核自旋锁以及返回语句,该语句应该返回一个值给用户空间。我实现了一个内核系统调用“sys_kernel_entropy_is_recording”,它应该返回一个内核变量“is_kernel_entropy_recording”的值:
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) return 语句位于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
因此,我猜自旋锁的应用是不正确的。有人可以给我一个适当方法的建议吗?提前非常感谢!