ok6410学习笔记(8.mmap地址映射之linux内存管理)

          在学习mmap的时候,遇到了好多障碍,最后总结为对内核机制的理解不透彻,尤其是对内存管理理解不到位,所以转载好多篇不错的内存管理的文章。这节就当做学习mmap前面的知识铺垫吧。

问题思考:

1.linux页式管理与mmu有什么关系:在linux内核移植中,移植了mmu(内存管理单元)到系统中,用作把操作系统的虚拟地址转换成物理地址,也就是mmu中保存了linux系统中各级的页表,页目录。 mmu的作用是把物理地址和虚拟地址建立了联系。但是与各个进程的虚拟内存关系不大,虚拟内存主要是操作系统完成的。
2.虚拟内存,内核空间,进程空间(用户空间)之间的关系: linux有4G的虚拟空间是通过mmu联系到真实物理内存的,前3G 是给进程用的,叫做进程空间或者用户空间,每当进程切换的时候用户空间也切换了(这个结构式保存在PCB中的),用户虚拟内存中存放的是,当前进程的程序段,数据段,bss段,堆,栈,还有就是没有分配的内存空间,这么多3G是怎么对应真实的物理内存的,比如当用户malloc了,其分配到的是虚拟地址,而不是真实的物理页,当要使用这个地址的时候才映射真的物理页。后1G是给内核用的叫做内核虚拟内存或者内核空间,这个空间里面存放的是linux内核的程序段和数据段等等。当使用kmalloc的时候,通过slab分配到了真实的物理页,而通过vmalloc的时候,分配的也是虚拟地址,只是这个地址是大于3G的,如图。
ok6410学习笔记(8.mmap地址映射之linux内存管理)_第1张图片
3.猜一猜为什么内核空间不能直接和用户空间进行数据交换:其实两种无非就是一个是地址是大于3G的,一个是地址小于3G的,但是为什么要copy_to_user什么函数的,或者一些系统调用呢?还不知道,等对内核有一定理解在回头看吧。
4.mmap系统调用是将文件映射到用户空间(即虚拟地址小于3G的),但是通过上图可以看出mmap仅仅是把物理内存(DDR,SDRAM)和mmap映射到一起,而不是跟nandflash映射到一起,所以在内核中mmap对应的驱动程序,一定有将SDRAM和nandflash直接copy的程序。
5.为什么说在学mmap的时候应该回头看看linux内存管理,在linux内存管理中,在内核态和用户态有好多地址都是通过类似mmap的机制映射物理内存的。 其实宏观的来看mmap驱动,是可以将任何物理地址映射到用户空间或者内核空间的,即将任何设备(网卡,寄存器,nandflash等各种设备)地址映射到用户空间或者内核空间的,而在内存分配中(请页机制,kmap,固定映射),仅仅是将这些内核或者用户空间的地址与SDRAM映射起来。

你可能感兴趣的:(ok6410学习笔记(8.mmap地址映射之linux内存管理))