我在BUG()处遇到内核崩溃 - http://lxr.free-electrons.com/source/mm/bootmem.c?v=3.10#L385并带有以下消息
2kernel BUG at /kernel/mm/bootmem.c:385!
这可能是什么原因?
以下是函数调用跟踪
[<c0e165f8>] (mark_bootmem+0xd0/0xe0) from [<c0e05d64>] (bootmem_init+0x16c/0x26
[<c0e05d64>] (bootmem_init+0x16c/0x264) from [<c0e07980>] (paging_init+0x734/0x7
[<c0e07980>] (paging_init+0x734/0x7d4) from [<c0e03f20>] (setup_arch+0x3e8/0x69c
[<c0e03f20>] (setup_arch+0x3e8/0x69c) from [<c0e007d8>] (start_kernel+0x78/0x370
[<c0e007d8>] (start_kernel+0x78/0x370) from [<10008074>] (0x10008074)
由于
答案 0 :(得分:2)
mm/bootmem.c
文件负责Boot Memory Allocator
。函数mark_bootmem
标记start
和end
地址之间的内存页面(start
向下舍入,end
向上舍入到页边界)作为保留(或不保留)当用于释放时为这个分配器。
迭代bdata_list
,尝试从请求的地址范围中找到包含第一页的区域。它无法找到它,你提到的BUG()
将被触发。如果成功找到它,将触发相同的BUG()
,但该区域不够大(end
在区域之外)。所以这个BUG()
意味着它无法找到要标记的请求内存区域。
现在,如果我正确理解内核代码,在普通的UMA系统上,bdata_list
中只有一个条目,它应该描述系统中可用的低内存页面的范围。由于您没有提供有关系统的太多信息,因此很难猜出问题的确切原因,但一般情况下,您的内存设置似乎已被破坏。这个东西非常具体,因此很难分清楚究竟是什么。