我发现kmalloc返回物理上和实际上连续的内存。

我编写了一些代码来观察这种行为,但是只有物理内存似乎是连续的,而不是虚拟内存。我有什么错误吗?

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/moduleparam.h>

MODULE_LICENSE("GPL");

static char *ptr;
int alloc_size = 1024;

module_param(alloc_size, int, 0);

static int test_hello_init(void)
{
    ptr = kmalloc(alloc_size,GFP_ATOMIC);
    if(!ptr) {
        /* handle error */
        pr_err("memory allocation failed\n");
        return -ENOMEM;
    } else {
        pr_info("Memory allocated successfully:%p\t%p\n", ptr, ptr+100);
        pr_info("Physical address:%llx\t %llx\n", virt_to_phys(ptr), virt_to_phys(ptr+100));
    }

    return 0;
}

static void test_hello_exit(void)
{
    kfree(ptr);
    pr_info("Memory freed\n");

}

module_init(test_hello_init);
module_exit(test_hello_exit);
dmesg输出:
Memory allocated successfully:0000000083318b28  000000001fba1614
Physical address:1d5d09c00   1d5d09c64

最佳答案

打印内核指针通常是一个坏主意,因为它基本上意味着将内核地址泄漏到用户空间,因此在%p中使用printk(或类似的宏,例如pr_info等)时,内核会尝试保护自己而不打印实际地址。而是为该地址打印一个不同的哈希唯一标识符。

如果您确实要打印该地址,则可以使用%px

Documentation/kprintf-formats.txt (web) Documentation/core-api/printk-formats.rst (git):



然后,下面的内容:

08-28 15:53