03_系统移植入门

发布时间 2023-12-14 15:15:57作者: StarAire

03_系统移植入门

  • 移植的基本步骤
    • 确定目标机、主机的连接方式 (已完成)
    • 安装交叉编译器(已完成)
    • 搭建主机-目标及数据传输通道(已完成)
    • 编译三大子系统
    • 烧写测试

uboot常用命令

https://blog.csdn.net/conjimmy/article/details/128693548

setenv、seveenv

设置环境变量

例如
set abc 100 200 第一个是变量名,后面都是变量值
后面如果什么都不跟,就是删除环境变量

这些变量都是存在 内存里的一小块空间

要把环境变量保存(把环境变量从内存拷贝到flash中),就需要使用saveenv指令

网络环境相关的信息

  • ipaddr
    • set ipaddr 192.168.1.160

nand

  • nand [动词] [内存地址] [flash内部地址] [搬移大小]
    • erase
    • write
    • read

把nand flash中5M空间读到内存21000000,1k大小

nand read 21000000 500000 1024

tftp

C:开发板
S:虚拟机

PC上提前开启tftp服务器
分为windows和linux
windows下一个tftp软件即可
linux上指令安装
sudo apt-get install tftpd openbsc-xinetd

具体设置网络上搜索


然后开发板上uboot下
输入tftp [内存地址] 文件
例如:tftp 20008000 a.txt
会把服务器上的a.txt的文件里的数据,拷贝到0x20008000的内存处

bootm

启动uImage

go

uImage
zImage Image bzImage

这些都是我们常见的内核文件

我们把内核文件下载到内存中

tftp 20008000 uImage

然后使用go指令跳转到这个内存地址
go 20008000 开始执行linux内核

结果是启动不了的

因为内核需要有启动条件

内核启动条件

其实就是环境变量 bootargs
root 启动的跟文件系统在那个设备中
设备信息 RAM NFS Flash
init 内核启动后,第一个可执行文件,也就是init进程从哪里来
console 内核启动时,使用那个设备作为控制台

例如:
1、设置环境变量
setenv bootargs root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200
2、保存环境变量
saveenv

启动完了之后,我们的文件系统还没有挂载,导致我们的根文件系统没有,所以用户没法交互

文件系统的烧写

这个文件系统可以是各种介质,例如
内存RAM ramdisk
Nand flash
网络等等,都是可以的

  • 修改启动参数

root=/dev/ram
initrd=0x21000000,8M
内核从ramdisk启动文件系统,起始地址0x21000000,大小8M

init=/linuxrc
console=ttySAC0

  • 提前将内核和根文件系统拷贝到ramdisk上

20008000 uImage

tftp 20008000 uImage

21000000 根文件系统文件 initrd.img.gz

tftp 21000000 initrd.img.gz

  • 设置启动参数

setenv bootargs root=/dev/ram initrd=0x21000000,8M init=/linuxrc console=ttySAC0,115200

  • 启动内核

bootm 20008000

挂载网络文件系统 NFS

方便驱动开发

在驱动开发的时候,我们需要频繁的修改一些驱动文件,如果在虚拟机上修改,然后再拷贝到开发板上,会十分麻烦,所以我们选择把虚拟机上的一部分空间挂载为开发板的文件系统

  • PC上安装nfs服务

sudop apt-cache search nfs- 搜索nfs服务

sudo apt-get install nfs-kernel-server 安装nfs服务

配置:vim /etc/exports

里面添加

共享目录/home/rocky/work/rootfs

启动服务

sudo /etc/init.d/nfs-kernel-server restart

把前面的根文件系统文件解压一下gunzip initrd.img.gz 得到initrd.img

然后挂载到当前目录下的swap文件夹下

sudo mount -t ext2 initrd.img ./swap/

然后进入到这个目录下,就会发现有linux的根文件目录,把这些全部拷贝到我们之前设置的共享目录

sudo cp -a /home/rockey/tftpboot/swap /home/rocky/work/rootfs

至此,服务端的所有工作已经做完

  • 开发板上设置启动参数,挂在我们的虚拟机文件系统

setenv bootargs root=/dev/nfs nfsroot=192.168.10.110:/home/rocky/work/rootfs ip=192.168.10.122 init=/linuxrc console=ttySAC0,115200

启动bootm 0x20008000

自动运行

设置uboot自动启动内核

bootdelay
bootcmd