内存管理
页
该结构与物理页相关,并非与虚拟页相关,该结构对页的描述是短暂的,即时包含的数据继续存在,因为交换等原因,他们并不可能和同一page相关。内核用这个数据结构仅仅描述当前时刻相关的物理页中存在的东西,这种数据结构的目的在于描述物理内存本身,而不是其中的数据。
区
kmalloc
以字节为单位获得一块内核内存的大小
void *kmalloc(size_t size, int flags);
分配器标志:
- 行为修饰:特定情况下特定方法分配内存;如中断分配时要求程序不能睡眠
- 区修饰:到哪里去获取内存页
- 类型标志:组合行为修饰和区修饰
vmalloc
在获得大块内存时:模块被动态插入内核
void *vmalloc(unsigned long size);
分配的虚拟地址连续,物理地址无需连续;kmalloc保证物理地址也是连续的
vmalloc把物理上不连续的页转为虚拟连续的必须建立页表,必须一个一个的映射,导致比内存映射抖动大得多
slab分配器
不同的对象划分为高速缓存组,每种对象(struct_task、struct inode)对应一个高速缓存。kmalloc建立在slab上。高速缓存又被划分为slab;一般情况slab仅仅有一页组成。每个高速缓存可以由多个slab组成。
栈上的静态分配
每个进程有自己的内核栈、中断栈。如果内核栈溢出,则会覆盖栈末端的thread_info结构中的数据