咱们总期望能在内核空间和用户空间自在交流数据,传统的方法是选用内核供给的vma机制,经过copy_to/from_user之类的方法来完成。这关于高速数据块传送是不可取的。 其实kswapd有时交流数据至外存时,功能适当差,一般来说,你的PC主存并不见得就用尽了,并且许多运用并是你所关怀的,但却实实在在耗费你的核算资源,此刻,你或许会想到选用实地址操作你的运用(虽然有MMU的支撑),在uClinux中,当没有MMU时,作业起来是挺爽的。
最便利的,最高效的,无非是实地址下,操作物理内存,适当于DMA.虽然Linux 2.6内核在VMA方面的功能要优于2.4,但swap机制有必定的缺限。在VxWorks中,对内存的办理是很详尽且准确的。假如你在Linux下请求大块内存操作时,当触发kswap快速交流回主存时,你会发现你的核算机 哪一段时刻,简直要歇息几分钟,虽然你看起来free输出的面现已许多了,但此刻的外存简直一向忙着,且CPU负荷适当重,这时也或许你根本就没做任何操作。
有没有方法既在VMA机制下作业,又能直接处理主存数据呢?
答复是必定的。内核发动后,会将主存映射为/dev/mem,当咱们在VMA中请求一块逻辑区间后,将转化的物理地址传与用户空间,用户空间就能够线性操作这段区间了,直接选用mmap就能够在物理主存中读写。
还有更快的方法吗?不选用mmap行吗?
当然有,当VMA将物理区块地址及巨细传与用户空间后,用户完全能够选用地址读写形式,这几近于机器指令操作了(能够独立于OS之外)。 此种完成方法很简单,首要翻开/dev/mem,直接定位至VMA传上来的地址就能够操作了,无需mmap.告诉用户空间,能够选用procfs/sysfs等。
强烈主张:在鸿沟操控上,必定要准确详尽,不引荐初学者选用,一旦越界,或许引起“Kernel Panic”。 更有或许就DOWN了。 关于此完成方法,主张参阅mapper(LDD3)程序。 一起,也能够用mapper查看读写是否正确。
新的IA32中,PAGE_SIZE = 4K MAX_ORDER = 11 ,gfp最大请求4M线性逻辑空间,减去PAGE_OFFSET即可得到物理地址。 假如选用了HIMEM和NUMA,请拜见Kernel关于内存映射的算法。 当主存到达1G或超过期,请减小用户空间巨细。
跟着硬件技能的开展,VMA在主存适当大时,能够考虑进行批改,完全能够会集选用物理映射方法。没必要交流了。不然,反而影响功能。 32位渠道,假如主存2G,选用SWAP会使得功能有较大下降。 而在大容量数据传输时,也不或许选用SWAP方法的,不允许换出。 主张Linus在VMA中参加进程分类,不平类别的运用,分配不同的内存块。 小数据PAGE_SIZE = 4K/大数据4M/128M. 地址形式全转化为64位,兼容32位,当运用于Embedded体系时,直接运用32位形式。
如将做成多个微体系,不同微核,运转不同运用(不同的进程办理,内存办理,文件办理),仅仅接口能够一致,不同标志罢了。