头文件中如此定义:
#ifdef CONFIG_MMU
extern void __init vmalloc_init(void);
#else
static inline void vmalloc_init(void)
{
}
#endif
另外一个文件中实现实体
void __init vmalloc_init(void)
{
struct vmap_area *va;
struct vm_struct *tmp;
int i;
for_each_possible_cpu(i) {
struct vmap_block_queue *vbq;
vbq = &per_cpu(vmap_block_queue, i);
spin_lock_init(&vbq->lock);
INIT_LIST_HEAD(&vbq->free);
INIT_LIST_HEAD(&vbq->dirty);
vbq->nr_dirty = 0;
}
/* Import existing vmlist entries. */
for (tmp = vmlist; tmp; tmp = tmp->next) {
va = alloc_bootmem(sizeof(struct vmap_area));
va->flags = tmp->flags | VM_VM_AREA;
va->va_start = (unsigned long)tmp->addr;
va->va_end = va->va_start + tmp->size;
__insert_vmap_area(va);
}
vmap_initialized = true;
}
本文详细解析了Linux内核中的vmalloc_init函数实现过程。该函数用于初始化虚拟内存分配系统,包括为每个CPU设置vmap_block_queue结构并初始化相关锁和链表,以及导入现有的vmlist条目。
2773

被折叠的 条评论
为什么被折叠?



