start_kernel(void)
init/main.c break point: 0x1ae3844

smp_setup_processor_id();不产生任何实际指令,就是个空函数.
lockdep_init(); debug_objects_early_init();一条指令都没有生成
怎么判断出来的? call 0xffffffff813982f0 查System.map可以,这是在调用get_random_bytes,已经在执行boot_init_stack_canary();了.
虽然在arch/x86/include/asm/stackprotector.h的头部注释里有解释,但是还不清楚这个stackprotector是怎么工作的.
boot_init_stack_canary就是生成个随机数,然后写入到current->stack_canary和irq_stack_union.stack_canary里去.
current和irq_stack_union都是PER_CPU variable.

cgroup_init_early();不清楚是做什么用的,先略过去.

local_irq_disable();其实就相当于cli.

tick_init();还不清楚是怎么工作的,略过.

boot_cpu_init();
smp_processor_id() -> raw_smp_processor_id() // include/linux/smp.h#0177
                        -> percpu_read(cpu_number) // arch/x86/include/asm/smp.h#0191
                            -> DEFINE_PER_CPU(int, cpu_number); // arch/x86/kernel/setup_percpu.c#0024
                               EXPORT_PER_CPU_SYMBOL(cpu_number);
关于cpu的管理,include/linux/cpumask.h的注释里写的很清楚,分四种状态 possible, present, active, online, 在.config里可以看到CONFIG_HOTPLUG_CPU=y, CONFIG_NR_CPUS=256, 所以cpu可以hotplug,并且kernel最多支持256个cpu.
boot_cpu_init把第0个cpu设为online, active, present, possible;

// cpu的状态使用bitmap管理,256bits / 8 = 32 bytes
cpu_online_bits     0x1ac5d80
cpu_possible_bits   0x1ac5da0
cpu_present_bits    0x1ac5dc0
cpu_active_bits     0x1ac5de0
page_address_init();查.config可以知道,里边没有HASHED_PAGE_VIRTUAL,也没有WANT_PAGE_VIRTUAL,所以#define page_address_init() do { } while(0)

printk(KERN_NOTICE "%s", linux_banner);, linux_banner定义在 init/version.c#0041
const char linux_banner[] =
	"Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@"
	LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n";
printk打印的这句话可以在/var/log/syslog里找到,在我的机器上是: Linux version 3.8.0-38-generic (buildd@lamiak) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #56~precise1-Ubuntu SMP Thu Mar 13 16:22:48 UTC 2014 (Ubuntu 3.8.0-38.56~precise1-generic 3.8.13.19)
等到可以再在bochs里查看一下我们自己编译的这个kernel打印出来的是什么.