asmlinkage __visible void __init start_kernel(void)
{
...
//lockdep_init()是个宏,定义在kernel/fork.c中第388行,如下:
//# define lockdep_init() do { } while (0)// 可见没做什么事,留作未来扩展之用。
lockdep_init();
// init_task的类型为task_struct.task_struct包含了一个进程相关的所有信息,
// task_struct就是进程描述符(process descriptor)。
// init_task就是内核中第一个进程,也就是idle进程或0号进程的process descriptor,
// init_task由INIT_TASK宏完成初始化,
//set_task_stack_end_magic函数定义在kernel/fork.c中第297行到303行,
// 用于设置进程栈增长的终点。进程描述符和紧挨着的线程描述符thread_info,通常占据内核
// 分配的8K空间,并占据两个连续的内存页框,堆栈从这8K的高地址开始增长,在thread_info
// 结构外设置一个魔数,避免栈数据覆盖了thread_info结构。
set_task_stack_end_magic(&init_task);
// 以下3个函数定义为空,不做分析
smp_setup_processor_id();
debug_objects_early_init();
boot_init_stack_canary();
// 函数体为return 0,不做分析
cgroup_init_early();
// 关闭当前CPU中断
local_irq_disable();
early_boot_irqs_disabled = true;
// 在多CPU机器上选择CPU
boot_cpu_init();// 定义在mm/highmem.c第479行,用于高端内存初始化page_address_init();
// 打印lin