ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
Logger日志驱动程序主要使用到了logger_entry、logger_log和logger_reader三个结构体。下面我们就详细描述它们的定义。 **struct logger_entry** **kernel/goldfish/drivers/staging/android/logger.h** ~~~ struct logger_entry { __u16 len; /* length of the payload */ __u16 __pad; /* no matter what, we get 2 bytes of padding */ __s32 pid; /* generating process's pid */ __s32 tid; /* generating process's tid */ __s32 sec; /* seconds since Epoch */ __s32 nsec; /* nanoseconds */ char msg[0]; /* the entry's payload */ }; #define LOGGER_ENTRY_MAX_LEN (4*1024) #define LOGGER_ENTRY_MAX_PAYLOAD \ (LOGGER_ENTRY_MAX_LEN - sizeof(struct logger_entry)) ~~~ 结构体logger_entry用来描述一个日志记录。每一个日志记录的最大长度为4K,其中,日志记录的有效负载长度最大等于4K减去结构体logger_entry的大小。成员变量len表示实际的日志记录的有效负载长度;成员变量__pad没有实际意义,是用来将成员变量pid的地址值对齐到4字节边界的;成员变量pid和tid记录写入该日志记录的进程的TGID和PID,即线程组ID和进程ID;成员变量sec和nsec记录写入该日志记录的时间,它们是用标准基准时间(Epoch) 1 来描述的;成员变量msg记录的是实际写入的日志记录内容,它的长度是可变的,由成员变量len决定。 **struct logger_log** **kernel/goldfish/drivers/staging/android/logger.c** ~~~ /* * struct logger_log - represents a specific log, such as 'main' or 'radio' * * This structure lives from module insertion until module removal, so it does * not need additional reference counting. The structure is protected by the * mutex 'mutex'. */ struct logger_log { unsigned char * buffer; /* the ring buffer itself */ struct miscdevice misc; /* misc device representing the log */ wait_queue_head_t wq; /* wait queue for readers */ struct list_head readers; /* this log's readers */ struct mutex mutex; /* mutex protecting buffer */ size_t w_off; /* current write head offset */ size_t head; /* new readers start here */ size_t size; /* size of the log */ }; ~~~ 结构体logger_log用来描述一个日志缓冲区。在Logger日志驱动程序中,每一种类型的日志都对应有一个单独的日志缓冲区。成员变量buffer指向一个内核缓冲区,用来保存日志记录,它是循环使用的,大小由成员变量size决定;成员变量misc的类型为miscdevice,用来描述一个日志设备2;成员变量wq是一个等待队列,用来记录那些正在等待读取新的日志记录的进程;成员变量readers是一个列表,用来记录那些正在读取日志记录的进程,每一个进程都使用一个结构体logger_reader来描述;成员变量mutex是一个互斥量,用来保护日志缓冲区的并发访问3;成员变量w_off表示下一条要写入的日志记录在日志缓冲区中的位置;成员变量head表示当一个新的进程读取日志时,它应该从日志缓冲区中的什么位置开始读取。 **struct logger_reader** **kernel/goldfish/drivers/staging/android/logger.c** ~~~ /* * struct logger_reader - a logging device open for reading * * This object lives from open to release, so we don't need additional * reference counting. The structure is protected by log->mutex. */ struct logger_reader { struct logger_log * log; /* associated log */ struct list_head list; /* entry in logger_log's list */ size_t r_off; /* current read head offset */ }; ~~~ 结构体logger_reader用来描述一个正在读取某一个日志缓冲区的日志记录的进程。成员变量log指向要读取的日志缓冲区结构体;成员变量list是一个列表项,用来连接所有读取同一种类型日志记录的进程;成员变量r_off表示当前进程要读取的下一条日志记录在日志缓冲区中的位置。 > 注: > 1. 也称为格林威治时间或者新纪元时间,即1970.1.1 00:00:00 GMT。 > 2. Linux将硬件设备划分为字符(char)设备、块(block)设备和misc设备三种类型。每一个设备都有自己的主设备号和从设备号,其中,相同类型的设备具有相同的主设备号,但是具有不同的从设备号。有关Linux设备的知识,可以参考《Linux Device Drivers》一书。 > 3. 同一种类型的日志可能会被多个进程同时读写,因此,需要对它的日志缓冲区进行并发访问保护。