我的系统内存充足(24GB 的服务器)。在我的系统中,内核空间被分配了 320MB 和 120MB 用于崩溃内核。剩余的内存用于其他目的。但是,当我__get_free_pages()
用来分配顺序为 11 的连续页面时,内核无法分配 2^10 个页面。为什么?
order 的最大允许值为 10 或 11(对应于 1024 或 2048 页),具体取决于架构。但是,除了新启动的具有大量内存的系统之外,order-10 分配成功的可能性很小。
为什么呢?我系统中的每一页为 4KB(4096 字节),2^10 页 = 1024 页,总大小为 1024*4096 = 4 194 304(字节)~4MB。它只有 4MB 的连续空间,内核非常小:vmlinuz 只有 2.1MB,initrd 是 15MB。整个内核的总内存消耗约为 300MB。内核分配 4MB 的连续页面必须绰绰有余。即使在具有 1GB/3GB 内核/用户的普通机器上,也确保内核不会用完整个 1GB。但是只有 4MB 连续页面的分配怎么会失败呢?而且我认为,在内核空间中,内存不是分散在物理内存中(由于虚拟内存映射),而是线性且连续的。
我尝试首先使用 2^10 页分配加载我的内核模块,但它失败并转储堆栈跟踪:
[ 6.037056] [<ffffffff810041ec>] dump_trace+0x86/0x2de
[ 6.037063] [<ffffffff8122fe83>] dump_stack+0x69/0x6f
[ 6.037070] [<ffffffff8108704e>] warn_alloc_failed+0x13f/0x151
[ 6.037076] [<ffffffff8108786a>] __alloc_pages_nodemask+0x80a/0x871
[ 6.037081] [<ffffffff81087959>] __get_free_pages+0x12/0x50