Linux内核内存管理( 三 )


能分配的大小有限,和能分配的大小相对较大;
内存只有在要被DMA访问的时候才需要物理上连续;
比要慢;
对应于kfree,可以分配连续的物理内存;
对应于vfree,分配连续的虚拟内存,但是物理上不一定连续 。
分配内存的时候逻辑地址是连续的,但物理地址一般是不连续的,适用于那种一下需要分配大量内存的情况,如模块的时候 。这种分配方式性能不入 。
分配内存是基于slab,因此slab的一些特性包括着色,对齐等都具备,性能较好 。物理地址和逻辑地址都是连续的 。
6、最主要的区别是
在设备驱动程序或者内核模块中动态开辟内存,不是用,而是 ,,释放内存用的是kfree,vfree,函数返回的是虚拟地址(线性地址). 特殊之处在于它分配的内存是物理上连续的,这对于要进行DMA的设备十分重要. 而用分配的内存只是线性地址连续,物理地址不一定连续,不能直接用于DMA 。函数的工作方式类似于,只不过前者分配的内存虚拟地址是连续的,而物理地址则无需连 续 。通过获得的页必须一个一个地进行映射,效率不高, 因此,只在不得已(一般是为了获得大块内存)时使用 。函数返回一个指针,指向逻辑上连续的一块内存区,其大小至少为size 。在发生错误 时,函数返回NULL 。可能睡眠,因此,不能从中断上下文中进行调用,也不能从其它不允许阻塞的情况下调用 。要释放通过所获 得的内存,应使用vfree函数
和的分配内存结构图如下:
1:vmalloc分配的一般为高端内存,只有当内存不够的时候才分配低端内存;kmallco从低端内存分配;2:vmalloc分配的物理地址一般不连续,而kmalloc分配的地址连续,两者分配的虚拟地址都是连续的;3:vmalloc分配的一般为大块内存,而kmalloc一般分配的为小块内存,(一般不超过128k) 。
二、处理器缓存/内存屏障
1、缓存结构
2、缓存策略
3、缓存维护
4、SMP缓存一致性
5、编译器屏障
6、处理器内存屏障
7、MMIO写屏障
8、隐含内存屏障
三、页表缓存/页回收机制
1、页表缓存概念
2、TLB表项格式及管理
3、地址空间标识符
4、虚拟机标识符
5、页回收数据结构
6、发起页回收
7、计算扫描的页数
8、收缩活动页链表
9、页交换

Linux内核内存管理

文章插图
10、回收slab缓存
四、Linux缺页中断处理/反碎片技术
【Linux缺页中断处理】
A、什么是缺页中断?
进程线性地址空间里的页面不必常驻内存,在执行一条指令时,如果发现他要访问的页没有在内存中(即存在位为0),那么停止该指令的执行,并产生一个页不存在的异常,对应的故障处理程序可通过从外存加载该页的方法来排除故障,之后,原先引起的异常的指令就可以继续执行,而不再产生异常 。
B、页面调度算法
将新页面调入内存时,如果内存中所有的物理页都已经分配出去,就按照某种策略来废弃整个页面,将其所占据的物理页释放出来;
1、请求调页中断:
进程线性地址空间里的页面不必常驻内存,例如进程的分配请求被理解满足,空间仅仅保留的空间,页面可能被交换到后援存储器,或者写一个只读页面(COW) 。Linux采用请求调页技术来解决硬件的缺页中断异常,并且通过预约式换页策略 。
主缺页中断和次缺页中断,费时的需要从磁盘读取数据时就会产生主缺页中断 。
每种CPU结构提供一个 (*regs, )处理缺页中断,该函数提供了大量信息,如发生异常地址,是页面没找到还是页面保护错误,是读异常还是写异常,来自用户空间还是内核空间 。它负责确定异常类型及异常如何被体系结构无关的代码处理 。下图是Linux缺页中断处理流程: