以arm处理器为例,参考目前最新的内核版本:4.8.6
汇编语言部分:
ENTRY(stext)://Kernel startup entry point. 代码路径:linux-4.8.6\arch\arm\kernel\head.S
|--bl __lookup_processor_type
|--bl __fixup_smp:假如支持SMP
|--bl __create_page_tables:创建页表
|--b __enable_mmu:使能MMU
|--__mmap_switched:arch\arm\kernel\head-common.S
|--b start_kernel:跳转到C语言入口处
C语言入口:
start_kernel:./init/main.c
|--cgroup_init_early
|--local_irq_disable
|--boot_cpu_init
|--page_address_init
|--pr_notice("%s", linux_banner);打印“Linux version ...”等信息。
|--setup_arch
|--mm_init_cpumask
|--setup_command_line
|--setup_nr_cpu_ids
|--mm_init:内存模块初始化
|--sched_init
|--init_timers:定时器初始化
|--hrtimers_init:高速时钟初始化
|--time_init:时钟初始化
|--console_init:串口初始化
|--thread_stack_cache_init:下面是对进程模块的初始化
|--cred_init
|--fork_init
|--rest_init:其余模块的初始化
|--kernel_thread(kernel_init, NULL, CLONE_FS);
|--kernel_init
|--kernel_init_freeable
|--do_basic_setup:
|--driver_init:驱动初始化
|--do_initcalls:执行模块的初始化。根据不同的初始化级别来进行初始化。
|--free_initmem:释放初始化时申请的内存。
|--try_to_run_init_process("/sbin/init"): //创建内核的第一个进程init。假如在内核启动的时候没有设置启动的进程的话,通常是/sbin/init或者/etc/init或者/bin/init进程。进程pid为1
|--kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);//创建系统的第二个内核进程,进程PID为2,进程名为kthreadd.通过ps命令可以看到。
|--find_task_by_pid_ns
|--cpu_startup_entry:内核启动进入idle模式,即进入死循环。
汇编语言部分:
ENTRY(stext)://Kernel startup entry point. 代码路径:linux-4.8.6\arch\arm\kernel\head.S
|--bl __lookup_processor_type
|--bl __fixup_smp:假如支持SMP
|--bl __create_page_tables:创建页表
|--b __enable_mmu:使能MMU
|--__mmap_switched:arch\arm\kernel\head-common.S
|--b start_kernel:跳转到C语言入口处
C语言入口:
start_kernel:./init/main.c
|--cgroup_init_early
|--local_irq_disable
|--boot_cpu_init
|--page_address_init
|--pr_notice("%s", linux_banner);打印“Linux version ...”等信息。
|--setup_arch
|--mm_init_cpumask
|--setup_command_line
|--setup_nr_cpu_ids
|--mm_init:内存模块初始化
|--sched_init
|--init_timers:定时器初始化
|--hrtimers_init:高速时钟初始化
|--time_init:时钟初始化
|--console_init:串口初始化
|--thread_stack_cache_init:下面是对进程模块的初始化
|--cred_init
|--fork_init
|--rest_init:其余模块的初始化
|--kernel_thread(kernel_init, NULL, CLONE_FS);
|--kernel_init
|--kernel_init_freeable
|--do_basic_setup:
|--driver_init:驱动初始化
|--do_initcalls:执行模块的初始化。根据不同的初始化级别来进行初始化。
|--free_initmem:释放初始化时申请的内存。
|--try_to_run_init_process("/sbin/init"): //创建内核的第一个进程init。假如在内核启动的时候没有设置启动的进程的话,通常是/sbin/init或者/etc/init或者/bin/init进程。进程pid为1
|--kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);//创建系统的第二个内核进程,进程PID为2,进程名为kthreadd.通过ps命令可以看到。
|--find_task_by_pid_ns
|--cpu_startup_entry:内核启动进入idle模式,即进入死循环。