首页 技术 正文
技术 2022年11月12日
0 收藏 614 点赞 5,076 浏览 680 个字

  本文参考了http://www.cnblogs.com/geneil/archive/2011/12/08/2281222.html。本文作为学习总结,将主要过程简要描述。

  很多驱动实现某些功能都要通过内存映射。

  linux下,内存映射通过mmap系统调用实现:

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

  该系统调用的作用,是将文件描述符fd所对应的文件中的一段内容映射到用户进程的地址空间中。对于设备文件(假设设备名为dev)来讲,该系统调用会调用对应驱动的dev_mmap函数:正如open等系统调用对应dev_open这样的驱动内部实现函数。

  参考文章中实现了一个简单的字符设备memdev。该内存设备在初始化时使用kmalloc向内核申请一段内存,这段内存位于物理地址映射区,只需简单地通过PAGE_SHIFT宏就可以获得物理地址.在驱动的memdev_mmap函数中,调用remap_pfn_range函数创建页表,映射到物理地址,这样就实现了内存空间和用户空间的内存映射了。

  另外还有些地方有待进一步了解。remap_pfn_range的函数原型,参数pfn是“physical address of kernel memory”。那么如果不是这种虚拟的字符设备,而是一个真正具有存储功能的外接设备,如果要实现内存映射,是否先要把它们的物理地址简单映射到这块内核物理地址(由系统),再使用remap_pfn_range呢,还是有别的方法?以后再补充吧。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,078
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,553
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,402
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,177
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,814
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898