在内存发生panic时,需要把panic的日志保存下来。以方便日后进行分析。
一般主机为x86的时候,panic 使用 kdump保存log。由于它使用占用大量内存和硬盘。所以当磁盘空间不够时,就会遇到问题。
所以此时使用crashlog.
carshlog
在内核中有一个叫crashlog的东东,它完成如下操作
操作如下
1.在linux内核启动时,保留一64K内存。用于记录panic日志。
2.使用kmsg_dump_register,注册一个回调函数,当发生panic,oops时,把日志记到保留内存。
3.linux内核上电后,把保留内存的内容写入文件
kmsg_dump是oops时进入kmsg_dump的入口。由panic,die,oops_exit等函数调用。它会一一调用回调函数。
每一个回调函数都会用到kmsg_dump_get_buffer---将当前内存log 写入
oid __meminit crashlog_init_memblock(phys_addr_t addr, phys_addr_t size)
{
if (crashlog_addr)
return;
addr = CRASHLOG_ADDR;
if (memblock\_reserve(addr, xxxxLOG\_SIZE)) {
printk("C
crashlog failed to allocate ramat address 0x%lx\n", (unsigned long) addr);
return;
}
crashlog\_addr = addr;
}
static void crashlog_do_dump(struct kmsg_dumper *dumper,
enum kmsg_dump_reason reason)
{
struct timeval tv;
struct module *m;
char *buf;
size_t len;
gettimeofday(&tv);
crashlog\_printf("Time: %lu.%lu\\n",
(long)tv.tv\_sec, (long)tv.tv\_usec);
buf = (char \*)&crashlog\_buf->data\[crashlog\_buf->len\];
kmsg\_dump\_get\_buffer(dumper, true, buf, get\_maxlen(), &len);
crashlog\_buf->len += len;
}
copy from https://blog.csdn.net/sunshineywz/article/details/106601116
手机扫一扫
移动阅读更方便
你可能感兴趣的文章