2014-05-02 60 views
1

copy_from_user()用于内核模块。所以我的理解是它在内核空间运行。然而,在我阅读了这个“只有用户上下文,这个函数可能会睡眠”之后,我感到困惑。 有人可以给我一个解释吗?copy_from_user()在用户空间或内核空间运行?

+0

这是一个内核空间函数,在用户上下文中运行。空间(用户/内核)和上下文(用户又名进程/中断)是两个不同的东西。 – brokenfoot

回答

4

短语“用户上下文”并不涉及用户空间执行。它指的是在特定用户进程的上下文中运行的内核代码。对于from参数必须有一个相关的用户过程才有意义。

报价this web page(我发现有一个快速谷歌搜索“Linux的用户上下文”):

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

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

(在评论的0x90表明,这句话是一种误导,这很可能是正确的。)

+1

我认为这个报价完全是误导性的。有内核线程,irq,softirq上下文和用户线程。从引用可以错误地认为如果内核运行在非用户执行流程上,它在irq上下文中是完全错误的! – 0x90

+1

@ 0x90:然后我建议你发布一个答案。 –

+0

@ 0x90:或者你可以编辑我的,如果你喜欢。 –

0

,当这个函数被调用内核里面,CPU必须在“用户上下文”是指这里它被配置为使用与用户进程关联的内存映射的状态。该映射特定于每个进程,基本上有一个映射到内核内存的范围和一个映射到用户进程内存的范围。这就是为什么copy_from_user能够将进程内存范围内的字节复制到内核内存中的内存缓冲区。

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

相关问题