资料来自网络,请保护知识产权,请您下载后勿作商用,只可学习交流使用。驱动——杂项
第十五章 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 环形缓冲区的大小
Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。
LOGGER_GET_LOG_LEN :得到当前日志 buffer 中未被读出的日志长度
LOGGER_GET_NEXT_ENTRY_LEN:得到下一条日志长度(即紧接着上次读出的日志后
面一条)
LOGGER_FLUSH_LOG:清空日志
logger_poll
查询当前进程是否可以对logger device 操作。POLLOUT 总是成立的,即进程总是可以写入日
志。但只有以 FMODE_READ 模式打开 logger 设备的进程,并且当前日志非空,才可以读到
日志。
用户接口
logger 日志系统是标准的misc 设备,提供标准的file operation ,应用程序可以通过标准的C
库文件函数操作日志系统。
在Android 应用开发中,比较有用的是 logcat 命令,通过该命令可以查看系统的日志输出,
在调试的时候,应用程序插入日志,在logcat 中就可以看到,这样就实现了方便的插桩跟踪
调试。
logcat 使用方法如下: