赶得早,不如赶得巧 - 古语
start_kernel
前几年穿越题材很火爆,如神话,宫,步步惊心等,可是这些剧都有一些共性,那就是总是穿越到了过去! 为什么穿越一定要到过去呢?在我看来无非就是觉得回到过去题材丰富,因为在中国科幻题材很难火爆,题材有限!换言之就是,中国人总是喜欢活在过去,我祖上怎样怎样..我去年买了个表啊!在看看国外人家穿越基本都是现在穿到未来,未来穿到现在!就这么任性的穿来穿去,很少有穿越到过去的!美国人都在拯救世界,中国人希望穿越到过去征服世界!总是那么喜欢意淫!言归正传..
为什么要管start_kernel叫隧道之门呢,这个函数是承前启后将前辈BIOS or Boot的棒接过来后,进行了完美的变身,因为这才是被称之为操作系统的第一个函数!在这个函数后,所有操作系统的特性进行完全展开!这个世纪最伟大的操作系统之一Linux 就这么的映入眼帘!让我们开启操作系统的灵魂kernel的大门吧!
另外我建议你去买一本Linux 内核修炼之道 - 任老师的书,特别棒!
一、start_kernel 函数
asmlinkage void __init start_kernel(void)
{
char * command_line;
extern const struct kernel_param __start___param[], __stop___param[];
/*
* Need to run as early as possible, to initialize the
* lockdep hash:
*/
lockdep_init();
smp_setup_processor_id();
debug_objects_early_init();
/*
* Set up the the initial canary ASAP:
*/
boot_init_stack_canary();
cgroup_init_early();
/*关闭当前CPU的中断*/
local_irq_disable();
early_boot_irqs_disabled = true;
/*
* Interrupts are still disabled. Do necessary setups, then
* enable them
*/
/*引导CPU初始化*/
boot_cpu_init();
/*页表地址初始化,使用链表串起来*/
page_address_init();
/*内核第一条打印信息*/
pr_notice("%s", linux_banner);
/*体系架构初始化函数*/
setup_arch(&command_line);
mm_init_owner(&init_mm, &init_task);
mm_init_cpumask(&init_mm);
setup_command_line(command_line);
/*每CPU初始化*/
setup_nr_cpu_ids();
setup_per_cpu_areas();
smp_prepare