在start_kernel函数的开始部分:
asmlinkage void __init start_kernel(void)
{
char * command_line;
extern const struct kernel_param __start___param[], __stop___param[];
lockdep_init();
smp_setup_processor_id();
debug_objects_early_init();
boot_init_stack_canary();
cgroup_init_early();
local_irq_disable();
early_boot_irqs_disabled = true;
boot_cpu_init();
page_address_init();
pr_notice("%s", linux_banner);
setup_arch(&command_line);
......
}
第一个函数:/*
在这里主要初始化了两个表,这两个表具体是做什么,目前还不是很清楚..?????
*/
void lockdep_init(void)
{
int i;
if (lockdep_initialized)
return;
for (i = 0; i < CLASSHASH_SIZE; i++)
INIT_LIST_HEAD(classhash_table + i);
for (i = 0; i < CHAINHASH_SIZE; i++)
INIT_LIST_HEAD(chainhash_table + i);
lockdep_initialized = 1;
}
表的定义:
static struct list_head classhash_table[CLASSHASH_SIZE];
static struct list_head chainhash_table[CLASSHASH_SIZE];
第二个:
在这里的 smp_setup_processor_id();函数为空。
第三个:
void __init debug_objects_early_init(void)
{
int i;
for (i = 0; i < ODEBUG_HASH_SIZE; i++)
raw_spin_lock_init(&obj_hash[i].lock);
for (i = 0; i < ODEBUG_POOL_SIZE; i++)
hlist_add_head(&obj_static_pool[i].node, &obj_pool);
}
这里也是初始化了两个hash表,第一个for循环是初始化所有的锁(lock)为一样的,第二个为把锁有的obj_pool加入到obj_static_pool中。
具体功能以及作用还不是很清楚......????????????
第四个:
函数boot_init_stack_canary()为空。
第五个函数:
主要工作就是对那些有需要提前进行一些初始化的子系统进行初始化操作。
int __init cgroup_init_early(void)
{
int i;
atomic_set(&init_css_set.refcount, 1);
INIT_LIST_HEAD(&init_css_set.cg_links);
INIT_LIST_HEAD(&init_css_set.tasks);
INIT_HLIST_NODE(&init_css_set.hlist);
css_set_