day43-系统移植简介

day43-系统移植简介

一、系统移植简介

  系统移植是将一个程序或操作系统从一个硬件平台转移到另一个硬件平台的过程。这个过程可能涉及到修改源代码,以使其能够在新的硬件平台上运行,或者使用交叉编译的技术,将源代码编译成在新硬件平台上运行的可执行文件。




二、嵌入式linux系统

  Linux系统由多个主要部分组成,包括:

  1. 引导程序(BootLoader):BootLoader是用于初始化硬件设备、建立内存空间的映射图,然后将系统的控制权交给操作系统内核的一段小程序。它负责在启动时加载内核到内存中,并传递给它控制权。常见的引导程序包括GRUB、LILO等。

  2. 内核(Kernel):内核是操作系统的核心部分,它负责管理系统的硬件资源,并提供上层应用程序调用的接口服务程序。Linux内核包括了设备驱动、进程和内存管理、文件系统等。

  3. 设备树(Device Tree, DTB):在嵌入式Linux系统中,设备树是一个数据结构,用于描述硬件设备的信息,例如设备的物理地址、设备的类型、设备的配置等。设备树可以让内核知道系统中存在哪些设备,这些设备如何配置,以及它们如何相互连接。

  4. 根文件系统(rootfs):根文件系统是Linux系统启动后,用户可以直接操作的部分。它包含操作系统需要的各种文件和目录,例如/bin、/etc、/lib、/usr等。根文件系统可以是只读的(如在嵌入式系统或LiveCD中),也可以是可写的。

  在Linux系统启动过程中,BootLoader首先被执行,它初始化硬件,并加载内核和设备树到内存中,然后将控制权交给内核。内核开始运行,并使用设备树信息来理解硬件配置。然后,内核挂载根文件系统,系统进入用户空间,开始执行init进程,最后用户可以开始使用系统。




三、交叉编译

  交叉编译是在一种系统平台(称为主机)上生成另一种系统平台(称为目标)上运行的可执行代码的过程。例如,你可能在一台运行Linux的x86架构的电脑(主机)上编译一份用于在ARM架构的设备(目标)上运行的程序。

  交叉编译器(Cross Compiler)是实现交叉编译的关键工具,它能够产生能在不同硬件或操作系统平台上运行的二进制文件。常见的交叉编译工具有GCC、Clang等。

  这里用的是arm-linuxg-gcc编译器




四、环境搭建(连接)

交叉开发环境的硬件组成主要由以下几大部分:

  1. 开发主机
  2. 目标机(开发板)
  3. 二者的链接介质,常用的主要有3中方式:(1)串口线 (2)USB线 (3)网线

对应的硬件介质,还必须要有相应的软件“介质”支持:

  1. 对于串口,通常用的有串口调试助手,putty工具等,工具很多,功能都差不多,会用一两款就可以;
  2. 对于USB线,当然必须要有USB的驱动才可以,一般芯片公司会提供,比如对于三星的芯片,USB下载主要由DNW软件来完成;
  3. 对于网线,则必须要有网络协议支持才可以,常用的服务主要tftpnfs

利用网线将windows,虚拟机,板子连接起来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(1) 设置虚拟机ip:
1. 编辑 -> 虚拟网络编辑器(桥接模式) -> VMnet0 桥接到(选连板子的网卡,就是连接到网口的那个网卡)
2. 虚拟机 -> 设置 -> 网卡适配器 -> 自定义 (选 VMnet0)
3. 点ubuntu右上角网络图标 -> 右键选编辑连接 -> 全删掉 -> 添加(改新连接名称为board)-> IPV4 设置 -> 方法(选手动) -> 点添加 设置为 192.168.9.120 255.255.255.0 192.168.9.1 并保存退出
4. 断开网络再连接,ifconfig测试,ping主机

(2) 设置windows的ip:
打开windows网络与共享中心-->本地连接-->属性-->IPV4地址配置-->配置IP;192.168.9.100

(3) 设置板子ip:
set ipaddr 192.168.9.233 //设置【目标机】开发板的ip地址;
set serverip 192.168.9.120 //设置【开发主机】ubuntu的ip地址;
set gatewayip 192.168.9.1 //设置网关
set netmask 255.255.255.0 //设置子网掩码
saveenv //保存环境变量到emmc中;
板子命令:
printenv(pri): 输出当前环境信息;
setenv(set):设置环境变量;
saveenv(save):保存环境变量;
ping :是否能ping通虚拟机

