linux系统移植:bootz启动linux内核(代码片段)

JeckXu666 JeckXu666     2022-12-01     694

关键词:

文章目录

Linux系统移植:bootz 启动 Linux 内核

一、images 的全局变量

启动 Linux 内核的时候会用到一个重要的全局变量

bootm_headers_t images;

bootm_headers_t 是个 boot 头结构体,在文件 include/image.h 中的定义,代码不粘贴了,具体到 uboot 源码中查看

其中 os 成员变量是 image_info_t 类型的,为系统镜像信息。

结构体 image_info_t 是系统镜像信息结构体,具体如下:

下面的 11 个宏定义表示 U-BOOT 的不同阶段

images 会在 bootz 命令的执行中频繁使用到,非常重要

二、do_bootz 函数

使用 bootz 命令后执行函数为 do_bootz,在文件 cmd/bootm.c 中有定义:

int do_bootz(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])

	int ret;
	/* Consume 'bootz' */
	argc--; argv++;

	if (bootz_start(cmdtp, flag, argc, argv, &images))
		return 1;
	/*
	 * We are doing the BOOTM_STATE_LOADOS state ourselves, so must
	 * disable interrupts ourselves
	 */
	bootm_disable_interrupts();

	images.os.os = IH_OS_LINUX;
	ret = do_bootm_states(cmdtp, flag, argc, argv,
			      BOOTM_STATE_OS_PREP | BOOTM_STATE_OS_FAKE_GO |
			      BOOTM_STATE_OS_GO,
			      &images, 1);
	return ret;

该函数首先传入参数调用了 bootz_start 函数,然后调用函数 bootm_disable_interrupts 关闭中断,最后设置 images.os.os 为 IH_OS_LINUX,也就是设置系统镜像为 Linux,表示要启动的是 Linux 系统

之后调用函数 do_bootm_states 来执行不同的 BOOT 阶段,这里要执行的 BOOT 阶段有:

  • BOOTM_STATE_OS_PREP
  • BOOTM_STATE_OS_FAKE_GO
  • BOOTM_STATE_OS_GO

三、bootz_start 函数

bootz_srart 函数定义在文件 cmd/bootm.c 中

代码主要的执行目标如下:

  • 代码先调用函数 do_bootm_states,执行 BOOTM_STATE_START 阶段

  • 设置 images 的 ep 成员变量(系统镜像的入口点)使用 bootz 命令启动系统的时候就会设置系统在 DRAM 中的存储位置,这个存储位置就是系统镜像的入口点,因此 images->ep=0X80800000

  • 调用 bootz_setup 函数,判断当前的系统镜像文件是否为 Linux 的镜像文件,打印出镜像相关信息

  • 调用函数 bootm_find_images 查找 ramdisk 和设备树(dtb)文件

四、do_bootm_states 函数

do_bootz 最后调用的就是函数 do_bootm_states,函数定义在文件common/bootm.c 中

函数 do_bootm_states 根据不同的 BOOT 状态执行不同的代码段,先判断 BOOT 的状态

states & BOOTM_STATE_XXX

然后根据 BOOT 的状态执行不同的代码

五、bootm_os_get_boot_func 函数

do_bootm_states 会调用 bootm_os_get_boot_func 来查找对应系统的启动函数,函数定义在文件 common/bootm_os.c 中

代码中的 boot_os 是个数组,这个数组里面存放着不同的系统对应的启动函数,boot_os 也定义在文件 common/bootm_os.c 中

启动 linux 函数就是 do_bootm_linux

六、do_bootm_linux 函数

do_bootm_linux 就是最终启动 Linux 内核的函数,函数定义在文件 arch/arm/lib/bootm.c

只有在参数 flag 等于 BOOTM_STATE_OS_GO 或者 BOOTM_STATE_OS_FAKE_GO 的时候执行 boot_jump_linux 函数,boot_selected_os 函数在调用 do_bootm_linux 的时候会将 flag 设置为 BOOTM_STATE_OS_GO

