微软交流社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 114|回复: 0

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

[复制链接]

1

主题

3

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2023-2-12 20:34:30 | 显示全部楼层 |阅读模式
【推荐阅读】
一文看懂linux内核详解
linux内核内存管理-写时复制
深入了解使用linux查看磁盘io使用情况
本文介绍了"get_user_pages"如何工作(对于Linux驱动程序)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述

正在使用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的问题,如果我对第二个问题的理解正确,那么我们如何确保该地址恰好在页面的开头?
这三个问题,谢谢你的提出.
推荐答案

我的第一个问题是关于struct页面**页面.在调用get_user_pages之前,我们是否需要在页面上分配内存(例如,使用kcalloc?)?
您可以(但不是强制性的)数组就足够了(数组的大小取决于nr_pages)
如果您要固定4页,则struct page *pages[4];就足够了.
我的第二个问题是关于无符号长启动的,在手册页上,它显示起始用户地址",这是否意味着,如果我声明了类似int * p的指针,则应该传递起始用户地址"到内核空间是p?
此参数应指向用户进程拥有的内存(例如malloc之后).
我的第三个问题也是关于无符号的长距离起步,如果我在第二个问题中理解正确,那么我们如何确保该地址恰好在页面的开头?
我认为您可以使用<a href="http://linux.die.net/man/2/getpagesize"> getpagesize 函数来做到这一点.
我认为此博客条目:"get_user_pages示例" 可能会有所帮助你.
这篇关于"get_user_pages"如何工作(对于Linux驱动程序)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助
原文作者:首页 - 内核技术中文网 - 构建全国最权威的内核技术交流分享论坛
原文地址:"get_user_pages"如何工作(对于Linux驱动程序) - 圈点 - 内核技术中文网 - 构建全国最权威的内核技术交流分享论坛(版权归原文作者所有,侵权联系删除)

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|微软交流社区

GMT+8, 2025-1-22 00:41 , Processed in 0.071469 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表