linux内核启动过程

以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模式,即进入死循环。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值