BpBinder的位置是frameworkbaselibsbinderBP binder.CPP
satus _ TBP binder :3360 transact (
uint 32 _ t代码,const Parcel data,Parcel* reply,uint32_t flags )
{
//又绕了一圈,但调用IPCThreadState的transact。
//请注意。 这里的mHandle是0,代码是ADD_SERVICE_TRANSACTION,data是命令包
//reply是回复包,flags=0
status _ tstatus=ipcthreadstate :3360 self (-transact (
mHandle、code、data、reply和flags;
if(status==dead_object ) mAlive=0;
返回状态;
}
.
}
来看看IPCThreadState的transact函数
status _ tipcthreadstate :3360 transact (int 32 _ thandle,
uint 32 _ t代码,const Parcel data,
Parcel* reply,uint32_t flags )
{
status_t err=data.errorCheck (;
flags |=TF_ACCEPT_FDS;
if(err==no_error ) {
调用writeTransactionData发送数据
err=写入转换数据(BC _ transaction,flags,handle,code,data,NULL );
}
if () flagsTF_one_way )==0) {
if (复制) {
ERR=waitforresponse(reply );
} else {
Parcel fakeReply;
ERR=waitforresponse(fakereply );
}
…等待答复
err=等待响应(null,null );
.
返回错误;
}
再看看这个.
status _ tipcthreadstate :3360 writetransactiondata (int 32 _ tcmd,uint32_t binderFlags,
int32_t handle,uint32_t code,const Parcel data,status_t* statusBuffer )
{
binder_transaction_data tr;
tr.target.handle=handle;
密码:
tr.flags=binderFlags;
const status _ terr=data.error check (;
if(err==no_error ) {
tr.data_size=data.ipcDataSize (;
tr.data.ptr.buffer=data.IPC data (;
tr.offsets _ size=data.ipcobjectscount (* sizeof ) size_t );
tr.data.ptr.offsets=data.IPC objects (;
}
.
在上将命令数据封装为binder_transaction_data,然后
写入mOut时,mOut既是命令的缓冲区,也是Parcel
mout.writeint32(cmd;
mout.write(tr,sizeof ) tr );
只是写在//Parcel上,Parcel似乎与/dev/binder设备没有任何关联,对吧?
是的,它只能在别的地方写在binder设备上。 莫非?
return NO_ERROR;
}
//对了,在等待响应中
status _ tipcthreadstate :3360 wait for response (parcel * reply,status_t *acquireResult ) )。
{
int32_t cmd;
int32_t err;
wile(1) {
//talkWithDriver,哈哈,我想就是这里了
if((err=talkwithdriver ) ) NO_ERROR ) break;
err=mIn.errorCheck (;
if(errno_error ) break;
if(min.dataavail ()==0) continue;
//看到了吗? 我开始在这里操作mIn。 好像在talkWithDriver里面
取出mOut,从驱动程序读取数据并放入mIn。
cmd=mIn.readInt32 (;
交换机(cmd ) {
case br _ transaction _ complete :
if (! 重播! 访问结果(goto finish;
布雷克;
.
返回错误;
}
status _ tipcthreadstate :3360 talkwithdriver (booldoreceive )。
{
binder_write_read bwr;
//中间的太复杂了,不就是把mOut数据和mIn接收数据的处理分配给了bwr吗?
status_t err;
do {
用ioctl读写
(if(ioctl(mprocess-mdriverfd,BINDER_WRITE_READ,bwr )=0) ) ) ) ) ) )
err=NO_ERROR;
else
err=-errno;
}while(err==-eintr );
//到此为止,回复数据位于bwr,bmr接收回复数据buffer由mIn提供
if(BWR.read_consumed0) {
min.set datasize (BWR.read _ consumed;
min.setdata位置(0;
}
return NO_ERROR;
}