linux syscall使用spinlock将值返回给用户空间

时间:2017-10-16 18:06:41

标签: linux kernel spinlock kernel-mode userspace

我目前正在努力正确实现kernel-spinlock并结合return语句,该语句应该向用户空间返回一个值。我实现了一个内核系统调用' 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'的值拨打电话(我不确定线路' 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 

因此我猜自旋锁的应用是不正确的..有人可以给我一个适当方法的建议吗? 非常感谢提前!

1 个答案:

答案 0 :(得分:2)

禁止使用spinlock holded从系统调用返回。并且,与C代码一样,在return语句之后不会执行任何指令。

通常的做法是将锁定下获得的值保存到局部变量中,并在解锁后返回此变量的值:

bool ret;

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

return ret;