嵌入式Linux启动过程分析8-linux-kernel-setup

linux的启动过程可以分为两个部分
1.架构/开发板相关的引导过程2.后续的通用启动过程

最终目的:运行应用程序(在根文件系统中)------->挂载根文件系统才能找到应用程序

第一阶段:引导过程
通常使用汇编语言编写
第一个执行的文件是/arch/arm/kernel/head.S
1.开始确定内核是否支持该构架__lookup_processor_type
2.确定内核是否支持单板__lookup_machine_type---->u-boot启动内核时传入的机器id
3.__create_page_tables建立一级页表
4.__arm920_setup禁止ICache/Dcache/数据Cache/指令Cache
5.__enable_mmu使能MMU
6.__mmap_switched  复制数据段、清除BBS段、设置栈指针、保存CPU ID到__machine_arch_type变量,调用start_kernel

第二阶段:后续启动过程
1.输出Linux版本信息printk(linux_banner)
2.设置与体系结构相关的环境setup_arch
3.其他的初始化操作
4.console_init
5.其他部分
6.启动init过程---->rest_init--->调用kernel_init-->调用prepare_namespace---->调用mount_root挂载根文件系统----->挂载完成后调用init_post打开/dev/console执行应用程序


init/main.c的start_kernel函数是第一个C函数
setup_arch与setup_command_line来解析u-boot传递过来的参数


内核启动流程:
arch/arm/kernel/head.S
start_kernel
    setup_arch
    setup_command_line
    parase_early_param
        do_early_param
            从__setup_start到__setup_end,调用early函数
    unkonw_bootoption
        obsolete_checksetup
            从__setup_start到__setup_end调用非early函数
    rest_init
        kernel_init
            prepare_namespace
                mount_root
            init_post
                执行用户的应用程序

你可能感兴趣的:(kernel,嵌入式Linux)