蜗牛哒哒

LINUX教程-LINUX编程-mmap设备操作

作者: 蜗牛哒哒 发布时间: 2020-12-26 146 人阅读

vm_area_struct
Linux内核使用结构vm_area_struct(<linux/mm.h>)来描述虚拟内存区域,其中几个主要域如下:
unsigned long vm_start
unsigned long vm_end
一个VMA描述的区别介于vma->vm_start和vma->vm_end之间。
unsigned long vm_pgoff
被映射部分区域在被映射文件中的起始位置。
unsigned long vm_flags
该区域的标记。如:VM_IO和VM_RESERVED。
VM_IO将VMA标记为内存映射的IO区域,VM_IO会阻止系统将该区域包含在进程的存放转存(core dump )中,VM_RESERVED标志内存区域不能被换出。

Mmap设备操作
映射一个设备是指把用户空间的一段地址空间关联到设备内存上。当程序读写用户空间的这段地址时,它实际上是在访问设备。但并不是每个设备都适合mmap,例如,对于串口或其它面流的设备来说它的确没有意义。
Q:Mmap设备方法需要完成什么功能?
A:mmap方法是file_oprations结构的成员,在mmap系统调用发出时被调用。在此之前,内核已经完成了很多工作。Mmap设备方法所需要做的就是建立虚拟地址到物理地址的页表。

int (*mmap)(struct file*filp, struct vm_area_struct *vma)
Q:Mmap如何完成页表的建立?
A: 方法有二:
1、使用remap_page_range一次建立所有页表
2、使用nopage VMA方法每次建立一个页表。
构造页表的工作可由remap_page_range函数完成,原型如下:
int remap_page_range(unsigned long virt_addr, unsigned long phys_addr, unsigned long size, pgprot_t prot)
remap_page_range(参数)
virt_addr:
用户虚拟地址的起始位置。
phys_addr:
虚拟地址所要映射到的物理地址。
Size:
被重映射的区域的大小。
Prot:
VMA所有的保护。
Mmap设备操作(实例)
int memdev_mmap(struct file*filp, struct vm_area_struct *vma)
{
Vma->vm_flags |= VM_IO;
Vma->vm_flags |= VM_RESERVED;

if (remap_page_range(vma->vm_start, virt_to_phys(dev- >data), vma->vm_end - vma->vm_start, vma->vm_page_prot))
return -EAGAIN;
return 0;
}

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2.本站所有资源不保证完整性,仅供参考学习!
3. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
4. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
5. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
6. 如有链接无法下载、失效或广告,请联系管理员处理!
7. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
8. 如遇到加密压缩包,默认解压密码为"woniudada",如遇到无法解压的请联系管理员处理!
蜗牛哒哒 » LINUX教程-LINUX编程-mmap设备操作