Android日志系统驱动程序Logger源代码分析

上传人:飞*** 文档编号:44244490 上传时间:2018-06-09 格式:DOCX 页数:20 大小:53.95KB
返回 下载 相关 举报
Android日志系统驱动程序Logger源代码分析_第1页
第1页 / 共20页
Android日志系统驱动程序Logger源代码分析_第2页
第2页 / 共20页
Android日志系统驱动程序Logger源代码分析_第3页
第3页 / 共20页
Android日志系统驱动程序Logger源代码分析_第4页
第4页 / 共20页
Android日志系统驱动程序Logger源代码分析_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《Android日志系统驱动程序Logger源代码分析》由会员分享,可在线阅读,更多相关《Android日志系统驱动程序Logger源代码分析(20页珍藏版)》请在金锄头文库上搜索。

1、 我们知道,在 Android 系统中,提供了一个轻量级的日志系统,这个日志系统是以驱动程序的形式实现在内核空间的,而在用户空间分别提供了 Java 接口和C/C+接口来使用这个日志系统,取决于你编写的是 Android 应用程序还是系统组件。在前面的文章浅谈 Android 系统开发中 LOG 的使用中,已经简要地介绍了在Android 应用程序开发中 Log 的使用方法,在这一篇文章中,我们将更进一步地分析 Logger 驱动程序的源代码,使得我们对 Android 日志系统有一个深刻的认识。既然 Android 日志系统是以驱动程序的形式实现在内核空间的,我们就需要获取 Android

2、内核源代码来分析了,请参照前面在 Ubuntu 上下载、编译和安装Android 最新源代码和在 Ubuntu 上下载、编译和安装 Android 最新内核源代码(Linux Kernel)两篇文章,下载好 Android 源代码工程。Logger 驱动程序主要由两个文件构成,分别是:kernel/common/drivers/staging/android/logger.hkernel/common/drivers/staging/android/logger.c接下来,我们将分别介绍 Logger 驱动程序的相关数据结构,然后对 Logger驱动程序源代码进行情景分析,分别日志系统初始化情

3、景、日志读取情景和日志写入情景。一. Logger 驱动程序的相关数据结构。我们首先来看 logger.h 头文件的内容:view plain1.#ifndef _LINUX_LOGGER_H 2.#define _LINUX_LOGGER_H 3. 4.#include 5.#include 6. 7.struct logger_entry 8. _u16 len; /* length of the payload */ 9. _u16 _pad; /* no matter what, we get 2 bytes of padding */ 10. _s32 pid; /* generat

4、ing processs pid */ 11. _s32 tid; /* generating processs tid */ 12. _s32 sec; /* seconds since Epoch */ 13. _s32 nsec; /* nanoseconds */ 14. char msg0; /* the entrys payload */ 15. ; 16. 17. #define LOGGER_LOG_RADIO “log_radio“ /* radio-related messages */ 18. #define LOGGER_LOG_EVENTS “log_events“

5、/* system/hardware events */ 19. #define LOGGER_LOG_MAIN “log_main“ /* everything else */ 20. 21. #define LOGGER_ENTRY_MAX_LEN (4*1024) 22. #define LOGGER_ENTRY_MAX_PAYLOAD 23. (LOGGER_ENTRY_MAX_LEN - sizeof(struct logger_entry) 24. 25. #define _LOGGERIO 0xAE 26. 27. #define LOGGER_GET_LOG_BUF_SIZE

6、_IO(_LOGGERIO, 1) /* size of log */ 28. #define LOGGER_GET_LOG_LEN _IO(_LOGGERIO, 2) /* used log len */ 29. #define LOGGER_GET_NEXT_ENTRY_LEN _IO(_LOGGERIO, 3) /* next entry len */ 30. #define LOGGER_FLUSH_LOG _IO(_LOGGERIO, 4) /* flush log */ 31. 32. #endif /* _LINUX_LOGGER_H */ struct logger_entry

