基于Android7.0
先介紹下ProcessState录别,這個對象屬于進(jìn)程單例,屬于native層组题,在改對象初始化的時候會進(jìn)行binder_open()和binder_mmap(),可以認(rèn)為這里是每個進(jìn)程對于binder初始化的地方。
//ProcessState.cpp
ProcessState::ProcessState()
: mDriverFD(open_driver())
...
{
//void * mmap(void *start, size_t length, int port, int flag, int fd, off_t offset)
//start:通常取0崔列,表示內(nèi)核來指定
//length:映射內(nèi)存區(qū)域大小
//port: PROT_READ表示可讀
//flag: MAP_PRIVATE建立一個寫入時拷貝的私有映射,MAP_NORESERVE不保留交換空間
//經(jīng)過喲一些列的函數(shù)調(diào)用最終執(zhí)行到驅(qū)動程序的file_operation的mmap函數(shù)赵讯,在這里即binder_mmap函數(shù)
mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVER, mDriverFD, 0);
}
static int open_driver(){
//這里就會調(diào)用到Binder驅(qū)動的binder_open函數(shù)
int fd = open("/dev/binder", O_RDWR);
fcntl(fd, F_SETFD, FD_CLOSEXEC);
//在分析binder_ioctl再分析
ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads);
}
static int binder_open(struct inode *nodp, struct file *filp){
//該結(jié)構(gòu)是某個進(jìn)程在Binder驅(qū)動的代表
struct binder_proc *proc;
//內(nèi)核分配內(nèi)存
proc = kzalloc(sizeof(*proc), GFP_KERNEL);
//current是一個宏定義趣效,表示獲取當(dāng)前進(jìn)程的task_struct結(jié)構(gòu),表示某個進(jìn)程在內(nèi)核中的表示
get_task_struct(current);
//保存當(dāng)前進(jìn)程的task_struct到binder_proc中
proc->tsk = current;
//屬于宏定義跷敬,表示初始化todo隊(duì)列
INIT_LIST_HEAD(&proc->todo);
//初始化等待隊(duì)列
init_waitqueue_head(&proc->wait);
//保存進(jìn)程優(yōu)先級
proc->default_priority = task_nice(current);
//將proc_node保存到Binder進(jìn)程全局binder_procs鏈表
hlist_add_head(&proc->proc_node, &binder_procs);
//保存當(dāng)前pid
proc->pid = current->group_leader->pid;
INIT_LIST_HEADER(&proc->delivered_death);
//保存binder_proc,這樣在其他binder其他相關(guān)函數(shù)都可以方便得到binder_proc
filp->private_data = proc;
}
其實(shí)binder_open( )函數(shù)比較簡單西傀,就是在Binder驅(qū)動創(chuàng)建一個代表自身進(jìn)程的binder_proc結(jié)構(gòu),同時保存一些必要的信息拥褂。
隨后配合binder_mmap( ) 就算是完成了一個進(jìn)程對于Binder驅(qū)動的初始化工作