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的,如图。

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映射起来。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值