android kernel启动部分代码

kernel初始化入口

当bzImage(如用于arm映像)被调用时,他从kernel\arch\arm\boot\compressed\head.S的start汇编程序开始执行。

1. 这个程序执行一些基本的硬件配置,设置一些基本的的运行环境(如堆栈)后,清除BSS段

2. 调用kernel\arch\arm\boot\compressed\misc.c中的decompress_kernel()函数解压内核,内核被解压到内存之后

3. 会再调用kernel\arch\arm\kernel\head.S中的secondary_startup例程,

这个新的secondary_startup会初始化页表,并启用内存分页机制,接着为任何可选的浮点单元检测CPU的类型,并将其储存起来供以后使用,这些都做完之后,kernel\init\main.c中的start_kernel()函数被调用,进入与体系结构无关的Linux内核部分。

start_kernel()会调用一系列初始化函数来设置中断,执行进一步的内存配置。之后kernel\arch\arm\kernel\process.c的kernel_thread(rest_init调用)被调用以启动第一个核心线程,该线程执行init()函数,而原执行序列会调用cpu_idle()等待调度。

作为核心线程的init()函数完成外盒及其驱动程序的加载和初始化,挂接跟文件系统。init()打开/dev/console设备。重定向stdin、stdout、stderr到控制台。之后,他搜索文件系统中的init程序,并使用execve()系统调用执行init程序。

kernel\init\main.c

asmlinkage void __init start_kernel(void)
{
char * command_line;
extern const struct kernel_param __start___param[], __stop___param[];
 .......
.......
local_irq_disable();
early_boot_irqs_disabled = true;
/*
 * Interrupts are still disabled. Do necessary setups, then
 * enable them
 */
tick_init();
boot_cpu_init();
page_address_init();          //内存映射(持久映射和临时映射)
printk(KERN_NOTICE "%s", linux_banner);
setup_arch(&command_line);           //setup_arch特定于体系架构(即cpu类型),在这里会判断machine id,并负责初始化自举分配器和内存页表
 .......
 .......
setup_per_cpu_areas();      //初始化per_cpu机制的一些结构,将.data.percpu段中的数据拷贝到cpu的内存段中
smp_prepare_boot_cpu();/* arch-specific boot-cpu hooks */

build_all_zonelists(NULL);   //建立节点与内存域中的关系
page_alloc_init();

 .......
 .......
/*
* These use large bootmem allocations and must precede
* kmem_cache_init()
*/
mm_init();    //停用自举分配器的bootmem,迁到实际的内存管理中,初始化slab分配器,初始化进程虚拟地址空间的管理结构

/*
* Set up the scheduler prior starting any interrupts (such as the
* timer interrupt). Full topology setup happens at smp_init()
* time - but meanwhile we still have a functioning scheduler.
*/
sched_init();
 .......
 .......
/* init some links before init_ISA_irqs() */
early_irq_init();
init_IRQ();
prio_tree_init();
init_timers();
hrtimers_init();
softirq_init();
timekeeping_init();
time_init();
profile_init();
call_function_init();
if (!irqs_disabled())
printk(KERN_CRIT "start_kernel(): bug: interrupts were "
"enabled early\n");
early_boot_irqs_disabled = false;
local_irq_enable();
.......
.......
console_init();
.......
.......
setup_per_cpu_pageset();    //为每一个内存区域分配per_cpu_pageset结构

 .......
thread_info_cache_init();
cred_init();
fork_init(totalram_pages);
proc_caches_init();
buffer_init();
key_init();
security_init();
dbg_late_init();
vfs_caches_init(totalram_pages);
signals_init();
/* rootfs populating might need page-writeback */
page_writeback_init();
#ifdef CONFIG_PROC_FS
proc_root_init();
#endif
cgroup_init();
cpuset_init();
taskstats_init_early();
delayacct_init();
check_bugs();
acpi_early_init(); /* before LAPIC and SMP init */
sfi_init_late();
ftrace_init();
/* Do the rest non-__init'ed, we're now alive */
rest_init();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值