kernel启动
2020-03-24 09:57:21 9 举报
记录Linux kernel启动过程,不正之处,烦请指正~感谢
作者其他创作
大纲/内容
设置中断;进一步配置内存;解析内核命令行参数;
init/main.c : start_kernel()
rootfs文件系统即 根结点\"\\\";其他文件系统挂载在'\\'下的文件内
设备和文件系统驱动被编译进内核,没有initrd
初始化运行内核所需环境,加载内核镜像到内存;
三选一进行驱动、设备加载、挂载最终的跟文件系统
产生cpu reset中断;执行FFFF0000处code;POST检查;初始化中断向量表;产生0X19中断
实模式arch/x86/boot/main.c : main():copy_boot_params()//参数复制到boot_paramsarch/x86/boot/pm.c:go_to_protected_mode()arch/x86/boot/pmjump.S:protected_mode_jump()
以上根据体系结构不同,进行不同的底层设置。到start_kernel()这里统一。
initrd-独立小文件系统
init/main.c : rest_init()
init/main.c : cpu_idle()//进入空闲循环
设置堆栈;拷贝压缩的内核到缓冲尾部;清空BSS;解压内核;将解压后的内核文件ELF解析到内存中(.o文件)
载入RAM 磁盘
arch/x86/kernel/head_32.S:startup_32()
/linuxrc 程序
跳转到解压后的内核执行
arch/x86/kernel/head32.c : i386_start_kernel()
创建线程执行
initramfs- cpio-initrd
在指定的根设备上挂载最终的根文件系统;通过\"init=\"运行用户指定的init程序
init/main.c : kernel_init()
创建基于内存rootfs -- VFS fs/dcache.c : vfs_caches_init() fs/namespace.c : mnt_init()
__init do_basic_setup
通过中断0X19
针对来自 cpio 的归档负责替代 prepare_namespace()要完成的工作
实模式(setup)入口函数:arch/x86/boot/header.S:_start
init/do_mounts.c :prepare_namespace()
initrd文件执行
保护模式入口函数(0x100000):arch/i386/boot/compressed/head_32.S:startup_32()
调度器周期性的接管控制权,提供多任务处理
屏蔽PIC中的所有中断、设置GDT和IDT
32位内核入口函数(进程0,清除函数)拷贝boot_params、boot_command_line;初始化页表,开启分页机制。
加载硬件驱动模块;挂载跟文件系统;
汇编,内核执行的入口;体系结构相关的硬件初始化;准备大量BootLoader参数;创建栈空间,检查签名,清空BSS跳转C main执行
包含/linuxrc程序:加载驱动模块,挂载最终的根文件系统
CPU 上电
加载vmlinuz
/init 程序
从CS:IP=FFFF:0000入口加载BIOS
拷贝boot_params、boot_command_line;初始化页表,开启分页机制。
vmlinuz是zImage(低)/bzImage(高内存)的拷贝或链接;bzImage包含setup+vmlinux
BIOS加载BootLoader到0x7C00处
0 条评论
下一页