printk_time

来源:互联网 发布:信阳烟草网络 编辑:程序博客网 时间:2024/05/01 19:40
可以通过uboot 添加time 或者打开CONFIG_PRINTK_TIME 来让通过prink 或者do_syslog 打印log的时候显示时间戳


1044 static bool printk_time = IS_ENABLED(CONFIG_PRINTK_TIME);
1045 module_param_named(time, printk_time, bool, S_IRUGO | S_IWUSR);


前面讲过prink 中的log都是通过console_unlock 来调用console driver来打印log的,在调用console driver之前会调用msg_print_text 来给log前面加上时间戳,我们来看看具体实现
2203 void console_unlock(void)
2204 {
2291                 len += msg_print_text(msg, console_prev, false,
2292                                       text + len, sizeof(text) - len);
2293                 if (nr_ext_console_drivers) {
2294                         ext_len = msg_print_ext_header(ext_text,
2295                                                 sizeof(ext_text),
2296                                                 msg, console_seq, console_prev);
2297                         ext_len += msg_print_ext_body(ext_text + ext_len,
2298                                                 sizeof(ext_text) - ext_len,
2299                                                 log_dict(msg), msg->dict_len,
2300                                                 log_text(msg), msg->text_len);
2301                 }


msg_print_text 的实现如下:


1086 static size_t msg_print_text(const struct printk_log *msg, enum log_flags prev,
1087                              bool syslog, char *buf, size_t size)
1088 {
1118                 if (buf) {
1119                         if (print_prefix(msg, syslog, NULL) +
1120                             text_len + 1 >= size - len)
1121                                 break;
1122 
1123                         if (prefix)
1124                                 len += print_prefix(msg, syslog, buf + len);
1125                         memcpy(buf + len, text, text_len);
1126                         len += text_len;
1127                         if (next || newline)
1128                                 buf[len++] = '\n';
1143 }


msg_print_text 又是调用print_prefix 
1063 static size_t print_prefix(const struct printk_log *msg, bool syslog, char *buf)
1064 {
11082         len += print_time(msg->ts_nsec, buf ? buf + len : NULL);
1083         return len;
1084 }


继续调用print_time
1047 static size_t print_time(u64 ts, char *buf)
1048 {
1049         unsigned long rem_nsec;
1050 
1051         if (!printk_time)
1052                 return 0;
1053 
1054         rem_nsec = do_div(ts, 1000000000);
1055 
1056         if (!buf)
1057                 return snprintf(NULL, 0, "[%5lu.000000] ", (unsigned long)ts);
1058 
1059         return sprintf(buf, "[%5lu.%06lu] ",
1060                        (unsigned long)ts, rem_nsec / 1000);
1061 }


哈哈哈终于看到sprintf来格式字符串加时间戳了吧



0 0
原创粉丝点击