copy_from_user()用于内核模块。所以我的理解是它在内核空间运行。然而,在我阅读了这个“只有用户上下文,这个函数可能会睡眠”之后,我感到困惑。 有人可以给我一个解释吗?copy_from_user()在用户空间或内核空间运行?
回答
短语“用户上下文”并不涉及用户空间执行。它指的是在特定用户进程的上下文中运行的内核代码。对于from
参数必须有一个相关的用户过程才有意义。
报价this web page(我发现有一个快速谷歌搜索“Linux的用户上下文”):
在Linux 内核有两个上下文(执行流程的模式):中断和用户(空间)上下文。用户上下文是从用户空间输入的代码 :系统调用。除非内核代码 由于某种原因睡眠(明确允许其他代码运行),否则不会在该CPU上运行其他用户上下文;除非内核代码 由于某种原因而休眠(明确允许其他代码运行)这是非优先 的一部分。它们总是与特定的过程相关联。
但是,中断可能发生在任何时间,这会暂停用户 上下文并且运行中断上下文。这不是与任何进程相关的 ;它是由定时器,外部硬件中断或外部下半部分(下半部分可能会从 定时器或其他中断请参见下文)引起的。完成后,将恢复用户 上下文。
(在评论的0x90表明,这句话是一种误导,这很可能是正确的。)
我认为这个报价完全是误导性的。有内核线程,irq,softirq上下文和用户线程。从引用可以错误地认为如果内核运行在非用户执行流程上,它在irq上下文中是完全错误的! – 0x90
@ 0x90:然后我建议你发布一个答案。 –
@ 0x90:或者你可以编辑我的,如果你喜欢。 –
,当这个函数被调用内核里面,CPU必须在“用户上下文”是指这里它被配置为使用与用户进程关联的内存映射的状态。该映射特定于每个进程,基本上有一个映射到内核内存的范围和一个映射到用户进程内存的范围。这就是为什么copy_from_user
能够将进程内存范围内的字节复制到内核内存中的内存缓冲区。
在某些情况下,例如处理中断时,CPU使用不同的存储器映射,其中没有用户进程的范围,因此copy_from_user
没有任何意义。
- 1. Linux内核空间和用户空间
- 2. 在用户空间和内核空间上执行进程
- 3. 从内核空间执行用户空间函数
- 4. 内核空间和用户空间的时间差
- 5. 用户空间和内核空间崩溃之间的区别
- 6. std :: threads在用户或内核空间中进行管理?
- 7. 内存分配内核空间和用户空间进程
- 8. 在内核空间和用户空间中工作
- 9. 在用户空间或内核空间中创建Java线程吗?
- 10. Linux内核 - 从用户空间停止正在运行的内核定时器
- 11. Linux内核:从内核空间调用用户空间的回调函数
- 12. ODBC驱动程序在内核空间或用户空间中运行?为什么?
- 13. 用内核触发用户空间
- 14. 从插座读而不从内核空间到用户空间
- 15. 如何回调从用户空间保持到内核空间
- 16. 从内核空间传递地址到用户空间
- 17. 从用户级空间访问内核空间中的变量
- 18. 将用户空间代码移植到内核空间
- 19. 从内核空间绕过数据包到用户空间
- 20. 如何从用户空间访问内核空间?
- 21. 从内核空间访问用户空间 - get_user_pages
- 22. 将数据从内核空间复制到用户空间
- 23. Netlink用户空间和内核空间通信
- 24. 从用户空间到内核空间的memcpy
- 25. 用户空间vs内核空间驱动程序
- 26. Linux用户空间和内核空间调度
- 27. 内核空间和用户空间布局
- 28. a.out内核空间
- 29. bsd内核用户空间事件kqueue
- 30. linux内核和用户地址空间
这是一个内核空间函数,在用户上下文中运行。空间(用户/内核)和上下文(用户又名进程/中断)是两个不同的东西。 – brokenfoot