Android深入浅出之Binder机制

参考 http://www.cnblogs.com/innost/archive/2011/01/09/1931456.html

以MediaService的例子来分析Binder的使用

MediaService的源码文件在:framework\base\Media\MediaServer\Main_mediaserver.cpp中。

int main(int argc, char** argv)

{

//FT,就这么简单??

//获得一个ProcessState实例

sp<ProcessState> proc(ProcessState::self());

//得到一个ServiceManager对象

    sp<IServiceManager> sm = defaultServiceManager();

    MediaPlayerService::instantiate();//初始化MediaPlayerService服务

    ProcessState::self()->startThreadPool();//看名字,启动Process的线程池?

    IPCThreadState::self()->joinThreadPool();//将自己加入到刚才的线程池?

}



一个一个分析

ProcessState位置在framework\base\libs\binder\ProcessState.cpp


sp<ProcessState> ProcessState::self()

{

    if (gProcess != NULL) return gProcess;---->第一次进来肯定不走这儿

    AutoMutex _l(gProcessMutex);--->锁保护

    if (gProcess == NULL) gProcess = new ProcessState;--->创建一个ProcessState对象

return gProcess;--->看见没,这里返回的是指针,但是函数返回的是sp<xxx>,所以

//把sp<xxx>看成是XXX*是可以的

}

再来看看ProcessState构造函数

//这个构造函数看来很重要

ProcessState::ProcessState()

    : mDriverFD(open_driver())----->Android很多代码都是这么写的,稍不留神就没看见这里调用了一个很重要的函数

    , mVMStart(MAP_FAILED)//映射内存的起始地址

    , mManagesContexts(false)

    , mBinderContextCheckFunc(NULL)

    , mBinderContextUserData(NULL)

    , mThreadPoolStarted(false)

    , mThreadPoolSeq(1)

{

if (mDriverFD >= 0) {

//BIDNER_VM_SIZE定义为(1*1024*1024) - (4096 *2) 1M-8K

        mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE,

 mDriverFD, 0);//这个需要你自己去man mmap的用法了,不过大概意思就是

//将fd映射为内存,这样内存的memcpy等操作就相当于write/read(fd)了

    }

    ...

}


open_driver,就是打开/dev/binder这个设备,这个是android在内核中搞的一个专门用于完成

进程间通讯而设置的一个虚拟的设备。BTW,说白了就是内核的提供的一个机制,这个和我们用socket加NET_LINK方式和内核通讯是一个道理。

static int open_driver()

{

    int fd = open("/dev/binder", O_RDWR);//打开/dev/binder

    if (fd >= 0) {

      ....

        size_t maxThreads = 15;

       //通过ioctl方式告诉内核,这个fd支持最大线程数是15个。

        result = ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads);    }

return fd;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值