“ get_user_pages”如何工作(对于Linux驱动程序)

Cong Li :

在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在这里,我们需要为分配内存(kcalloc用于ex),pages然后再调用get_user_pages吗?

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

我的第三个问题也与有关unsigned long start,如果我对第二个问题的理解正确,那么我们如何确保此地址恰好在页面的开头?

所以这三个问题,谢谢你的推进。

马修:

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

您可以,但不是强制性的,数组足够了(其大小取决于nr_pages

如果要固定4页,struct page *pages[4];就足够了。

我的第二个问题是关于无符号长启动的问题,在手册页上它显示“ starting user address”,这是否意味着,如果我声明了一个类似int * p的指针,则应该将“ starting user address”传递给内核空间是p吗?

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

我的第三个问题也是关于无符号的长距离启动,如果我在第二个问题中理解正确,那么我们如何确保该地址恰好在页面的开头?

我想你可以用getpagesize功能做到这一点

我认为此博客文章:“ get_user_pages示例”可能会对您有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

linux驱动程序更新如何工作?

USB存储驱动程序如何在Linux中工作?

Linux get_user_pages是否保证不会交换页面?

Linux驱动程序如何工作?在哪里可以找到它们?(特别是NIC驱动程序)

JDBC驱动程序实现如何工作?

本机驱动程序如何工作?

如何禁用Linux驱动程序

如何映射由get_user_pages_fast固定的页面以将它们用作驱动程序中的几乎连续的缓冲区?

Linux 驱动程序。只读取 IOCTL 命令工作

如何实现鼠标驱动程序Linux USB鼠标驱动程序?

Windows脱机时驱动程序签名如何工作?

如何使鼠标/键盘驱动程序正常工作?

如何使AMD / Intel Hybrid Graphics驱动程序正常工作?

SPI Linux驱动程序

对于外部USB设备,为什么Linux除了驱动程序外还需要固件?

如何为4.2.0 Linux内核安装BlackMagic驱动程序

Linux:如何查找用于设备的设备驱动程序?

如何编写简单的Linux设备驱动程序?

如何练习编写真正的Linux设备驱动程序?

如何在Linux设备驱动程序中设置errno?

linux内核如何处理驱动程序?

Linux内核驱动程序-SPI如何识别SPI设备?

如何在 Linux 驱动程序中列出 MMC 分区?

如何在使用中更改驱动程序Linux

Linux中如何安装外围硬件的驱动程序?

如何设置Linux char驱动程序的许可?

如何获得我的(不受支持的)硬件的Linux驱动程序?

如何制作多视频驱动程序Linux系统?

如何卸载OSS-LINUX音频驱动程序?