应用程序通过内存映射可以直接访问设备的I/O存储区或DMA缓冲。内存映射使用户空间的一段地址关联到设备内存上,程序在映射的地址范围内进行读取或者写入,实际上就是对设备的访问。mmap系统调用的原型如下:
unsigned long mmap(unsigned long addr,unsigned long len,int prot,int flags,int fd,long off);
addr是内存块的建议位置,不能确保mmap()函数就一定使用这块内存区域,因此通常将其设置成NULL。len是映射到调用进程地址空间的字节数,它从被映射文件开头off个字节开始算起。prot参数指定共享内存的访问权限。可取如下几个值:PROT_READ(可读)、PROT_WRITE(可写)、PROT_EXEC(可执行)、PROT_NONE(不可访问)。flags由以下几个常值指定:MAP_SHARED、MAP_PRIVATE、MAP_FIXED。其中,MAP_SHARED和MAP_PRIVATE必选其一,而MAP_FIXED则不推荐使用。如果指定为MAP_SHARED,则对映射的内存所做的修改同样影响到文件。如果是MAP_PRIVATE,则对映射的内存所做的修改仅对该进程可见,对文件没有影响。fd是设备的文件描述符。off参数一般设为0,表示从文件头开始映射。不是所有的设备都可以进行mmap映射,如串口和面向流的设备就不可以。
如果应用程序要取消mmap建立的映射,可以使用munmap函数:
int munmap(void*addr,size_t len);
例4.2 mmap驱动程序实例(www.xing528.com)
代码见\samples\4memory\4-2mmap。核心代码如下:
在初始化时分配内存,代码如下:
mmapmem_mmap函数实现mmap文件接口:
virt_to_phys函数用于将虚拟地址转换为物理地址。测试程序参考代码如下:
本例运行结果如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。