【问题标题】:Retrieving the physical addresses of all the pages of a virtual memory buffer检索虚拟内存缓冲区的所有页面的物理地址
【发布时间】:2021-07-02 02:41:36
【问题描述】:

我目前正在尝试查找链接到虚拟缓冲区的所有页面的物理地址。

例如,如果我在虚拟内存中分配了一个 8kb 的缓冲区,并且就物理内存而言,它为我分配了 2 个页面(在页面为 4kb 并且一切顺利的情况下),我想找到物理地址这 2 页。好像我用 get_free_pages 分配了它们。

为此,我通过查看内核中可供我使用的函数来实现这一小段代码:

void *vbuffer;
struct page *page_list;
unsigned long current_page_addr;

/* Allocate virtual memory buffer */
vbuffer = vmalloc(size);

/* Get pages list from the previously allocated virtual buffer */
page_list = vmalloc_to_page(vbuffer);

do {

    current_page_addr = page_to_phys(page_list);
    page_list = page_list->next;

} while(page_list != NULL);

因此,我的问题是要知道我的代码是否正确,并且实际上允许我检索 current_page_addr 变量中页面的物理地址。 另外,如果我使用正确的方法或有更好的方法,谢谢。

【问题讨论】:

  • 你试过运行这个吗?它会崩溃或显示内核错误吗?
  • 通常 Stack Overflow 不是要求进行代码审查的好地方。通常,您应该将这些帖子表述为一个问题。例如,如果您运行此程序并遇到错误,请包含该错误并寻求帮助。如果没有错误,您可以要求其他/更好的方法来做您想做的事情。
  • 至于您的代码,有一点我不确定是否可行,但如果出现错误,您会反馈。我不确定page_list 是否与->next 进行迭代,或者您是否需要使用page_list->lru->next 之类的东西或使用list_next_entry(page, lru) 之类的宏。

标签: linux memory-management linux-kernel


【解决方案1】:

我认为vmalloced 区域的页面不在列表中。 vmalloc_to_page返回对应于vmalloc区域中映射的虚拟地址的页面,如果该页面存在。所以要找到与vmallocvzalloc分配的内存对应的页面,从返回的第一页地址开始,然后为每个后续页面增加PAGE_SIZE的地址。

void *vbuffer;
struct page *page;
unsigned long current_page_addr;

/* Allocate virtual memory buffer */
vbuffer = vmalloc(size);
if (vbuffer == NULL) {
    goto error;
}

for (size_t offset = 0; offset < size; offset += PAGE_SIZE) {
    page = vmalloc_to_page(vbuffer + offset);
    current_page_addr = page_to_phys(page);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-24
    • 2014-03-15
    • 2014-05-18
    • 2011-06-13
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    相关资源
    最近更新 更多