Android Binder 通讯内存调整

Android Binder 通讯内存调整

需求:驱动层限制到8M,上层默认改4M,修改点如下:

修改一:kernel\msm-4.9\drivers\android\binder.c
	驱动层Binder大小默认不超过4M,可增加至8M
	#ifndef SZ_8M
	#define SZ_8M                               0x800000
	#endif
	在binder_mmap方法中修改
	if ((vma->vm_end - vma->vm_start) > SZ_8M){
		vma->vm_end = vma->vm_start + SZ_8M;
	}
修改二:frameworks/native/libs/binder/ProcessState.cpp
	#define BINDER_VM_SIZE ((4 * 1024 * 1024) - sysconf(_SC_PAGE_SIZE) * 2)

以下是源码分析,拿来主义者可以不用看了

linux内存的page概念:PAGE_SIZE=4K=4096Byte,可通过getconf PAGESIZE查看:

1|msm8953_64:/ # getconf PAGESIZE
4096
msm8953_64:/ #

源码路径:kernel\msm-4.9\drivers\android\binder.c

static int binder_mmap(struct file *filp, struct vm_area_struct *vma){
	int ret;
	struct binder_proc *proc = filp->private_data;
	const char *failure_string;
    if (proc->tsk != current->group_leader)
		return -EINVAL;
    if ((vma->vm_end - vma->vm_start) > SZ_4M){//限制最大内存4M(实测内存大小只有1016K或者32K,不排除有其他)
		vma->vm_end = vma->vm_start + SZ_4M;
	}
    if (vma->vm_flags & FORBIDDEN_MMAP_FLAGS) {
		ret = -EPERM;
		failure_string = "bad vm_flags";
		goto err_bad_arg;
	}
    vma->vm_flags |= VM_DONTCOPY | VM_MIXEDMAP;
	vma->vm_flags &= ~VM_MAYWRITE;

	vma->vm_ops = &binder_vm_ops;
	vma->vm_private_data = proc;
    ret = binder_alloc_mmap_handler(&proc->alloc, vma);
	if (ret)
		return ret;
	mutex_lock(&proc->files_lock);
    proc->files = get_files_struct(current);
	mutex_unlock(&proc->files_lock);
	return 0;
err_bad_arg:
	pr_err("%s: %d %lx-%lx %s failed %d\n", __func__,
	       proc->pid, vma->vm_start, vma->vm_end, failure_string, ret);
	return ret;
}

抓取binder日志,查看内存信息如下:

[   12.150113] binder:  binder_mmap start pid : 467 range: 7925b4e000-7925b4f000 (4 K) vm_flags 200071 pagep 60000000000f53
[   12.150116] binder: binder_mmap   end  pid: 467  range:7925b4e000-7925b4f000 (4 K) vm_flags 200071 pagep 60000000000f53
[   52.724733] binder:  binder_mmap start pid : 4155 range: 78e0c13000-78e0d11000 (1016 K) vm_flags 200071 pagep 60000000000f53
[   52.724737] binder: binder_mmap   end  pid: 4155  range:78e0c13000-78e0d11000 (1016 K) vm_flags 200071 pagep 60000000000f53

查上层请求binder内存,源码路径:frameworks/native/libs/binder

//frameworks/native/libs/binder/ProcessState.cpp
#define BINDER_VM_SIZE ((1 * 1024 * 1024) - sysconf(_SC_PAGE_SIZE) * 2)
ProcessState::ProcessState(const char *driver)
    : mDriverName(String8(driver))
    , mDriverFD(open_driver(driver))
    , mVMStart(MAP_FAILED)
    , mThreadCountLock(PTHREAD_MUTEX_INITIALIZER)
    , mThreadCountDecrement(PTHREAD_COND_INITIALIZER)
    , mExecutingThreadsCount(0)
    , mMaxThreads(DEFAULT_MAX_BINDER_THREADS)
    , mStarvationStartTimeMs(0)
    , mManagesContexts(false)
    , mBinderContextCheckFunc(nullptr)
    , mBinderContextUserData(nullptr)
    , mThreadPoolStarted(false)
    , mThreadPoolSeq(1)
    , mCallRestriction(CallRestriction::NONE)
{
    if (mDriverFD >= 0) {
        // mmap the binder, providing a chunk of virtual address space to receive transactions.
        //mmap 向内核中请求一块内存,内存大小BINDER_VM_SIZE(1024K-(4096*2)Byte)=1016k,与上面打印的日志一致
        mVMStart = mmap(nullptr, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0);
        if (mVMStart == MAP_FAILED) {
            // *sigh*
            ALOGE("Using %s failed: unable to mmap transaction memory.\n", mDriverName.c_str());
            close(mDriverFD);
            mDriverFD = -1;
            mDriverName.clear();
        }
    }
    LOG_ALWAYS_FATAL_IF(mDriverFD < 0, "Binder driver could not be opened.  Terminating.");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值