精选优质文档-----倾情为你奉上
精选优质文档-----倾情为你奉上
专心---专注---专业
专心---专注---专业
精选优质文档-----倾情为你奉上
专心---专注---专业
X86体系结构内核启动分析
一、硬件检测挂载真正的根文件系统。
装载Linux内核的第一步应该是加载实模式代码(boot sector和setup代码),grub就会把实模式代码setup加载到0x07C00之上的某个地址上,其中setup的前512个字节是boot sector(引导扇区),现在这个引导扇区的作用并不是用来引导系统,而是为了兼容及传递一些参数。之后grub跳转到setup的入口点,入口点为_start例程(根据arch/x86/boot/)。然后setup最后跳到arch/x86/boot/,跳到start_kernel()函数,这是Linux内核的启动函数。。每种体系结构都会执行一些底层设置函数,然后执行名为start_kernel的函数(在init/)。“粘合剂(glue)”,之前执行的代码都是各种体系结构相关的代码,一旦到达start_kernel(),就与体系结构无关了。start_kernel()会调用一系列初始化函数来设置中断,执行进一步的内存配置,解析内核命令行参数。然后调用fs/:vfs_caches_init()---
精选优质文档-----倾情为你奉上
精选优质文档-----倾情为你奉上
专心---专注---专业
专心---专注---专业
精选优质文档-----倾情为你奉上
专心---专注---专业
->fs/:mnt_init()创建基于内存的rootfs文件系统(是一个虚拟的内存文件系统,称为VFS),这是系统初始化时的根结点,即"/"结点,后面VFS会指向真实的文件系统。fs/:mnt_init()会调用fs/ramfs/:init_rootfs()会调用fs/:register_filesystem()注册rootfs。然后fs/:init_mount_tree()调用fs/:do_kern_mount()在内核中挂载rootfs,调用fs/:set_fs_root()将当前的rootfs文件系统配置为根文件系统。此时rootfs里只有根目录。
为什么不直接把真实的文件系统配置为根文件系统?答案很简单,内核中没有真实根文件系统设备(如硬盘,USB)的驱动,而且即便你将根文件系统的设备驱动编译到内核中,此时它们还尚未加载,实际上所有内核中的驱动是由后面的kernel_init线程进行加载。另外,我们的root设备都是以设备文件的方式指定的,如果没有根文件系统,设备文件怎么可能存在呢?
start_kernel()在最后会调用rest_init(),这个函数会启动一个内核线程来运行kernel_init(),自己则调用cpu_idle()进入空闲循环,让调度器接管控制权。抢占式的调度器
linux内核启动流程总结(共6页) 来自淘豆网m.daumloan.com转载请标明出处.