05.Binder系统:第6课第3节_Binder系统_驱动情景分析_服务注册过程_概述

在上一节的视频中,我们在binder驱动中,添加了一些打印信息,我们首先来回忆一下驱动程序的框架。

应用程序访问驱动是通过open。read。write,ioctrol等,在驱动程序也存在对应的drv_open。drv_read。drv_write,drv_ioctrol等,一般驱动的编写流程如下:
1.构造文件描述符file_operations结构体。
2.告诉内核,即注册驱动,调用register_chardev()。
3.入口函数调用register_chardev()。

打开SDK\kernel-release-4.4\drivers\android\binder.c从binder_init函数看起(只摘选重要部分):


static const struct file_operations binder_fops = {
	.owner = THIS_MODULE,
	.poll = binder_poll,
	.unlocked_ioctl = binder_ioctl,
	.compat_ioctl = binder_ioctl,
	.mmap = binder_mmap,
	.open = binder_open,
	.flush = binder_flush,
	.release = binder_release,
};
static int __init binder_init(void)
	ret = init_binder_device(device_name);
		binder_device->miscdev.fops = &binder_fops;
		misc_register(&binder_device->miscdev);//注册binder驱动

现在在我们进入service_manager.c文件,从main函数开始:

int main()
	bs = binder_open(128*1024);
		/*打开binder驱动程序*/
		bs->fd = open("/dev/binder", O_RDWR | O_CLOEXEC);
	/*告诉binder驱动自己是一个service_manager,当其他的应用程序向handel为0的
	进程发送数据的时候,即使给service_manager进程发送数据,方便binder找到service_manager进程*/
	if (binder_become_context_manager(bs)) {
	binder_loop(bs, svcmgr_handler);
		/*发起一个写操作*/
	 	readbuf[0] = BC_ENTER_LOOPER;//对所有进程进入监视读操作
    	binder_write(bs, readbuf, sizeof(uint32_t));
    	/*代表不需要写入什么东西*/
		bwr.write_size = 0;
	    bwr.write_consumed = 0;
	    bwr.write_buffer = 0;
	    for (;;) {
	    	/*发起一个读操作,但是我们首先运行的进程为service_manager进程
	    	所以运行到这里,进入休眠状态,等待其他的进程写操作,如我们编写的
	    	test_server.c进程*/
	    	res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);

上面是service_manager进程的流程,在其调用open的时候,会导致内核drivers\android\binder.c驱动中的binder_open被调用:

static int binder_open(struct inode *nodp, struct file *filp)
	/*对于每个进程,在调用open函数的时候,都会根据其进程信息构造一个
	binder_proc *proc结构体*/
	struct binder_proc *proc;
	proc = kzalloc(sizeof(*proc), GFP_KERNEL);	

下面是service_manager.c与test_server.c交互的一个简单图示:
在这里插入图片描述

binder驱动的交互会涉及两个进程,A进程发送一个消息(BC_TRANSACTION)给进程B,B就收到((BR_TRANSACTION))处理完之后也会回复一个消息(BC_REPLY)给A,最后A接收到一个(BR_REPLY),只有这几个消息是涉及到进程之间的通信的,其他的消息(BC_xxxx或者BR_xxxx),都是进程和驱动之间的交互,用于改变或者报告状态。简单的图示如下:
在这里插入图片描述

在test_server.c执行mmap之后,他会发起一个写操作,命令为BC_TRANSACTION:
在这里插入图片描述
图上的那些会被放入service_manager的todo链表。我们知道每个struct binder_proc *proc中都存在一个todo链表,然后test_server还会唤醒service_manager。

前面书说道service_manager进入休眠状态,现在就被唤醒了,然后他就能到上图的那些数据,那些数据中,包含了服务的名称等等。等service_manager处理完之后,service_manager会发送一个BC_REPLY的消息,告诉test_server。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南才尽,年少无知!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值