mmap设备操作
映射一个设备是指把用户空间的一段地
址关联到设备内存上。当程序读写这段
用户空间的地址时,它实际上是在访问
设备。
mmap设备方法需要完成什么功能?
mmap方法是file_oprations结构的成员,在mmap
系统调用发出时被调用。在此之前,内核已经完成
了很多工作。mmap设备方法所需要做的就是建立
虚拟地址到物理地址的页表。
int (*mmap) (struct file *, struct vm_area_struct *)
mmap如何完成页表的建立?
方法有二:
1、使用remap_pfn_range一次建立所有页表;
2、使用nopage VMA方法每次建立一个页表。
构造页表的工作可由remap_pfn_range函数
完成,原型如下:
int remap_pfn_range(struct
vm_area_struct *vma, unsigned long
addr,unsigned long pfn, unsigned long
size, pgprot_t prot)
vma:
虚拟内存区域指针
virt_addr:
虚拟地址的起始值
pfn:
要映射的物理地址所在的物理页帧号,可将物理地址
>>PAGE_SHIFT得到。
size:
要映射的区域的大小。
prot:
VMA的保护属性。
int memdev_mmap(struct file*filp, struct vm_area_struct *vma)
{
Vma->vm_flags |= VM_IO;
Vma->vm_flags |= VM_RESERVED;
if (remap_pfn_range(vma, vma->vm_start,
virt_to_phys(dev- >data)>> PAGE_SHIFT,
size,
vma->vm_page_prot))
return -EAGAIN;
return 0;
}
mmap设备方法实现
1. 实现字符驱动程序的mmap设备方法
2.实现测试应用程序
(在mini2440平台完成上述实验)