Linux内核初探(5)内核内存直接访问

在图像告诉采集的时候,如录像。图片大量传输,传输的数据非常大。若用户像之前使用系统调用的话可能会导致传输数据的效率低。

因为在read/write函数之间是有通过copy_to_user/copy_from_user函数将信息在内核和应用层之间传输的,这中传输方式是通过复制的。不直接。所以内核提供了一个较快的方式,交给应用层来调用。mmap函数。

mmap函数

mmap ( 建立内存映射 )
    头文件:
        #include <unistd.h>
        #include <sys/mman.h>
    定义函数:
 

void *mmap(void *addr, size_t length, int prot, int flags,
           int fd, off_t offset);


    参数分析:
       addr --> 指向欲对应的内存起始地址, 通常设为 NULL, 代表让系统自动选定地址
       length --> 需要申请内存区域的大小
       prot --> 代表映射区域的保护方式有下列组合
            PROT_EXEC 映射区域可被执行
            PROT_READ 映射区域可被读取
            PROT_WRITE 映射区域可被写入
            PROT_NONE 映射区域不能存取
       flags -->会影响映射区域的各种 特性
            MAP_FIXED 如果参数 start 所指的地址无法成功建立映射时, 则放弃映射, 不对地址做修正.通常不鼓励用此旗标.
            MAP_SHARED 对应射区域的写入数据会复制回文件内, 而且允许其他映射该文件的进程共享.
            MAP_PRIVATE 对应射区域的写入操作会产生一个映射文件的复制, 即私人的"写入时复制" (copyon write)对此区域作的任何修改都不会写回原来的文件内容.
            MAP_ANONYMOUS  建立匿名映射. 此时会忽略参数 fd, 不涉及文件, 而且映射区域无法和其他进程共享.
            MAP_DENYWRITE  只允许对应射区域的写入操作, 其他对文件直接写入的操作将会被拒绝.
            MAP_LOCKED  将映射区域锁定住, 这表示该区域不会被置换(swap:交换空间).
               fd --> 需要映射的文件的文件描述符
       offsize --> 偏移量, 一般设置为零,表示不需要偏移 文件与内存是一一对应的
       
   返回值:
       若映射成功则返回映射区的内存起始地址, 
       否则返回 MAP_FAILED(-1), 错误原因存于 errno 中.

有了这个函数,我们就可以在应用层直接操作内核的地址,这样做的目的主要有两个:

1、不想开源内核代码,可以将内核的程序写到应用层

2、需要提高效率,如摄像头需要采集大量的数据的情况


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值