kmsg_dump_get_buffer()函数会先计算kernel log buf目前总的size,如果这个len和此函数参数len要大,会将seq、idx前移,直到log buf size小于等于参数len,即会将会将log buf开头部分去掉,之后再将后面的log buf整体复制到函数参数buf所表示的buffer里,所以这会将kernel log buf里最新的log复制给调用者。
voidkmsg_dump(enumkmsg_dump_reason reason) {structkmsg_dumper *dumper; unsignedlongflags;if((reason > KMSG_DUMP_OOPS) && !always_kmsg_dump)return; rcu_read_lock(); list_for_each_entry_rcu(dumper,&dump_list, list) {if(dumper->max_reason && reason > dumper->max_reason)continue;/*initi...
dump.dump = oops_do_dump; err = kmsg_dump_register(&dump); if (err) { printk(KERN_ERR "oops: registering kmsg dumper failed, error %d\n", err); return -EINVAL; } my_proc = proc_create("dump_tester", 0, NULL, &my_proc_ops); return 0; } static void __exit my...
在Linux内核5.15版本中,kmsg_dump_get_line()函数用于获取系统的内核日志消息。 该函数定义在文件kernel/printk/kmsg_dump.c中。它是内核转储子系统(kdump)的一部分,负责从转储缓冲区中获取单行日志消息。 下面是该函数的定义: char*kmsg_dump_get_line(structkmsg_dumper*dumper,char*buf,size_tcount) { unsigned...
free(buf);close_ffile:if(ffile)filp_close(ffile,NULL);close_fkmsg:if(fkmsg)filp_close(fkmsg,NULL);out:return;}#endif/*#ifdef CONFIG_PRINTK*/在pr_emerg("Kernel panic - not syncing: %s\n",buf);函数后面调用dump_kmsg_to_file();即可。
kmsg_dump_get_buffer()函数会先计算kernel log buf目前总的size,如果这个len和此函数参数len要大,会将seq、idx前移,直到log buf size小于等于参数len,即会将会将log buf开头部分去掉,之后再将后面的log buf整体复制到函数参数buf所表示的buffer里,所以这会将kernel log buf里最新的log复制给调用者。