概述
应用与设备驱动之间数据交互,很多时候都使用copy_to_user与copy_from_user。但如果在追求高性能的驱动上,这种拷贝显然不是最佳的做法。
Linux内核提供了一种内存映射的机制,它主要完成将设备的地址空间映射到用户空间或者直接使用用户空间中的地址,这样做的目的显然是为了提升系统性能。
设备缓存与设备内存的概念
- 设备缓存:由驱动管理的位于RAM中的一段内存区域。
- 设备内存:设备所固有的一段存储空间(如设备FIFO,显卡Frame buffer等)。
mmap
内核端mmap机制
mmap函数作用
本节要讨论的mmap主要用来将用户空间的一段虚拟地址映射到设备IO空间中,这样,用户空间进程可以直接访问设备内存。驱动程序在此主要要完成的是在其内部实现file_operations中的mmap方法。
VMA数据结构
file_operations中定义的mmap函数原型:
struct file_operations {
...
int (*mmap) (struct file *, struct vm_area_struct *);
...
第一个参数表示当前操作的一个对象指针,第二个参数用来表示用户进程中一段需要被映射在虚拟地址区域。
下面看一下vm_area_struct的关键成员:
struct vm_area_struct {
/* The first cache line has the info for VMA tree walking. */
unsigned long vm_start; /* Our start address within vm_mm. */
unsigned long vm_end; /* The first byte after our end address
within vm_mm. */
/* linked list of VM areas per task, sorted by address */
struct vm_area_struct *vm_next, *vm_prev;
struct rb_node vm_rb;
/*
* Largest free memory gap in bytes to the left of this VMA.
* Either between this VMA