C++——open()、mmap()、write()

1.open()
头文件:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

一个demo:

 signed int vpu_socket;
 vpu_socket = open("/dev/rkvdec", O_RDWR);//O_RDWR 以可读写方式打开文件

具体参考:http://blog.csdn.net/linux_loajie/article/details/43916677

2.mmap()
头文件:

#include <sys/mman.h>
#include <unistd.h>

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offsize);
说明:
start通常为NULL;
length为文件的长度;
prot代表映射区域的保护方式;
flags会影响映射区域的各种特性;
fd为open()返回的文件描述词;
offsize为文件映射的偏移量;
具体参考:
http://c.biancheng.net/cpp/html/138.html

运行的时候出现segmentation fault
原因:prot设置为PROT_READ,后面又改动了虚拟地址中的值。
解决方法:prot设置为PROT_WRITE

一个demo:

unsigned char *io_base;
int real_len = SZ_64K;
io_base = mmap(NULL, real_len PROT_READ, MAP_SHARED, mfd, real_base);

3.write()
头文件:

#include <unistd.h>

一种为:ssize_twrite(int handle, void *buf, int nbyte);
该函数将从指定的文件handle 中读取指定大小count个字节到从buf开始的缓冲区中。
handle 是文件描述符

访问物理地址的方式如下:

//打开设备
int fd=open("/dev/mem",O_RDWR);//fd为文件描述符。/dev/mem是整个物理地址空间。

//通过mmap映射物理地址到user space的虚拟地址
unsigned char *vir_addr=mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, physical_addr);//通过文件描述符和物理地址得到虚拟地址

//打印出错信息。如果mmap出错,那么vir_addr会返回(void *)-1;若正确则返回映射到的虚拟地址。
if (vir_addr== (void *)(-1)) {
        fprintf(stderr, "mmap() failed: %s\n", strerror(errno));
        exit(1);
    }

在android8.0上mmap出现错误,要使用mmap64()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值