【发布时间】: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