linux mmap驱动实现
来源:互联网 发布:关键词排名优化怎么做 编辑:程序博客网 时间:2024/05/16 09:59
在实现驱动程序的mmap函数时,要注意映射地址的转换问题,见代码。
定义一个设备结构体:
- struct leedriver
- {
- struct cdev cdev;
- unsigned char mem[MEMSIZE];
- };
这里面这个MEMSIZE,最小都要是4096,因为内存映射是以页为单位的。
在实现simple_remap_mmap函数时,代码如下
- static int simple_remap_mmap(struct file *filp, struct vm_area_struct *vma)
- {
- vma->vm_pgoff = ((u32)virt_to_phys(leedriverp->mem)) >> PAGE_SHIFT;
- printk("vma->vm_pgoff = %lx/n",vma->vm_pgoff);
- if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
- vma->vm_end - vma->vm_start,
- vma->vm_page_prot))
- return -EAGAIN;
- vma->vm_ops = &simple_remap_vm_ops;
- simple_vma_open(vma);
- return 0;
- }
注意函数开头的vma->vm_pgoff = ((u32)virt_to_phys(leedriverp->mem)) >> PAGE_SHIFT;
leedriverp->mem是个内核虚拟地址,应该通过virt_to_phys转换成物理地址,再进行左移操作,就OK了。
之后定义一下vm_ops
- static struct vm_operations_struct simple_remap_vm_ops = {
- .open = simple_vma_open,
- .close = simple_vma_close,
- };
并且在file_operations中添加.mmap=simple_remap_mmap,整个过程就完成了
- linux mmap驱动实现
- linux mmap驱动实现
- linux mmap驱动实现
- linux mmap驱动实现
- linux 驱动mmap操作
- Linux驱动mmap内存映射
- Linux驱动mmap内存映射
- linux驱动-file_operations之mmap
- linux mmap内核实现
- 驱动中mmap的实现之scullp
- mmap底层驱动实现方法总结
- mmap底层驱动实现方法总结
- 由mmap实现用户态驱动
- 驱动总结之mmap函数实现
- 用mmap写Linux用户空间驱动
- linux mmap 应用程序和驱动共享内存
- Linux设备驱动之mmap设备操作
- Linux设备驱动之mmap设备操作
- Python操作Word
- JVM系列(四)——优化
- python操作Excel
- 推荐一个跨平台内存分配器
- 分享_浅谈:国内软件公司为何无法做大做强?
- linux mmap驱动实现
- Spring 事务合集
- Qt 之路 (19)—事件(Event)
- Python学习笔记——聊天程序源码
- excel
- man中文语言包
- Python学习笔记——文件对象和操作(1)
- 【Boost】boost::range(区间)介绍
- Python学习笔记——文件对象和操作(2)