【发布时间】:2017-09-19 15:24:25
【问题描述】:
我需要物理上连续的大型视频帧缓冲区。所以我的问题是当内核驱动请求物理contig内存时,内核返回的虚拟地址是连续的还是非连续的?
更新: 抱歉,让我添加更多细节。对于分辨率为 640x480 且每个像素为 1 字节的视频缓冲区,预计总内存为 307200 字节 (640x480)。对于一个在 4KiB 页面上运行的系统,上述缓冲区所需的总页面数将是 75。
现在让我们假设以某种方式请求的这个 307200 内存块在物理上是连续的。但是当内核返回每个页面的虚拟地址时,这些页面是连续的还是不连续的?
【问题讨论】:
-
如果指向内存区域的虚拟地址不连续......那么它实际上并不指向内存区域。
-
"内核返回的虚拟地址是连续的还是非连续的?" -- 和什么连续?您过度考虑了可能性,和/或没有正确推理出这一点。如果(块的)虚拟地址不连续,那么您必须知道这些地址的所有才能访问它们。 IOW 当分配 块 内存时,只返回块开始的(虚拟)地址,因为该块确实占用了虚拟内存的连续区域。现在这块内存可能与任何其他虚拟内存都不连续。
-
虚拟地址将是连续的,因为您将只获得相应 phy 内存的虚拟内存的起始地址。
标签: linux linux-kernel linux-device-driver v4l2