一 驱动初始化binder_init
(kernel/drivers/android/binder.c
)
static int __init binder_init(void)
{
int ret;
//创建名为binder单线程工作队列
binder_deferred_workqueue = create_singlethread_workqueue("binder");
if (!binder_deferred_workqueue)
return -ENOMEM;
/* 在/sys/kernel/debug/下,创建以下目录及文件,用于记录binder的运行状态信息
* /sys/kernel/debug/binder
* /sys/kernel/debug/binde/proc
* /
binder_debugfs_dir_entry_root = debugfs_create_dir("binder", NULL);
if (binder_debugfs_dir_entry_root)
binder_debugfs_dir_entry_proc = debugfs_create_dir("proc",
binder_debugfs_dir_entry_root);
/* 注册misc设备: /dev/binder */
ret = misc_register(&binder_miscdev);
if (binder_debugfs_dir_entry_root) {
/* 创建/sys/kernel/debug/binder/state记录状态信息,并注册操作函数*/
debugfs_create_file("state",
S_IRUGO,
binder_debugfs_dir_entry_root,
NULL,
&binder_state_fops);
/* 创建/sys/kernel/debug/binder/stats记录统计信息,并注册操作函数*/
debugfs_create_file("stats",
S_IRUGO,
binder_debugfs_dir_entry_root,
NULL,
&binder_stats_fops);
/* 创建/sys/kernel/debug/binder/transactions记录transaction相关信息,并注册操作函数*/
debugfs_create_file("transactions",
S_IRUGO,
binder_debugfs_dir_entry_root,
NULL,
&binder_transactions_fops);
/* 创建/sys/kernel/debug/binder/transactions_log记录transaction日志相关信息,并注册操作函数*/
debugfs_create_file("transaction_log",
S_IRUGO,
binder_debugfs_dir_entry_root,
&binder_transaction_log,
&binder_transaction_log_fops);
/* 创建/sys/kernel/debug/binder/failed_transactions_log记录失败的transaction日志相关信息,并注册操作函数*/
debugfs_create_file("failed_transaction_log",
S_IRUGO,
binder_debugfs_dir_entry_root,
&binder_transaction_log_failed,
&binder_transaction_log_fops);
}
return ret;
}
device_initcall(binder_init);
从以上代码中可见,设备初始化函数相对来说不难理解,主要完成了以下几件事情:
- 创建名为binder的内核线程,用于处理工作队列中的任务。
- 在
/sys/kernel/debug/
下,创建目录/sys/kernel/debug/binder
和/sys/kernel/debug/binder/proc
,用于记录binder的运行状态、统计及日志等相关信息。 - 调用
misc_register
注册misc设备,其中binder_miscdev
和binder_fops
的定义如下:
static struct miscdevice binder_miscdev = {
.minor = MISC_DYNAMIC_MINOR,
.name = "binder",
.fops = &binder_fops
};
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,
};
- 最后创建一系列文件,这些文件都是
seq_file
类型的/proc
文件,用于记录binder运行时的状态及统计信息等,他们的操作函数都是通过宏BINDER_DEBUG_ENTRY(name)
定义的,具体如下:-
/sys/kernel/debug/binder/state
记录状态信息,并注册操作函数binder_state_fops
。 -
/sys/kernel/debug/binder/stats
记录统计信息,并注册操作函数binder_stats_fops
。 -
/sys/kernel/debug/binder/transactions
记录transaction相关信息,并注册操作函数binder_transactions_fops
。 -
/sys/kernel/debug/binder/transactions_log
记录transaction日志相关信息,并注册操作函数binder_transaction_log_fops
。 -
/sys/kernel/debug/binder/failed_transactions_log
记录失败的transaction日志相关信息,并注册操作函数binder_transaction_log_fops
。
-
网友评论