binder系列二-binder内存管理

binder的内存管理

Server端在启动之后,对/dev/binder设备调用mmap,内核中的binder_mmap函数进行对应的处理:申请一块物理内存,然后Server端的用户空间和内核空间同时进行映射;当Client端发送请求时,请求将数据从Client进程的用户空间拷贝到Server端的内核内存中,因为用户空间和内核空间对该块物理内存进行了同步映射,因此Server端用户空间也可以获得数据了,下面对Server端用户空间与内核空间的同步映射关系进行讲解:
下面为用户空间调用binder_open进行注册过程:

struct binder_state *binder_open(const char* driver, size_t mapsize)
{
    struct binder_state *bs;
    struct binder_version vers;
    bs = malloc(sizeof(*bs));
// 调用内核空间binder_open 生成binder_proc
    bs->fd = open(driver, O_RDWR | O_CLOEXEC);
    bs->mapsize = mapsize;
// 调用内核空间的binder_mmap 进行内存映射
    bs->mapped = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, bs->fd, 0);
}

mmap的前半部分的流程都是类似的,使用结构体vm_area_struct 来描述一个虚拟内存区域;在构造完毕vm_area_struct之后,如果有fd传入,就会判断当前文件描述符是否有mmap赋值,然后调用对应的内核mmap函数,大致的流程如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值