3.10 kernel_bootmem()中的内核崩溃BUG()

时间:2014-04-04 21:35:15

标签: linux memory-management linux-kernel kernel device-tree

我在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)

由于

1 个答案:

答案 0 :(得分:2)

mm/bootmem.c文件负责Boot Memory Allocator。函数mark_bootmem标记startend地址之间的内存页面(start向下舍入,end向上舍入到页边界)作为保留(或不保留)当用于释放时为这个分配器。

迭代bdata_list,尝试从请求的地址范围中找到包含第一页的区域。它无法找到它,你提到的BUG()将被触发。如果成功找到它,将触发相同的BUG(),但该区域不够大(end在区域之外)。所以这个BUG()意味着它无法找到要标记的请求内存区域。

现在,如果我正确理解内核代码,在普通的UMA系统上,bdata_list中只有一个条目,它应该描述系统中可用的低内存页面的范围。由于您没有提供有关系统的太多信息,因此很难猜出问题的确切原因,但一般情况下,您的内存设置似乎已被破坏。这个东西非常具体,因此很难分清楚究竟是什么。