memory interview keyPoints

1th courses

1、物理地址是MMU看到的内存地址;虚拟地址是存在MMU情况下CPU看到的地址;总线地址是设备看到的地址;一块内存,物理地址是0,在设备端看起来是0x80000000,而物理地址0又通常被映射为虚拟地址0xc0000000

2、MMU的作用主要有:虚实转换(进程不需关心内存,每个任务4G空间);内存权限保护(readonly);用户权限保护(非法访问内核空间);cache缓存控制(确保DMA一致性);

3、内存分区是物理内存分区;内存映射区是每个进程3-4G内核空间的虚拟地址分区

4、内存映射区通常分为DMAzone、NORMALzone和HIGHMEMzone,其中DMA和NORMAL zone被统称为lowmem zone,他们与物理地址是一一映射的关系。HIGHMEMzone存在的原因是当物理内存较大时,3-4G空间无法一一映射,无法映射的区域就是HIGHMEMzone。

5、buddy算法是以2的n次方页为单位对空闲内存进行管理,可以避免了内存的外部碎片,但长期下来会造成大片连续内存较少,当需要大片连续内存是反而不够。CMA可以解决这个问题

6、slab算法是在buddy算法的基础上对内存进行二次管理,可以分配更小空间。

7、设备通过DMA直接访问内存,不通过MMU(mmu通过欺骗手段给出连续虚拟地址,但物理地址不连续),这时要获取连续的大片内存,就用到CMA,CMA通常在高端内存,平时该区域给moveable的程序使用,当需要连续内存时,已占用的内存被move到别的地方,腾出大片连续内存。CMA通常被DMA的分配内存函数调用(dma_alloc_coherent)。

 

 

2th courses

1、Slab主要提供以下两个功能:

A. 对从Buddy拿到的内存进行二次管理,以更小的单位进行分配和回收(注意,是回收而不是释放),防止了空间的浪费。

B. 让频繁使用的对象尽量分配在同一块内存区间并保留基本数据结构,提高程序效率。

2、slabtop和slabinfo命令可以查看slab的使用情况

3、

4、malloc是标准C库的函数,C库对申请的内存做二次管理,类似Slab。但是注意一点,当我们使用malloc函数申请一片内存时,实际上是从C库获取的内存,就是说,调用malloc返回后,系统未必给你一片真正的内存,分两种情况

a.  C库还持有足够的内存,那么malloc就可以直接分配到C库现有的内存

b.  C库没有足够的内存,malloc返回时,系统只是通过系统调用brk/mmap扩展了heap的大小,malloc以为自己拿到了全部内存,其实并没有,系统只是把要申请的内存大小的虚拟地址空间全部映射到同一块已经清零的物理内存,只有当我们实际要去写这片内存的时候,MMU发现这个物理页面并没有被真正分配,于是产生一个page fault通知内核,内核才真正的分配内存并改写进程页表。

 

 

3th courses

1、

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值