上面是板子直连的情况,如果是在同一个局域网下的,就按局域网的ip进行连接,即更改板子的设置,注意板子的ip绝不能被占用

4.1 tftp服务

  主要用于实现文件的下载,比如开发调试的过程中,主要用tftp把要测试的bootloader、kernel和文件系统直接下载到内存中运行,而不需要预先烧录到Flash芯片中,一方面,在测试的过程中,往往需要频繁的下载,如果每次把这些要测试的文件都烧录到Flash中然后再运行也可以,但是缺点是:过程比较麻烦,而且Flash的擦写次数是由限的;另外一方面:测试的目的就是把这些目标文件加载到内存中直接运行就可以了,而tftp就刚好能够实现这样的功能,因此,更没有必要把这些文件都烧录到Flash中去。

tftp建立:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
(1) 虚拟机建立tftp:
0.检查是否安装过tftp
sudo apt-cache policy tftpd-hpa

1. 安装tftp服务器:
sudo apt-get install tftpd-hpa tftp-hpa
注意:虚拟机需要连外网,也就是能够ping www.baidu.com
2. 配置tftp服务器:
sudo vim /etc/default/tftpd-hpa
TFTP_USERNAME="tftp" #用户的使用命令;
TFTP_DIRECTORY="/tftpboot" #共享文件的路径;
TFTP_ADDRESS="0.0.0.0:69" #服务器的ip地址和端口号;
TFTP_OPTIONS="-l -c -s"
根文件系统下面创建目录tftpboot,修改共享文件的权限(文件夹和文件的权限都要修改)
sudo chmod 0777 /tftpboot
3. 启动tftp服务器
sudo service tftpd-hpa restart //重启
4. 将需要传输的文件存储在共享目录中(/tftpboot)

5. 测试是否成功安装
tftp 127.0.0.1
tftp>get <filename>
tftp>q
(2) 板子建立tftp
1. 把day1的镜像目录下的uImage,exynos4412-fs4412.dtb,ramdisk.img拷贝到/tftpboot目录下
tftp 41000000 uImage //下载内核
tftp 42000000 exynos4412-fs4412.dtb //下载设备树
tftp 43000000 ramdisk.img //下载根文件系统
bootm 41000000 43000000 42000000
内核地址 根文件系统地址 设备树地址
注意:地址顺序不能出错;

一次性配置:
set bootcmd tftp 41000000 uImage\; tftp 42000000 exynos4412-fs4412.dtb\; tftp 43000000 ramdisk.img\; bootm 41000000 43000000 42000000

save
(3) 交叉编译器安装:
1. 将gcc-4.6.4.tar.xz 拷贝到虚拟机的某一个目录中
cp gcc-4.6.4.tar.xz ~/workspace/fs4412
2. 进入到所对应的目录中,解压gcc-4.6.4.tar.xz
cd ~/workspace/fs4412
tar -xvf gcc-4.6.4.tar.xz
3. 进入到gcc-4.6.4目录中,通过pwd查看绝对路径;
cd gcc-4.6.4/bin
pwd === > /home/farsight/workspace/fs4412/gcc-4.6.4/bin
4. 修改PATH的值;
进入到/etc/bash.bashrc,在文件的最前面添加
sudo vim /etc/bash.bashrc
export PATH=$PATH:/home/farsight/workspace/fs4412/gcc-4.6.4/bin
5. 重启;
source /etc/bash.bashrc

6. 测试:
a.生成可执行文件:arm-none-linux-guneabi-gcc 1.c
b.拷贝执行文件到下载目录: cp a.out /tftpboot
c.在板子上使用tftp下载a.out到板子上: tftp -g -r a.out 192.168.9.120 (注:板子和Ubuntu必须在同一网段)
注:使用tftp上传文件到服务器 tftp -p -r a.out 192.168.9.120
d.修改a.out权限:chmod 777 a.out
e.执行a.out: ./a.out

4.2 nfs服务

  主要用于实现网络文件的挂载,实际上是实现网络文件的共享,在开发的过程中,通常在系统移植的最后一步会制作文件系统,那么这是可以把制作好的文件系统放置在我们开发主机PC的相应位置,开发板通过nfs服务进行挂载,从而测试我们制作的文件系统是否正确,在整个过程中并不需要把文件系统烧录到Flash中去,而且挂载是自动进行挂载的,bootload启动后,kernel运行起来后会根据我们设置的启动参数进行自动挂载,因此,对于开发测试来讲,这种方式非常的方便,能够提高开发效率。(和共享文件差不多)

