首页 > 编程知识 正文

binder机制面试(binder android)

时间:2023-05-06 06:07:20 阅读:77227 作者:2083

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;

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。