如果我使用两个 alloc_pages 进行检查,则 alloc_pages 返回的地址相同

Posted

技术标签:

【中文标题】如果我使用两个 alloc_pages 进行检查,则 alloc_pages 返回的地址相同【英文标题】:Address returned by alloc_pages are same if I use two alloc_pages for checking 【发布时间】:2019-07-27 14:01:44 【问题描述】:

我正在尝试分析alloc_pages() 功能。 我知道它返回它指向的第一页结构的物理地址。 我想用下面的代码确认一下。

struct page *page;
page = alloc_pages(GFP_KERNEL, 0);
pr_info("physical address GFP_KERNEL - %p\n", page); 
page = alloc_pages(GFP_HIGHUSER, 2);
pr_info("physical address of GFP_High - %p\n", page);

如您所见,我使用了两次alloc_pages(),但返回的地址相同。我不应该得到一个不同的地址吗?

我从 &page -> pr_info 函数中的页面编辑它

【问题讨论】:

Print value and address of pointer defined in function?的可能重复 【参考方案1】:

应该直接打印出page的值,而不是page的地址。

如下:

struct page *page;
page = alloc_pages(GFP_KERNEL, 0);
pr_info("physical address GFP_KERNEL - %p\n", page);

page = alloc_pages(GFP_HIGHUSER, 2);
pr_info("physical address of GFP_High - %p\n", page);

模块完整代码:

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

struct page *page1;
struct page *page2;

static int __init test_alloc_pages_init(void)

    struct page *page;
    page = alloc_pages(GFP_KERNEL, 0);
    pr_info("physical address GFP_KERNEL - %p\n", page);
    page1 = page;

    page = alloc_pages(GFP_HIGHUSER, 2);
    pr_info("physical address of GFP_High - %p\n", page);
    page2 = page;

    return 0;


static void __exit test_alloc_pages_exit(void)

    if (page1) 
        pr_info("free page1: %p\n", page1);
        __free_pages(page1, 0);
    
    if (page2) 
        pr_info("free page2: %p\n", page2);
        __free_pages(page2, 2);
    
    return;


module_init(test_alloc_pages_init);
module_exit(test_alloc_pages_exit);

MODULE_LICENSE("GPL");

dmesg 信息:

[117582.127432] physical address GFP_KERNEL - ffffea002e1cf2c0
[117582.127434] physical address of GFP_High - ffffea002e0ec500
[117584.214921] free page1: ffffea002e1cf2c0
[117584.214922] free page2: ffffea002e0ec500

【讨论】:

感谢更正,但即使在修改后我也得到了相同的值。你能检查一下它是否有效? 可以工作,你使用模块完整代码(上)在你的环境中试试效果

以上是关于如果我使用两个 alloc_pages 进行检查,则 alloc_pages 返回的地址相同的主要内容,如果未能解决你的问题,请参考以下文章

linux alloc_pages 接口

Linux内核情景分析的alloc_pages

快车道-分配页

快车道-分配页

我如何使用视图模型从另一个片段访问函数

比较 SQL 数据