系统移植过程


Windows装机

1.系统镜像和引导程序
首先要自己从网上下载一个 windows 的系统镜像,用u盘作为一个引导程序,如u盘里下载“老毛桃”之类的程序。

2.BIOS选择启动方式
BIOS(Basic Input/Output System,基本输入输出系统)是运行于操作系统和内核之前的,是计算机启动过程中最先运行的程序之一,是固化到主板上的一个东西。进入BIOS选择u盘启动方式。

3.根据引导程序安装系统
顾名思义,就是根据引导程序安装,找老毛桃之类的教程。

4.安装驱动程序
系统安装完成后,就需要安装驱动,驱动各个硬件工作(如鼠标键盘、网卡之类的)。


Linux系统移植

类比 windows 装机过程,把 linux 安装到开发板上

1.内核镜像和引导程序
首先同样是要准备一个 linux 内核镜像,装入u盘或者是 sd 卡,因为在嵌入式开发中 sd 卡使用更广泛,这里选择 sd 卡,提前在 sd 卡上面下载 Bootloader 引导程序,如 Uboot。

2.拨码开关选择启动方式
开发板也有类似于BIOS的开机程序,但是并不叫BIOS,叫做 BL0 等,同时需要提前拨动拨码开关选择 sd 卡启动,Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段 bootloader 程序,也就是进入 Uboot。

3.根据引导程序安装系统
Uboot运行起来,加载内核和根文件系统到内存中,并启动内核。

4.安装驱动程序
系统安装完成后,一些简单的硬件驱动通过内核编译就可以完成,要驱动一些额外的硬件工作就安装驱动程序。

环境搭建

交叉编译工具链

不同的架构能识别的机器码不同,机器码与汇编语言都是一一对应的,也就是说,机器码和汇编语言都不太好移植,只有C语言这样的高级语言可以不区分架构便于移植,而C语言可以编译成为汇编语言,因此,选择对应架构的交叉编译工具链,将C语言编译成对应架构的汇编语言就是移植的关键。比如 x86 架构的处理器,就用 gcc ,而 arm 架构的处理器,就用 arm-linux-gcc 。

TFTP(Trivial File Transfer Protocol)

TFTP是一种简单的文件传输协议,用于通过网络传输文件。在系统移植中,TFTP通常用于将编译好的内核镜像和根文件系统映像传输到目标平台上。

NFS(Network File System)

NFS是一种在网络上共享文件系统的协议,它允许不同的计算机通过网络共享文件和目录。在系统移植中,NFS可以用于在开发主机和目标平台之间共享文件系统,挂载根文件系统(rfs),以便进行调试和测试。


uboot

uboot启动流程

  • 设置CPU状态寄存器(cpsr):在U-Boot启动的初期,首先会通过设置CPSR(当前程序状态寄存器)来使CPU进入SVC(Supervisor)特权模式,并禁止FIQ(快速中断)和IRQ(普通中断)。这是为了确保在初始化过程中,CPU能够控制所有硬件资源,并且不会被外部中断干扰。
  • 关闭看门狗、MMU、Cache:看门狗是一种用于监测CPU运行状态的硬件机制,如果CPU在一段时间内没有执行任何操作(即“死机”),看门狗会触发复位。在U-Boot启动过程中,为了避免被看门狗复位,首先需要关闭看门狗;cache和MMU是通过CP15管理的,刚上电的时候,CPU还不能管理他们。所以上电的时候MMU必须关闭,指令cache可关闭,可不关闭,但数据cache一定要关闭否则可能导致刚开始的代码里面,去取数据的时候,从cache里面取,而这时候RAM中数据还没有cache过来,导致数据预取异常。
  • 初始化寄存器和外设:接下来,U-Boot会初始化一系列寄存器和外设,包括时钟、串口、Flash和内存等。这些初始化操作是确保U-Boot能够正常运行的基础。
  • 自搬移U-Boot:由于U-Boot通常存储在Flash等非易失性存储器中,其执行速度较慢。为了提高启动速度,U-Boot会将自己从Flash中搬移到RAM中运行。这一步骤通常涉及读取Flash中的U-Boot代码,并将其写入RAM的特定位置。
  • 设置栈空间并初始化global_data:在U-Boot进入C语言执行环境之前,需要设置栈空间。栈是程序运行时用于存储临时数据和函数调用信息的内存区域。global_data是U-Boot中用于存储全局变量和参数的结构体,包括板级信息、设备树信息等。在U-Boot启动过程中,会初始化这个结构体以供后续使用。
  • 剩余硬件初始化:在完成上述基本初始化后,U-Boot会继续初始化剩余的大部分硬件设备,如网络控制器、USB控制器等。这些初始化操作取决于具体的硬件平台和U-Boot的配置。
  • 搬移Linux内核:最后,U-Boot会将Linux内核从存储介质(如Flash、硬盘等)中读取出来,并搬移到RAM中。在搬移过程中,U-Boot还会设置内核的启动参数(如命令行参数、设备树地址等),以确保内核能够正确启动。