7、 是一个用于描述一条 Log 记录的结构体。len 成员变量记录了这条记录的有效负载的长度,有效负载指定的日志记录本身的长度,但是不包括用于描述这个记录的 struct logger_entry 结构体。回忆一下我们调用android.util.Log 接口来使用日志系统时,会指定日志的优先级别 Priority、Tag 字符串以及 Msg 字符串,Priority + Tag + Msg 三者内容的长度加起来就是记录的有效负载长度了。_pad 成员变量是用来对齐结构体的。pid 和 tid 成员变量分别用来记录是哪条进程写入了这条记录。sec 和 nsec 成员变量记录日志写的时间。msg

8、成员变量记录的就有效负载的内容了,它的大小由 len 成员变量来确定。接着定义两个宏:#define LOGGER_ENTRY_MAX_LEN (4*1024)#define LOGGER_ENTRY_MAX_PAYLOAD (LOGGER_ENTRY_MAX_LEN - sizeof(struct logger_entry)从这两个宏可以看出,每条日志记录的有效负载长度加上结构体 logger_entry的长度不能超过 4K 个字节。logger.h 文件中还定义了其它宏,读者可以自己分析,在下面的分析中,碰到时,我们也会详细解释。再来看 logger.c 文件中,其它相关数据结构的定义:v

9、iew plain1./* 2. * struct logger_log - represents a specific log, such as main or radio 3. * 4. * This structure lives from module insertion until module removal, so it does 5. * not need additional reference counting. The structure is protected by the6. * mutex mutex. 7. */ 8.struct logger_log 9. u

10、nsigned char * buffer; /* the ring buffer itself */ 10. struct miscdevice misc; /* misc device representing the log */ 11. wait_queue_head_t wq; /* wait queue for readers */ 12. struct list_head readers; /* this logs readers */ 13. struct mutex mutex; /* mutex protecting buffer */ 14. size_t w_off;

11、/* current write head offset */ 15. size_t head; /* new readers start here */ 16. size_t size; /* size of the log */ 17. ; 18. 19. /* 20. * struct logger_reader - a logging device open for reading 21. * 22. * This object lives from open to release, so we dont need additional 23. * reference counting

12、. The structure is protected by log-mutex. 24. */ 25. struct logger_reader 26. struct logger_log * log; /* associated log */ 27. struct list_head list; /* entry in logger_logs list */ 28. size_t r_off; /* current read head offset */ 29. ; 30. 31. /* logger_offset -returns index n into the log via (o

13、ptimized) modulus */ 32. #define logger_offset(n) (n) 8.static struct logger_log VAR = 9. .buffer = _buf_ # VAR, 10. .misc = 11. .minor = MISC_DYNAMIC_MINOR, 12. .name = NAME, 13. .fops = 23. 24. DEFINE_LOGGER_DEVICE(log_main, LOGGER_LOG_MAIN, 64*1024) 25. DEFINE_LOGGER_DEVICE(log_events, LOGGER_LOG

14、_EVENTS, 256*1024) 26. DEFINE_LOGGER_DEVICE(log_radio, LOGGER_LOG_RADIO, 64*1024) 分别是 log_main、log_events 和 log_radio,名称分别LOGGER_LOG_MAIN、LOGGER_LOG_EVENTS 和 LOGGER_LOG_RADIO,它们的次设备号为 MISC_DYNAMIC_MINOR,即为在注册时动态分配。在 logger.h文件中,有这三个宏的定义:#define LOGGER_LOG_RADIO “log_radio“ /* radio-related messages

15、*/#define LOGGER_LOG_EVENTS“log_events“/* system/hardware events */#define LOGGER_LOG_MAIN“log_main“ /* everything else */注释说明了这三个日志设备的用途。注册的日志设备文件操作方法为logger_fops:view plain1.static struct file_operations logger_fops = 2. .owner = THIS_MODULE, 3. .read = logger_read, 4. .aio_write = logger_aio_write, 5. .poll = logger_poll, 6. .unlock

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号