然后执行函数 boot_jump_linux,函数定义在文件 arch/arm/lib/bootm.c 中

该代码就是判断芯片的 machid ,Linux 内核会在自己的机器 ID 列表里面查找是否存在与 uboot 传递进来的 machid 匹配的项目,如果存在就说明 Linux 内核支持这个机器,那么 Linux 就会启动,同时代码判断是否启动设备树,其中最核心的一个函数就是 kernel_entry 函数,此函数用于进入 Linux 内核,函数有三个参数:zero,arch,params,第一个参数 zero 为 0;第二个参数为机器 ID;第三个参数 ATAGS 或者设备树(DTB)首地址

注意 kernel_entry 并不是 uboot 定义的,而是 Linux 内核定义的,Linux 内核镜像文件的第一行代码就是函数 kernel_entry,而 images->ep 保存着 Linux内核镜像的起始地址,起始地址保存的正是 Linux 内核第一行代码

在获取 kernel_entry 并执行 kernel_entry 前,uboot 先调用 cleanup_before_linux 函数做一些清理工作,然后使用汇编传参数给 kernel_entry 进入 Linux 内核

do_bootz 函数具体流程可以简化如下

到此 uboot 启动 Linux 结束

rk3399系统移植|移植linux主线5.4.32内核

更新时间更新内容2022-10-26初稿文章目录一、linux原生内核初试1.下载2.编译3.生成boot.img镜像3.启动测试二、移植到friendlyRK3399-SOM开发板1.新建单板2.新建设备树:3.编译4.测试三、rootfs挂载问题1.问题描述2.问题分析3.问题解决源码一... 查看详情

linux系统移植:内核获取和编译(代码片段)

文章目录Linux系统移植:内核获取和编译一、获取Linux内核二、Linux内核编译Linux系统移植:内核获取和编译一、获取Linux内核Linux由Linux基金会管理与发布,Linux官网为https://www.kernel.org,选取合适的版本来使用就行... 查看详情

linux系统移植:原厂kernel移植到开发板(代码片段)

文章目录Linux系统移植:原厂Kernel移植到开发板一、获取原厂内核并编译二、内核启动测试三、添加自己板子文件3.1板子配置文件3.2板子设备树3.3编译四、重要配置修改4.1主频修改4.2EMMC驱动修改4.3网络驱动修改4.4保存修改后... 查看详情

i.mx6ull系统移植|移植linux原生5.4.32内核

更新时间更新内容2022-09-22初稿文章目录一、linux原生内核初试1.下载2.编译3.下载到开发板4.启动结果分析二、移植linux内核1.新建单板1.1.新建单板配置文件1.2.新建设备树文件2.测试三、适配新的开发板1.修改model2.添加心跳灯3.修改... 查看详情

linux学习:uboot移植

...nbsp;2)第二阶段的功能初始化本阶段使用的硬件设备检测系统内存映射将内核从Flash读取到RAM中为内核设置启动参数启动内核关于uboot启动分析以下这条链接写的不错,使用的是MINI2440平台: http://w 查看详情

嵌入式linux根文件系统移植——根文件系统简介

嵌入式Linux根文件系统移植(二)——根文件系统简介    根文件系统是内核启动时挂载的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的... 查看详情

linux内核移植入门(代码片段)

...性,支持的硬件平台广泛2.超强的网络功能3.多任务多用户系统4.模块化的设计五大子系统:1.进程管理子系统2.内存管理子系统3.文件系统子系统4.网络协议子系统5.设备管理子系统获取linux内核:1.内核官方发布点2.芯片厂商提供内核... 查看详情

linux系统移植:内核源码目录分析

文章目录Linux系统移植:内核源码目录分析一、目录文件简述二、VSCode创建源码工程Linux系统移植:内核源码目录分析一、目录文件简述先看一下一级目录:首先看一下linux自带的文件夹目录功能arch存放架构文件相关... 查看详情

