我知道内核空间专门用于运行内核,而用户空间专用于用户应用程序。
但在阅读了与OS相关的一篇论文中的以下段落之后我很困惑,
假设我们有手势识别系统,并且该设计将系统分解为四个组件,实现为单独的程序:
接下来他们提到了以下执行流程:
“从摄像机读取数据需要将图像缓冲区从内核空间复制到用户空间。 写入连接 catusb 到 xform 的管道会导致将相同的缓冲区写回内核空间。要在GPU上运行 xform ,系统必须将内核空间中的缓冲区读入用户空间,其中用户模式运行时,例如 CUDA 必须随后将缓冲区写回内核空间并将其传输到GPU并返回。“
所以我想知道的是:
如果相机缓冲区是一个内存空间驻留在RAM中,那么在阅读时 来自相机的数据为什么要从内核空间读取它我不明白,是因为缓冲区本身位于内核空间(换句话说,是硬件设备的内存映射到RAM驻留在内核空间)?,
即使相机缓冲区驻留在相机的芯片上也是如此 读取是通过内核复制缓冲区从相机芯片到 用户空间直接,我是对的?如果是这样,为什么它在提到 将缓冲区从内核复制到用户空间的段落。
答案 0 :(得分:3)
操作系统的工作是允许很多组件(包括硬件和软件)相互配合。通常,用户程序不能直接操作外围设备,也不能相互干扰。我不熟悉您引用的具体设置,但这听起来并不常见。
USB摄像头通知操作系统它有一个新帧。当内核(驱动程序)注意到它时,会将带有I / O命令的帧复制到RAM中。由于此RAM是由驱动程序分配的,因此用户程序将无法通过虚拟内存查看或读取它。为了快速概括,内核中的地址& 0x1000和程序中的地址& 0x1000实际上是RAM中的物理上不同的位置。然后内核将帧复制到任何期望从摄像机输入的进程的内存中,然后通知它(在这种情况下 catusb )。
同样,由于 xform ,检测和 hdinput 作为单独的进程存在,因此它们必须使用进程间通信。由于操作系统必须确保程序的隔离,因此每个进程都将利用内核来实现这一目标。
这里没什么不寻常的。我想他们只是把它拼写出来,因为手势识别是时间关键的,这样做有一些开销。