linux mmap内存映射文件的理解

利用ioremap访问硬件,需要经过两次拷贝

1.明确:不管是在用户空间还是在内核空间,软件一律不能去直接访问设备的物理地址;


2.在内核驱动中如果要访问设备的物理地址,需要利用ioremap将设备的物理地址映射到内核虚拟地址上(动态内存映射区),以后驱动程序访问这个内核虚拟地址就是在间

接得访问设备的物理地址(MMU,TLB,TTW)


3.如果用户要访问硬件设备,不能直接访问,也不能在用户空间访问,只能通过系统调用(open,close,read,write,ioctl)来访问映射好的内核虚拟

地址,通过这种间接的访问来访问硬件设备,但是如果设计到数据的拷贝,还需要借助4个内存拷贝函数!



1.通过以上的分析,发现应用程序通过read,write,ioctl来访问硬件设备,它们都要经过两次的数据拷贝,一次是用户空间和内核空间的数据拷贝,另外一次是内核空间和硬件之
间的数据拷贝,如果设备拷贝的数据量比较小,那么read,write,ioctl的两次数据拷贝的过程对系统的影响几乎可以忽略不计,如果设备的数据量非常大,例如显卡(独立),
LCD屏幕(显存共享主存),摄像头,声卡这类设备涉及的数据量比较庞大,如果还是用read,write,ioctl进行访问设备数据,无形对系统的性能影响非常大。

2.用户访问设备,最终其实涉及的用户和硬件,而read,write,ioctl本身会牵扯到内核,所以这些函数涉及2次的数据拷贝,用户要直接去访问硬件设备,只需要将硬件
设备的物理地址信息映射到用户的虚拟地址空间即可,一旦完毕,不会在牵扯到内核空间,以后用户直接访问用户的虚拟地址就是在访问设备硬件,由2次的数据拷贝的

转换为一次的数据拷贝。


目的:将硬件物理地址映射到用户虚拟地址空间,由2次数据拷贝变成1次数据拷贝!

采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。



mmap的原理使用技巧:

https://www.cnblogs.com/huxiao-tee/p/4660352.html

https://www.cnblogs.com/xiaocry/p/5529712.html



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值