WEB开发网
开发学院手机开发Android 开发 Android深入浅出之Binder机制 阅读

Android深入浅出之Binder机制

 2012-06-30 10:47:32 来源:WEB开发网   
核心提示:, mVMStart(MAP_FAILED)//映射内存的起始地址, mManagesContexts(false), mBinderContextCheckFunc(NULL), mBinderContextUserData(NULL), mThreadPoolStarted(false), mThreadPoolS
, 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)了
}
...
}
最讨厌这种在构造list中添加函数的写法了,常常疏忽某个变量的初始化是一个函数调用的结果。
open_driver,就是打开/dev/binder这个设备,这个是android在内核中搞的一个专门用于完成
进程间通讯而设置的一个虚拟的设备。BTW,说白了就是内核的提供的一个机制,这个和我们用socket加NET_LINK方式和内核通讯是一个道理。
static intopen_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); }
returnfd;
好了,到这里Process::self就分析完了,到底干什么了呢?
l 打开/dev/binder设备,这样的话就相当于和内核binder机制有了交互的通道
l 映射fd到内存,设备的fd传进去后,估计这块内存是和binder设备共享的

接下来,就到调用defaultServiceManager()地方了。
2.2 defaultServiceManager
defaultServiceManager位置在framework\base\libs\binder\IServiceManager.cpp中
sp<IServiceManager>defaultServiceManager()
{
if (gDefaultServiceManager != NULL) returngDefaultServiceManager;
//又是一个单例,设计模式中叫singleton。
{
AutoMutex_l(gDefaultServiceManagerLock);
if (gDefaultServiceManager == NULL) {
//真正的gDefaultServiceManager是在这里创建的喔
gDefaultServiceManager =interface_cast<IServiceManager>(
ProcessState::self()->getContextObject(NULL));
}
}
return gDefaultServiceManager;
}
-----》
gDefaultServiceManager= interface_cast<IServiceManager>(
ProcessState::self()->getContextObject(NULL));
ProcessState::self,肯定返回的是刚才创建的gProcess,然后调用它的getContextObject,注意,传进去的是NULL,即0
//回到ProcessState类,
sp<IBinder>ProcessState::getContextObject(const sp<IBinder>& caller)
{
if(supportsProcesses()) {//该函数根据打开设备是否成功来判断是否支持process,
//在真机上肯定走这个
return getStrongProxyForHandle(0);//注意,这里传入0
}
}
----》进入到getStrongProxyForHandle,函数名字怪怪的,经常严重阻碍大脑运转
//注意这个参数的命名,handle。搞过windows的应该比较熟悉这个名字,这是对
//资源的一种标示,其实说白了就是某个数据结构,保存在数组中,然后handle是它在这个数组中的索引。--->就是这么一个玩意儿
sp<IBinder>ProcessState::getStrongProxyForHandle(int32_t handle)
{
sp<IBinder> result;

上一页  1 2 3 4 5 6 7  下一页

Tags:Android 深入浅出 Binder

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接