WEB开发网
开发学院手机开发Android 开发 Android Linux启动过程详解 阅读

Android Linux启动过程详解

 2010-06-01 22:50:00 来源:WEB开发网   
核心提示:对于2.4.x版内核2.4.x中变化比较大,但基本过程没变,Android Linux启动过程详解(4),变动的是各个数据结构的具体实现,比如Cache,此时系统中存在着六个运行实体:start_kernel()本身所在的执行体,这其实是一个"手工"创建的线程,页首外设初始化--内核引导第二部分in

对于2.4.x版内核

2.4.x中变化比较大,但基本过程没变,变动的是各个数据结构的具体实现,比如Cache。

页首外设初始化--内核引导第二部分

init()函数作为核心线程,首先锁定内核(仅对SMP机器有效),然后调用 do_basic_setup()完成外设及其驱动程序的加载和初始化。过程如下:

总线初始化(比如pci_init())

网络初始化(初始化网络数据结构,包括sk_init()、skb_init()和proto_init()三部分,在proto_init()中,将调用protocols结构中包含的所有协议的初始化过程,sock_init())

创建bdflush核心线程(bdflush()过程常驻核心空间,由核心唤醒来清理被写过的内存缓冲区,当bdflush()由kernel_thread()启动后,它将自己命名为kflushd)

创建kupdate核心线程(kupdate()过程常驻核心空间,由核心按时调度执行,将内存缓冲区中的信息更新到磁盘中,更新的内容包括超级块和inode表)

设置并启动核心调页线程kswapd(为了防止kswapd启动时将版本信息输出到其他信息中间,核心线调用kswapd_setup()设置kswapd运行所要求的环境,然后再创建 kswapd核心线程)

创建事件管理核心线程(start_context_thread()函数启动context_thread()过程,并重命名为keventd)

设备初始化(包括并口parport_init()、字符设备chr_dev_init()、块设备 blk_dev_init()、SCSI设备scsi_dev_init()、网络设备net_dev_init()、磁盘初始化及分区检查等等,device_setup())

执行文件格式设置(binfmt_setup())

启动任何使用__initcall标识的函数(方便核心开发者添加启动函数,do_initcalls())

文件系统初始化(filesystem_setup())

安装root文件系统(mount_root())

至此do_basic_setup()函数返回init(),在释放启动内存段(free_initmem())并给内核解锁以后,init()打开 /dev/console设备,重定向stdin、stdout和stderr到控制台,最后,搜索文件系统中的init程序(或者由init=命令行参数指定的程序),并使用 execve()系统调用加载执行init程序。

init()函数到此结束,内核的引导部分也到此结束了,这个由start_kernel()创建的第一个线程已经成为一个用户模式下的进程了。此时系统中存在着六个运行实体:

start_kernel()本身所在的执行体,这其实是一个"手工"创建的线程,它在创建了init()线程以后就进入cpu_idle()循环了,它不会在进程(线程)列表中出现

上一页  1 2 3 4 5 6 7 8  下一页

Tags:Android Linux 启动

编辑录入:coldstar [复制链接] [打 印]
赞助商链接