系统移植的必要性与组成
在嵌入式开发中,**系统移植(Linux 系统定制)** 是常见的需求,主要原因在于:
1. **官方镜像体积过大**:标准 Linux 发行版(如 Ubuntu)可能占用数 GB 存储,而嵌入式设备的 **Flash 存储容量有限**(如 256MB),因此需要裁剪和优化。
2. **资源适配**:不同硬件(如 ARM 开发板)需要匹配专用的驱动和配置,直接使用通用镜像可能导致兼容性问题。
操作系统的核心组成部分
嵌入式 Linux 系统通常由以下部分构成,需按顺序烧录至开发板:
1. 开机引导程序(Bootloader)
- 例如 `U-Boot`(支持网络加载)、`vBoot`、`vivi`,负责初始化硬件并加载内核。
2. 内核(Linux Kernel)
- 裁剪后的核心,包含必要的驱动和进程管理功能。
3. 文件系统(Root Filesystem)
- 包含基础命令(如 `ls`、`cd`)和应用程序,通常通过 `BusyBox` 精简实现。
企业开发中,工程师需根据硬件资源(如 Flash 大小、CPU 架构)定制这三部分,确保系统高效运行。
制作过程
制作u-boot
在网上下载好bootloader,Linux内核和busybox压缩包。并将其解压,首先先来制作u-boot,进入到bootloader中更改一个参数,vim /bootloader/u-boot/common/main.c ,将bootdelay设置成时间长一点,相当于进入bios的时间,默认是0
设置好之后返回到u-boot页面,make mini2440_config , make , 即可制作好u-boot。
Linux内核
解压之后进入 vim .config 里面内容=M,表示独立的块,要用的时候在用,y是直接编译到内核里面。使用 make menuconfig进入到类似BIOS页面,进入图形页面对内核进行配置。
这边我只需要修改文件系统 Miscellaneous filesystems
cramfs(Compressed ROM file system support)选中按回车变成<*>
保存之后退出,执行下面代码
cp /home/friendlyarm/bootloader/u-boot/tools/mkimage /binmake uImage ARCH=arm CROSS_COMPILE=arm-linux-
即可制作好uImage
根文件系统
构建嵌入式 Linux 文件系统的过程中,BusyBox 是核心组件之一,它提供了绝大多数常用的 Unix/Linux 命令,适用于资源受限的嵌入式系统。
文件系统主要依赖 BusyBox 来提供基础命令和工具。构建文件系统通常从创建一个空目录开始,用作根文件系统的基础结构。
mkdir rootfs
cd rootfs
进入到rootfs文件里面新建一般常用的Linux文件
mkdir bin sbin etc lib proc sys usr dev tmp var mnt
到/dev目录下新建两个结点
mknod -m 666 console c 5 1
mknod -m 666 null c 3 1
然后切换到busybox文件里面 , 使用menuconfig图形页面配置文件,配置完之后使用make make install 。这时候rootfs中的bin就含许多可执行的命令比如ls kill等。解压之前准备好的etc压缩包到rootfs/etc文件下,这时候自己制作的文件系统中就含有脚本文件。最后使用mkcramfs进行压缩。
./mkcramfs rootfs/ rootfs.img
这里创建的文件系统是只读的。
这样就做好了三个需要烧写的镜像u-boot.bin rootfs-img uImage
烧入嵌入式开发板上
在嵌入式系统烧录过程中,第一步通常是通过 MiniTools 工具将 u-boot.bin
(引导加载程序)烧入开发板的 Flash。该版本的 U-Boot 支持 UDP TFTP 协议,便于后续通过网络将 Linux 内核和根文件系统下载到板子上。
烧写完成后,开发板上电启动后会运行 U-Boot,此时可以通过串口或网络命令,从主机 TFTP 服务器下载 uImage
(内核镜像)和根文件系统(如 rootfs.cpio
或 rootfs.ext4
),并将它们加载到内存中,接着启动内核。
这种方式适用于开发调试阶段,速度快、无需每次烧录 Flash,同时也方便系统升级和调试内核或文件系统问题。
这里选择Linux,然后只需要烧入第一行文件,也就是u-boot,其余不用,可以点上格式化flash.
烧入完u-boot之后就可以进入uboot模式,在uboot模式下我们需要配置IP地址,这时候开发板上的IP要和电脑 的IP在一个局域网内,
setenv ipaddr xx.xx.xx.xxx
setenv serverip xx.xx.xx.xxx
saveenv
保存,这时候使用printenv可以查看到改变的环境变量
设置完IP之后就可以ping通主机电脑(这里在ping的时候要记得将电脑的防火墙关闭)。便可以通过tftp下载uImage和rootfs.img。
下载内核文件和根文件系统通常需要三步骤
1、下载:tftp 0x30000000 192.168.1.100:uImage
从192.168.1.100目录下下载uImage到norflash 0x30000000内存地址上。
2、擦除:nand erase 0x00060000 0x00500000
在nandflash从0x00060000地址开始向后擦除0x00500000个字节。
3、写入:nand write 0x30000000 0x00060000 0x00500000
从norflash 0x30000000内存地址写到nandflash地址0x00060000,大小0x00500000。
按照同样的操作继续将rootfs.img烧写到开发板上,之后需要进行环境变量的配置。
1、setenv bootcmd 'nboot 0x30008000 0 0x00060000;bootm 0x30008040'
uboot起来之后去哪找根文件系统和uimage
2、setenv bootargs console=ttySAC0 noinitrd root=/dev/mtdblock3 init=/linuxrc rootfstype= cramfs(文件系统模型)
然后saveenv,保存完之后reset重启一下,烧入完成,可以使用。
当前使用的根文件系统格式为 cramfs(Compressed ROM File System),这是一种只读文件系统。因此,如果希望在系统中运行自己的程序或脚本,需要事先将它们打包进根文件系统中,例如放在 /home
目录下。
虽然 cramfs 是只读的,但在系统启动后,某些目录(如 /dev
)是以可写方式挂载的(通常通过内存虚拟文件系统如 tmpfs 实现)。因此,在系统运行过程中,可以进入 /dev
目录临时使用 tftp
命令从主机下载测试用的可执行文件,并在该目录下进行调试。
⚠️ 需要注意的是:这些通过 /dev
或其他临时目录下载或创建的文件 在系统重启后都会被清除,因为它们位于内存文件系统中。
因此,这种方式仅适用于临时测试和调试。如果希望这些文件在每次启动后依然保留,应在制作根文件系统镜像(如 cramfs)时,将所需可执行文件和资源直接打包进 /home
或其他目录中。