struct binder_state
{
int fd;
void *mapped;
unsigned mapsize;
};
struct binder_state *binder_open(unsigned mapsize)
{
struct binder_state *bs;
bs = malloc(sizeof(*bs));
if (!bs) {
errno = ENOMEM;
return 0;
}
//典型的以miscdevice 形式实现的设备即特殊的字符设备
bs->fd = open("/dev/binder", O_RDWR);
if (bs->fd < 0) {
fprintf(stderr,"binder: cannot open device (%s)\n",
strerror(errno));
goto fail_open;
}
bs->mapsize = mapsize;
//mmap 将 bs->fd 文件mapsize 长度映射到本进程的地址空间,NULL 表示起始地址由系统指定
//MAP_PRIVATE:写入映射区的不会再写到源文件,且不允许其他进程共享
//MAP_SHARED:写入映射区的会再写到源文件,且允许其他进程共享
//
//PROT_READ:映射区的保护方式,分为可读,可写,可执行
//最后一个参数表示从文件的0地址开始映射
bs->mapped = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, bs->fd, 0);//返回映射内存的起始地址
if (bs->mapped == MAP_FAILED) {
fprintf(stderr,"binder: cannot map device (%s)\n",
strerror(errno));
goto fail_map;
}
/* TODO: check version */
return bs;
fail_map:
close(bs->fd);
fail_open:
free(bs);
return 0;
}
void binder_close(struct binder_state *bs)
{
munmap(bs->mapped, bs->mapsize);
close(bs->fd);
free(bs);
}