这与编程无关,但是我在这里问..在linux start_kernel()函数中,在mm_init()函数中,我看到了vmalloc_init()函数。在函数内部,我看到这样的代码。
void __init vmalloc_init(void)
{
struct vmap_area *va;
struct vm_struct *tmp;
int i;
/*
* Create the cache for vmap_area objects.
*/
vmap_area_cachep = KMEM_CACHE(vmap_area, SLAB_PANIC);
for_each_possible_cpu(i) {
struct vmap_block_queue *vbq;
struct vfree_deferred *p;
vbq = &per_cpu(vmap_block_queue, i);
spin_lock_init(&vbq->lock);
INIT_LIST_HEAD(&vbq->free);
p = &per_cpu(vfree_deferred, i);
init_llist_head(&p->list);
INIT_WORK(&p->wq, free_work);
}
/* Import existing vmlist entries. */
for (tmp = vmlist; tmp; tmp = tmp->next) {
va = kmem_cache_zalloc(vmap_area_cachep, GFP_NOWAIT);
if (WARN_ON_ONCE(!va))
continue;
va->va_start = (unsigned long)tmp->addr;
va->va_end = va->va_start + tmp->size;
va->vm = tmp;
insert_vmap_area(va, &vmap_area_root, &vmap_area_list);
}
/*
* Now we can initialize a free vmap space.
*/
vmap_init_free_space();
vmap_initialized = true;
}
我不确定此代码是在每个cpu(core)上运行还是仅在第一个cpu上运行?
如果此代码在每个smp内核上运行,则for_each_possible_cpu循环中的此代码如何运行?
smp设置似乎在此功能之前完成。
start_kernel()
通话mm_init()
通话vmalloc_init()
。此时,只有第一个(引导)CPU处于活动状态。后来,start_kernel()
呼叫arch_call_rest_init()
该电话rest_init()
。
rest_init()
使用入口点为init任务创建一个内核线程kernel_init()
。kernel_init()
来电kernel_init_freeable()
。kernel_init_freeable()
最终调用smp_init()
以激活剩余的CPU。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句