第十五章 Android 内核驱动——杂项 15.1 日志系统 基本原理 Android 的 logger 是一种轻量级的日志系统。在内核中实现为一种 misc 设备驱动,它与用户态的logcat工具配合实现了方便的调试工具,开发应用程序的时候可以利用logger查看日志,进行跟踪调试。 logger的实现 logger 的 源代码 在 drivers/staging/android/logger.c 中 ,它用三 个结构 体 logger_log , logger_reader 和 logger_entry来维护 logger 设备的信息。其中 logger_log 代表一个 log 设备,logger_reader 代表一个读日志的 reader,logger_entry代表 writer 写入的一条日志。 logger 在模块初始化时注册三个 misc 设备:log_main, log_events 和 log_radio。其中 log_main记录主要的日志信息,log_events 记录与事件有关的信息,log_radio 记录与通信有关的信息,实现了以下的 file operation: logger_open 标准的 open 接口,如果以读模式打开,则分配一个 logger_reader,初始化其成员变量,并把这个logger_reader保存在file->private_data中。如果是write模式打开,则直接把对应logger设备的 logger_log 保存在 file->private_data。此后在读或者写的时候就可以通过 file-> private_data 找到对应的 logger_reader 或 logger_log。 logger_read 首先当前进程(读 log 的进程)加到 logger_log->wq 等待队列上,判断当前日志 buffer 是否为空,如果空则调度别的进程运行,自己挂起(如果指定了非阻塞模式,则直接返回-EAGAIN),重复上述过程直 buffer 中有日志可读,此时,读出一条日志,拷贝到用户空间,返回。 logger_aio_write 写操作支持同步、异步以及 scatter 方式的写操作。写操作几乎总是成功的,当 buffer 满的时候,新写入的日志会覆盖最初的日志。总之,buffer 是环形的,如果没有及时被读出,数据会丢失。 logger_ioctl 支持以下命令: LOGGER_GET_LOG_BUF_SIZE:得到 logger device 环形缓冲区的大小 LOGGER_GET_LOG_LEN :得到当前日志 buffer 中未被读出的日志长度LOGGER_GET_NEXT_ENTRY_LEN:得到下一条日志长度(即紧接着上次读出的日志后面一条) LOGGER_FLUSH_LOG:清空日志 logger_poll 查询当前进程是否可以对logger device 操作。POLLOUT 总是成立的,即进程总是可以写入日志。但只有以FMODE_READ 模式打开 lo...