LINUXLinux启动流程

1 Bootloader

对于一般的ARM处理器,CPU上电或复位执行第一条指令所在地址,即第一段程序Bootloader的开始地址,Bootloader一般存于Nor-flash(XIP),支持芯片内执行。

Bootloader的功能可总结为:1)初始化CPU时钟,内存,串口等。2)设置Linux启动参数。3)加载Linux内核镜像。Android源码位于根目录下的/bootable文件夹。

系统正常启动,运行Bootloader,初始化芯片,根据设置的启动参数cmdline,加载Linux内核镜像,将控制权交给内核。

系统在Bootloader模式下(非正常启动模式),可使用fastboot, mmcboot等工具烧写内核和文件系统,顺便提一下,Android手机分区一般分为内核区boot.img,系统区system.img,用户数据区userdata.img,数据恢复区recovery.img等。

2 Linux内核镜像

内核镜像被加载到内存,首先进行自解压,zImage, bzImage或uImage的头部都内嵌有解压缩程序,最终将内核解压到内存的指定位置,开始运行内核。

3 启动内核

源码位于/kernel/init/main.c,线索可归纳为:启动内核start_kernel() => 初始化Linux各大模块 + rest_init() => 开启内核线程kthreadd和kernel_init() => 初始化设备驱动程序do_basic_setup() + init_post() => 开启第一个用户进程init。

3.1 start_kernel()

源码位于/kernel/init/main.c的start_kernel()函数,完成初始化Linux系统的进程管理,内存管理,文件系统等工作,可以说个个都是重量级的工作。

这里有必要解释下内核选项,因为Linux各个子系统的初始化都建立在内核选项的解析之后。

parse_early_param();
parse_args("Booting kernel", static_command_line, __start___param,
  __stop___param - __start___param, &unknown_bootoption);

1) 内核选项的注册

通过__early_parm(str, fn)或__setup(str, fn)宏来注册。两者都调用__setup_param宏实现,它将注册的内核选项str所关联的函数fn存放到.init.setup节

  


2) 内核选项的解析

两次注册对应两次解析,即parse_early_param()和parse_param(),解析时,会在__setup_start和__setup_end之间查找内核选项,当识别有内核选项时,即会调用相应的处理函数。内核解析完后,各个子系统的初始化就可通过kernel_init()=>do_basic_setup()=>do_initcalls()来完成。

3.2 reset_init()

开启内核线程kthreadd和kernel_init,kthreadd用来运行kthread_create_list全局链表中的kthread,然后创建idle线程来占用掉cpu空闲的时间片

内核线程又叫守护进程,关于内核线程和Linux普通进程的区别,归纳为以下三点:

  • 内核线程执行的是内核中的函数,而普通进程只有通过系统调用才能执行内核中的函数。
  • 内核线程只运行在内核态,而普通进程既可以运行在用户态,也可以运行在内核态。
  • 因为内核线程指只运行在内核态,因此,它只能使用大于PAGE_OFFSET(3G)的地址空间。另一方面,不管在用户态还是内核态,普通进程可以使用4GB的地址空间。

3.3 kernel_init()

此时与体系相关的部分已经初始化完成,do_basic_setup()开始初始化设备,完成外设及驱动程序(直接编译进内核的模块)的加载和初始化。

3.4 init_post()

开启init用户进程,所谓Android的启动流程从这里才刚刚开始。

Android部分的启动流程参考http://blog.csdn.net/maxleng/article/details/5508372

阅读更多
个人分类: linux 内核机制
上一篇Linux设备驱动子系统终极弹 - USB
下一篇Android电源管理 .
想对作者说点什么? 我来说一句

linux引导_2.0.zip

2011年05月10日 8.17MB 下载

linux编程资料下载

2009年06月20日 758KB 下载

linuxlinux

2011年07月25日 140KB 下载

linuxlinux命令大全linuxlinux

2011年06月28日 5KB 下载

linux材料有课件

2011年12月22日 4.61MB 下载

zygote启动流程

2011年11月17日 40KB 下载

\Uboot启动流程\Uboot启动流程

2010年12月25日 60KB 下载

Uboot启动流程.PDF

2011年05月02日 50KB 下载

Linux启动流程 Linux启动流程

2011年05月23日 150KB 下载

linux启动流程分析

2011年08月15日 6.32MB 下载

没有更多推荐了,返回首页

关闭
关闭