nfs建立:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
(1)虚拟机
0. 查看是否安装过nfs服务器:
sudo apt-cache policy nfs-kernel-server
1. 安装nfs服务器
sudo apt-get install nfs-kernel-server
2. 配置nfs服务器
1) 拷贝day1镜像目录下的根文件系统rootfs.tar.xz到开发主机中的一个目录(例如/source/nfs)
cp rootfs.tar.xz /source/nfs
2) 进入到rootfs.tar.xz所对应的目录中
cd /source/nfs
3) 解压根文件系统
tar -xvf rootfs.tar.xz
4) 进入到rootfs目录,使用pwd确定所对应的绝对路径
cd rootfs
pwd ----> /source/nfs/rootfs 就是用来挂载的共享路径;

5) 修改nfs配置文件 sudo vim /etc/exports
在文件的尾部添加代码:
/source/nfs/rootfs *(rw,sync,no_root_squash,no_subtree_check)
注意:路径需要和根文件系统的实际路径一致;

3. 启动nfs服务器:
sudo service nfs-kernel-server restart

4. 测试是否配置成功
sudo mount -t nfs localhost:/source/nfs/rootfs/ /mnt/ //测试nfs服务是否安装成功。

ls /mnt/ (如果其中的内容和/nfs/rootfs中一致。 表示有挂载成功)

sudo umount /mnt //解除挂载

(2) 设置板子nfs:
1. 设置启动参数:
set bootcmd tftp 41000000 uImage\; tftp 42000000 exynos4412-fs4412.dtb\; bootm 41000000 - 42000000
set bootargs root=/dev/nfs nfsroot=192.168.12.123:/source/nfs/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.12.31 clk_ignore_unused=true
set bootargs root=/dev/nfs nfsroot=192.168.12.123:/source/nfs/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.12.31 clk_ignore_unused=true
ubuntuIP 开发板IP
saveenv

2、开发板重新启动: 开发板自动进入 下面界面
[root@farsight ]# --- 成功

把文件放入虚拟机中Linux的共享目录/source/nfs/rootfs中,开发板中自然会出现这个文件
在虚拟机中 cp a.out /source/nfs/rootfs
开发板中出现下面界面:
[root@farsight ]# ls
1.c bin etc linuxrc proc sbin tmp var
a.out dev lib mnt root sys usr

【问题解决】
5、nfs本机测试没问题,但是挂载到开发板失败

方法一:如果ubuntu是18.04
/*Ubuntu 18.04 nfs 默认为协议3和协议4,但是 我的uboot 默认启动的是协议2的形式
如: /srv/homes hostname1(rw,sync,no_subtree_check)
若想要求 nfs 支持协议2,就在/etc/default/nfs-kernel-server末尾加一句:
RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"
*/
方法二:如果ubuntu是20.04
1)把nfs配置文件备份
sudo mv /etc/default/nfs-kernel-server /etc/default/nfs-kernel-server.back
2) 替换nfs配置文件
把day1镜像目录下的nfs-kernel-server拷贝到/etc/default目录下
sudo cp nfs-kernel-server /etc/default
3) 重启nfs服务
sudo service nfs-kernel-server restart
4) 重新挂载到开发板

4.3 将系统存储到emmc中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
在sd卡中烧录对应u-boot
a) 拷贝第一天/镜像文件/ramdisk.img拷贝到虚拟机/tftpboot目录下
b) 烧写内核镜像到EMMC上
# tftp 41000000 uImage
# movi write kernel 41000000

c) 烧写设备树文件到EMMC上
# tftp 41000000 exynos4412-fs4412.dtb
# movi write dtb 41000000

d) 烧写文件系统镜像到EMMC上
# tftp 41000000 ramdisk.img
#movi write rootfs 41000000 3000000

e) 设置启动参数
# set bootcmd movi read kernel 41000000\;movi read dtb 42000000\;movi read rootfs 43000000 3000000\;bootm 41000000 43000000 42000000
# set bootargs
# saveenv

f) 重新启动开发板,u-boot自动加载、执行内核
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2020-2024 nakano-mahiro
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信