您的位置首页>企业动态>

linux drivers中的mmap实现

导读 大家好,我是极客范的本期栏目编辑小友,现在为大家讲解linux drivers中的mmap实现问题。驱动程序中file_operations的mmap操作用于:将设

音频解说

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解linux drivers中的mmap实现问题。

驱动程序中file_operations的mmap操作用于:

将设备驱动程序内核空间中的内存映射到用户空间中,可以用用户空间中的mmap系统调用代替系统调用的读写。目的是提高读写效率。

系统调用mmap:

void* mmap (caddr_t addr,size_t len,int prot,int flags,off_t offset)

Addr一般为NULL,目的是让内核自动分配可用的虚拟空间地址,并通过返回值返回,与MAP_FAILED进行比较;

一般波特是PROT _ WRITE | PROT _ READ;Flags是MAP_SHARED或MAP_PRIVATE之一;偏移量表示设备文件映射的偏移量,通常为0。

操作文件mmap :

int (*mmap)(结构文件* filp,结构vm_area_struct* vma)

定义struct VM _ operations _ struct XXX _ VM _ ops={ 0。open=xxx_vm_open。close=xxx_vm_close。nopage=xxx_vm_nopage,

};

编写mmap文件操作函数有两种方法:

I .对一次性应用使用remap_pfn_range,无需定义nopage函数。

1.在mmap中调用remap _ pfn _ range

2.将值附加到mmap中的VMA-VM _ ops;

3.通话开启;在vm_ops中,在mmap结束时活动;

第二,定义nopage函数,当缺页发生时,内核申请内存中的物理页面,驱动程序在nopage中用vma挂接页面。

1.在1.mmap中,除了给vma-vm_ops赋值并在vm_ops中主动调用open之外;

2.首先根据PAGE_SIZE对齐设备内存,最后只将页面对齐的设备内存映射到用户空间。然后,对由对齐操作逐页处理的虚拟地址执行set pagereserved(virt _ to _ page(virt _ addr))(可选)

3.在nopage函数中,首先计算缺失页面的虚拟内存地址、内存页面的实际物理地址和偏移量;从设备文件的开始;然后比较偏移量是否超过映射的设备文件大小;最后,将缺失页面地址的虚拟地址转换成页面帧号,并应用该页面。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。