linux内核移植初探(代码片段)

...、支持的硬件平台广泛;超强的网络功能;多任务多用户系统;模块化的设计五大子系统:进程管理;内存管理;文件系统;网络协议;设备管理内核获取路径:芯片厂商、内核源码官方linux内核的目录结构层次结构:平台相关... 查看详情

linux内核移植

...#xff0c;本章我们就来学习一下如何将NXP官方提供的Linux内核移植到正点原子的I.MX6U-ALPHA开发板上。通过本章的学习,我们将掌握如何将半导体厂商提供的LinuxBSP包移植到我们自己的平台上。 查看详情

怎样移植u-boot和linux到s3c2440开发板

...启动。本文就介绍如何实现该功能,并组成一个最简单的系统,这不仅要移植uboot,还要移植linux内核及创建一个根文件系统。首先我们对nandflash进行分区,规划好每个文件存放在nandflash的位置。下面是nandflash的分区:第0分区:0... 查看详情

嵌入式linux第二部分-裸机开发/系统移植/驱动开发/内核开发

...。主要涉及Linux环境配置,嵌入式Linux裸机开发,Linux文件系统及系统移植,驱动开发等部分。目前持续更新中,更新时间:2022年11月27日【嵌入式Linux】裸机开发篇LinuxC语言及Makefile基础【嵌入式Linux】1.shell概念及常用命令行【嵌... 查看详情

linux系统移植:根文件系统构建(代码片段)

文章目录Linux系统移植:根文件系统构建一、什么是根文件系统二、根文件系统目录2.1子目录bin2.2子目录dev2.3子目录etc2.4子目录lib2.5子目录mnt2.6子目录proc2.7子目录usr2.8子目录var2.9子目录sbin2.10子目录sys2.11子目录opt三、BusyBox创... 查看详情

bootm命令移植

...)初始化软/硬件(内存硬件/外部设备/堆栈)(2)启动操作系统<uImagine和zImagine之间的关系>zImagine是最纯粹的Linux内核在zImagine之上加上一个信息头就成位了uImagine 信息头用于指明系统信息(何种OS,镜像文件是否 查看详情

系统移植

操作系统的移植:引导系统:BIOS/bootloader--->引导内核程序系统核心:win核心、linux核心(kernel)这个程序不会死,会一直运行(挂载文件系统)注:在系统启动的最后阶段会创建一个新的内核线程来完成文件系统的挂载;挂载的方式有... 查看详情

嵌入式linux第二部分-裸机开发/系统移植/驱动开发/内核开发

...。主要涉及Linux环境配置,嵌入式Linux裸机开发,Linux文件系统及系统移植,驱动开发等部分。目前持续更新中,更新时间:2022年11月13日【嵌入式Linux】裸机开发篇LinuxC语言及Makefile基础【嵌入式Linux】1.shell概念及常用命令行【嵌... 查看详情

sourceinsight安装在linux上啊(虚拟机环境)求具体步骤!望各位高手不吝赐教!谢谢

...干的,我的sourceinsight在linux跑得很好。参考技术ALinux文件系统Linux常用命令Linux启动过程详解。2、Shell编程基础Shell简介认识后台程序Bash编程熟悉Linux系统下的编辑环境。3、Linux下的C编程基础linuxC语言环境概述Gcc使用方法Gdb调试技... 查看详情

linux系统移植:正点原子u-boot移植(代码片段)

文章目录Linux系统移植:正点原子U-Boot移植一、What‘sU-Boot?1.1U-Boot简介1.2U-Boot选择二、正点原子U-Boot编译2.1编译环境2.2编译脚本三、U-Boot烧写与启动Linux系统移植:正点原子U-Boot移植一、What‘sU-Boot?1.1U-Boot简介Linux系统启... 查看详情