3.2.5. 数字电视 mmap()¶
3.2.5.1. 名称¶
dmx-mmap - 将设备内存映射到应用程序地址空间
警告
此 API 仍处于实验阶段
3.2.5.2. 概要¶
#include <unistd.h>
#include <sys/mman.h>
-
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)¶
3.2.5.3. 参数¶
start
将缓冲区映射到应用程序地址空间中的此地址。 当指定
MAP_FIXED
标志时,start
必须是页大小的倍数,并且当指定的地址无法使用时,mmap 将失败。 不鼓励使用此选项; 应用程序应该在此处只指定一个NULL
指针。length
要映射的内存区域的长度。 这必须是 DVB 数据包长度的倍数(在大多数驱动程序上为 188)。
prot
prot
参数描述了所需的内存保护。 无论设备类型和数据交换的方向如何,都应设置为PROT_READ
|PROT_WRITE
,允许对图像缓冲区进行读写访问。 驱动程序应至少支持此标志组合。flags
flags
参数指定映射对象的类型、映射选项以及对页面的映射副本所做的修改是进程私有的还是与其他引用共享。MAP_FIXED
请求驱动程序选择除指定地址之外的其他地址。 如果指定的地址无法使用,则mmap()
将失败。 如果指定了MAP_FIXED
,则start
必须是页大小的倍数。 不鼓励使用此选项。必须设置
MAP_SHARED
或MAP_PRIVATE
标志之一。MAP_SHARED
允许应用程序与其他(例如,子)进程共享映射的内存。注意
Linux 数字电视应用程序不应设置
MAP_PRIVATE
、MAP_DENYWRITE
、MAP_EXECUTABLE
或MAP_ANON
标志。fd
由
open()
返回的文件描述符。offset
设备内存中缓冲区的偏移量,由 ioctl DMX_QUERYBUF ioctl 返回。
3.2.5.4. 描述¶
mmap()
函数请求将设备内存中从 offset
开始的 length
字节映射到由 fd
指定的应用程序地址空间中,最好位于地址 start
。 后一个地址只是一个提示,通常指定为 0。
合适的长度和偏移量参数通过 ioctl DMX_QUERYBUF ioctl 查询。 必须先使用 ioctl DMX_REQBUFS ioctl 分配缓冲区,然后才能查询它们。
要取消映射缓冲区,请使用 munmap()
函数。
3.2.5.5. 返回值¶
成功时,mmap()
返回指向映射缓冲区的指针。 发生错误时,返回 MAP_FAILED
(-1),并且 errno
变量会进行相应的设置。 可能的错误代码包括
- EBADF
fd
不是有效的文件描述符。- EACCES
未打开
fd
以进行读取和写入。- EINVAL
start
或length
或offset
不合适。 (例如,它们太大,或者没有对齐PAGESIZE
边界。)不支持
flags
或prot
值。尚未通过 ioctl DMX_REQBUFS ioctl 分配缓冲区。
- ENOMEM
没有足够的物理或虚拟内存来完成请求。