copy_from_user()在用户空间或内核空间中运行?

时间:2014-05-02 18:55:18

标签: linux linux-kernel linux-device-driver

copy_from_user()用于内核模块。所以我的理解是它在内核空间中运行。 但是,在我阅读了这个"仅用户上下文后,我感到困惑。这个功能可能会睡觉。" 有人可以给我一个解释吗?

2 个答案:

答案 0 :(得分:4)

短语"用户上下文"没有提到用户空间执行。它指的是在特定用户进程的上下文中运行的内核代码。必须有一个相关的用户进程才能使from参数有意义。

引用this web page(我通过快速Google搜索" linux用户上下文&#34发现了这一点):

  

Linux中有两种上下文(执行流程模式)   内核:中断和用户(空间)上下文。用户上下文是代码   从用户空间输入:系统调用。除非内核代码   因某种原因睡觉(明确允许其他代码运行),不   其他用户上下文将在该CPU上运行;这是非预选性的   部分。它们总是与特定的过程相关联。

     

但是,中断可以在任何时发生,从而暂停用户   跟踪中的上下文并运行中断上下文。这不是   与任何过程相关;它是由计时器,外部引起的   硬件中断,或下半部分(下半部分可能会运行   定时器或其他中断,见下文)。当它完成时,用户   上下文将恢复。

(在评论中,0x90表明此引用具有误导性,这可能是正确的。)

答案 1 :(得分:0)

“用户上下文”在这里意味着当在内核中调用此函数时,CPU必须处于配置为使用与用户进程关联的内存映射的状态。此映射特定于每个进程,并且基本上具有映射到内核内存的范围和映射到用户进程内存的范围。这就是copy_from_user能够将进程的内存范围中的字节复制到内核内存中的内存缓冲区的原因。

在某些情况下,例如,在处理中断时,CPU使用不同的内存映射,其中没有用户进程的范围,因此copy_from_user没有任何意义。