【发布时间】:2014-05-03 08:38:54
【问题描述】:
copy_from_user() 用于内核模块。所以我的理解是它在内核空间中运行。 但是,在阅读了此“仅用户上下文。此功能可能会休眠”后,我感到困惑。 谁能给我解释一下?
【问题讨论】:
-
这是一个内核空间函数,在用户上下文中运行。空间(用户/内核)和上下文(用户又名进程/中断)是两个不同的东西。
标签: linux linux-kernel linux-device-driver
copy_from_user() 用于内核模块。所以我的理解是它在内核空间中运行。 但是,在阅读了此“仅用户上下文。此功能可能会休眠”后,我感到困惑。 谁能给我解释一下?
【问题讨论】:
标签: linux linux-kernel linux-device-driver
短语“用户上下文”不是指用户空间执行。它指的是在特定用户进程的上下文中运行的内核代码。必须有一个相关的用户进程,from 参数才有意义。
引用 this web page(我在 Google 上快速搜索“linux 用户上下文”时发现的):
Linux 中有两种上下文(执行流程的模式) 内核:中断和用户(空间)上下文。用户上下文是代码 从用户空间输入的:系统调用。除非内核代码 出于某种原因休眠(明确允许其他代码运行),否 其他用户上下文将在该 CPU 上运行;这是非优先的 部分。它们总是与特定的进程相关联。
但是,任何时间都可能发生中断,这会暂停用户 其轨道中的上下文并运行中断上下文。这不是 与任何过程相关联;它是由定时器引起的,外部 硬件中断,或下半部分(下半部分可能会从 定时器或其他中断,见下文)。完成后,用户 上下文将恢复。
(在 cmets 中,0x90 表明此引用具有误导性,这很可能是正确的。)
【讨论】:
“用户上下文”在这里的意思是当这个函数在内核中被调用时,CPU 必须处于配置为使用与用户进程关联的内存映射的状态。这个映射是特定于每个进程的,基本上有一个映射到内核内存的范围和一个映射到用户进程内存的范围。这就是为什么copy_from_user 能够将字节从进程的内存范围复制到内核内存中的内存缓冲区中。
在某些情况下,例如在处理中断时,CPU 使用不同的内存映射,其中没有用户进程的范围,因此copy_from_user 没有任何意义。
【讨论】: