gpt4 book ai didi

c - "get_user_pages"是如何工作的(对于 linux 驱动程序)

转载 作者:IT王子 更新时间:2023-10-29 01:26:00 24 4
gpt4 key购买 nike

在 Linux PCI 驱动程序上工作,现在我正在尝试使用分散/收集为 DMA 编写代码。

目前,我了解到要直接从用户空间访问 DMA 数据,我们需要将用户空间页面固定到内核空间。

为此,我们有 get_user_pages,它的完整定义如下:

int get_user_pages(struct task_struct * tsk,  
struct mm_struct * mm,
unsigned long start,
int nr_pages,
int write,
int force,
struct page ** pages,
struct vm_area_struct ** vmas);

我的第一个问题是关于struct page ** pages。在调用 get_user_pages 之前,我们是否需要为 pages 分配内存(例如使用 kcalloc)?

我的第二个问题是关于 unsigned long start,在手册页上,它说“起始用户地址”,这是否意味着,如果我在用户空间中声明一个指针,如 int *p,我应该传递给内核空间的“起始用户地址”是 p?

我的第三个问题也是关于unsigned long start,如果我在第二个问题中理解正确,那么我们如何确保这个地址恰好在页面的开头开始?

所以三个问题,感谢提前。

最佳答案

My first question is about the struct page ** pages. Here do we need to allocate memory(using kcalloc for ex.) for the pages before calling the get_user_pages?

可以,但不是强制的,一个数组就足够了(它的大小取决于nr_pages)

如果你想固定 4 个页面,struct page *pages[4]; 就足够了。

My second question is about the unsigned long start, on the man page, it says "starting user address", does it mean that, if I declare a pointer like int *p, the "starting user address" I should pass to kernel space is p?

此参数应指向您的用户进程拥有的内存(如在 malloc 之后)。

My third question is also about the unsigned long start, if I understand correctly in the second question, then how can we make sure that this address begins exactly at the beginning of a page?

我想你可以用 getpagesize 来做功能。

我认为这个博客条目:"get_user_pages example"可能对你有帮助。

关于c - "get_user_pages"是如何工作的(对于 linux 驱动程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36337942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com