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

本文详细介绍了Linux系统的启动过程,分为架构相关的引导阶段和通用启动阶段。引导阶段包括确定内核支持的架构、建立页表等步骤;通用启动阶段则涉及Linux版本信息输出、体系结构环境设置、挂载根文件系统等关键操作。
摘要由CSDN通过智能技术生成
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
                执行用户的应用程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值