uboot配置

1、指定当前硬件平台:在uboot源码支持开发板的前提下,在顶层目录使用make <name>_config指令(name是开发板名称,注意删除<>)。
2、指定编译uboot源码使用的编译器:在uboot源码顶层目录下的makefile中指定(CROSS_ COMPILE变量)。
3、uboot编译:在uboot顶层目录下执行 make 指令开始编译,理论上会生成一个 elf 格式的可执行文件,但是 elf 格式文件不能在uboot使用,因此需要 objcopy 编译工具生成 .bin 可执行文件,这些都是在 makefile 中配置好的。

uboot移植

1、半导体厂商(如NXP、ST、TI、Microchip等)通常会提供开发板(Demo Board)和板级支持包(BSP, Board Support Package)。这些BSP包包含了针对特定硬件平台的U-Boot、Linux内核和根文件系统(rootfs)等组件的预配置和移植版本。用户可以在这些预配置的基础上,针对自己的开发板进行修改和扩展。

2、由于每个开发板的设计都有其独特性(如不同的外设配置、接口布局、硬件规格等),因此用户很少会直接使用半导体厂商的Demo板设计。相反,他们会在Demo板的基础上根据自己的需求进行修改。这些修改可能包括更改外设连接、调整时钟设置、优化电源管理等。

3、一般 uboot 中需要解决串口、NAND、EMMC 或 SD 卡、网络和 LCD 驱动,因为 uboot 的主要目的就是启动 Linux 内核,所以不需要考虑太多的外设驱动。

4、在U-Boot中,每个板子都有其特定的配置和驱动。因此,在移植过程中,需要添加或修改板级配置文件、修改或编写驱动代码、编译和测试。


linux内核移植

1.指定处理器架构和编译工具:在顶层目录下的 makefile 文件去设置ARCH和CROSS_COMPILE,ARCH是选择架构的,开发板一般是 arm 架构,CROSS_COMPILE则是用来指定交叉编译器的。

2.导入当前处理器的默认配置:因为arm架构下仍有很多不同型号的芯片,可以进入到 /arch/arm 目录下查找自己的芯片名称,找到后运行 make <name>_defconfig 指令(name是名称,注意删除<>),这就会把自己芯片的功能代码导入到顶层目录的 .config 文件中,内核编译就会有这些内容,相应的内核体积就会增大。因此可以看出,主要就是 .config 文件的配置,直接修改可能很困难,因为很多功能都有依赖关系,通过刚才的指令直接导入配置很方便,也可以用make menuconfig图形化界面配置其他功能,本质都是修改.config 文件。

3.内核编译:

make uImage:编译内核
make modules:编译内核模块(生成 .ko 文件,该文件的意义就是把内核的一些功能移动到内核外边, 需要的时候插入内核,不需要时卸载。)
make dtbs:编译设备树
make clean:删除编译中间文件

  • 执行 make uImage 内核编译后,在 arch/arm/boot 目录下会生成一个zImage文件,这个就是一个可执行文件(elf 是运行在 linux 上的,这个类似于 bin 格式的文件(不是bin),直接运行在cpu上的)。但是,U-Boot为了更方便地加载和启动内核,引入了一种特殊的内核镜像格式——uImage,我们希望得到一个 uImage 文件,需要在 zImage 的基础上加一些信息。此处可以用到一个叫 mkimage 的工具(自己下载,uboot 编译后在 tool 目录下可能有),在 zImage 基础上加上U-Boot头部信息 uImage,这就是可以直接放在开发板上的 linux 内核镜像了。
  • 设备树也属于内核的一部分,它和内核镜像一起放入内存中运行。每个开发板都有自己对应的设备树文件,设备树是体现硬件信息的,相当于使用手册说明书。修改 arch/arm/boot/dts 目录下的 makefile 文件,找到同名开发板,写自己的芯片名 .dtb ,然后回到顶层目录进行设备树编译。说明:dts 是设备树源文件,dtb 是编译后的设备树二进制文件

linux内核启动

将前面的 uImage 和 dtb 文件通过 tftp 协议下载到开发板。

注:这里启动大概率会卡死。
原因是:根文件系统挂载失败。解决方法:修改设备树(添加/修改网卡信息),安装网卡驱动、NFS、TCP/IP协议。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值