一、系统移植的目的
1) 软硬件可裁剪
硬件发生变化,软件要进行裁剪,对硬件适配。
2)学习linux驱动的开发,前提开发板上需要运行linux系统。
移植内核系统到开发版上
*要掌握系统移植的流程(编译流程和配置流程)
二、系统移植的四个部分
1)交叉编译环境的搭建
2)u-boot 移植
3)linux内核的移植
4)根文件系统的移植
系统移植的根本:
给FS6818平台安装一个Linux操作系统
三、本地开发和交叉开发的概念《环境搭建》
本地开发:应用层开发。
本地编写代码,编译代码,运行代码
交叉开发:arm开发,驱动开发。《交叉编译环境搭建》
PC端编写代码,编译代码
开发板上运行代码。
四、开发板和pc硬件连接
- 串口 :打印内核或者uboot源码信息
- 网线:开发板和pc进行通信,上网通过网线下载程序,内核源码镜像几兆,网线的传输速度快
- miniusb:uboot不支持网卡驱动,使用miniusb(OTG USB)下载程序 需要用到 fastboot 工具
五、安装交叉编译工具链
重点掌握
- 家目录下创建 Toolchain 目录
- 解压交叉编译工具链的压缩包
- 配置环境变量
#打开
sudo vi /etc/bash.bashrc
#或者
vi ~/.bashrc
#添加环境变量
export PATH=$PATH:home/用户名/Toolchain/工具链名/bin/
- 使环境变量生效`
source /etc/bash.bashrc
# or
source .bashrc
- 测试交叉工具链是否安装成功
#终端执行
arm-none-linux-gnueabi-gcc -v
#打印以下信息,表示配置成功。
gcc version 4.5.1 (Sourcery G++ Lite 2010.09-50)
sudo apt-get install lib32ncurses5
sudo apt-get install lib32z1
#64位ubuntu系统安装一下这个32位兼容64位的库
六、交叉编译工具链中的GUN相关的命令
(ubuntu 系统中 x86 架构 的 GUN 命令在 usr/bin 目录)
交叉编译工具链中GUN命令所在的路径:/home/用户名/Toolchain/gcc-4.5.1/bin
前缀:arm-none-linux-gnueabi-xxx
重点掌握
-
gcc ------- 编译命令
arm-none-linux-gnueabi-gcc -c xxx.c或xxx.S -o xxx.o
-
ld ------- 链接: 将所有的 .o 文件链接生成可执行文件
arm-none-linux-gnueabi-ld -Ttext=0x43c00000 xxx.o xxx.o xxx.o -o xxx.elf -Ttext=0x43c00000:指定程序的入口地址 -Tmap.lds :指定链接脚本
-
objdump -------- 将 .elf文件 反汇编 生成 反汇编文件 .dis
arm-none-linux-gnueabi-objdimp -D ***.elf > ***.dis
-
objcopy -------- 将 .elf 文件生成 二进制文件(.bin)
arm-none-linux-gnueabi-objcopy -O binary ***.elf ***.bin
-
nm -------- 查看可执行文件的符号表
arm-none-linux-gnueabi-nm ***.elf
-
size -------- 查看可执行文件中各个数据段的大小
arm-none-linux-gnueabi-size ***.elf
-
readelf -------- 查看可执行文件的头部信息
arm-none-linux-gnueabi-readelf -h ***.elf
-
strip -------- 压缩文件命令(重点掌握) 删除可执行文件中的符号表 ,符号表不影响程序的运行 注意:不可以对中间文件执行strip命令 比如:.o文件
arm-none-linux-gnueabi-strip 要压缩的文件名
-
addr2line -------- 根据地址信息定位错误信息 (重要掌握) -e:指定可执行文件的 -a -f: 回显错误地址对应的函数的名字
arm-none-linux-gnueabi-addr2line -e ***.elf 错误地址 -a -f
-
总结 : gnu命令名 --help : 查看帮助手册 百度gnu命令的使用
七、tftp 服务
重点掌握
tftp:基于TCP/IP的简单文本文件传输协议。
目的:可以使用 tftp 命令通过网线下载程序到开发板上
-
检查 ubuntu 是否安装tftp服务
dpkg -s tftpd-hpa
-
安装tftp服务
前提: ubuntu 可以上网 sudo apt-get install -f sudo apt-get update sudo apt-get install tftph-hpa tftp-hpa
-
配置 tftp 相关环境变量
1> 在家目录下创建 tftpboot 目录,并设置权限为 777 tftpboot文件夹的作用? 将需要下载的文件,放到 tftpboot 目录下,当使用 tftp 命令下载时,tftp 命令会自动的到ubuntu 的 tftpboot 目录下找对应的要下载的文件 2> 修改tftp的环境变量 打开tftp的配置文件: sudo vi /etc/default/tftpd-hpa 修改配置文件中的内容,修改为以下:
修改配置文件中的内容,修改为以下:
1 # /etc/default/tftpd-hpa 2 3 TFTP_USERNAME="tftp" 4 TFTP_DIRECTORY="/var/lib/tftpboot" 5 TFTP_ADDRESS=":69" 6 TFTP_OPTIONS="--secure"
修改为以下形式:
1 # /etc/default/tftpd-hpa 2 # tftp服务 3 TFTP_USERNAME="tftp" # 指定自己的tftpboot的路径 4 TFTP_DIRECTORY="/home/hqyj/tftpboot" # 端口号默认为69 5 TFTP_ADDRESS="0.0.0.0:69" # 权限相关参数 6 TFTP_OPTIONS="-c -s -l"
-
重启 tftp 服务
$ sudo service tftpd-hpa restart 重启tftp服务
-
测试tftp服务是否安装成功
$ : 表示在ubuntu中执行的命令 # :表示在串口工具中执行的命令 $ tftp 127.0.0.1 启动tftp服务 tftp> put 文件名 ---》 上传当前目录下的文件到tftpboot目录下 tftp> get 文件名 ---》 从tftpboot目录下下载文件到当前目录下 tftp> q ---》退出tftp服务
为什么安装tftp服务? 参考图:安装tftp服务.png
八、安装NFS服务(通过网络的方式挂载跟文件系统)
NFS : Network File System
重点掌握
-
检查 ubuntu 是否安装 nfs 服务
dpkg -s nfs-kernel-server
-
安装 nfs 服务
sudo apt-get install nfs-kernel-serv
-
配置 nfs 服务的环境变量
打开配置文件:$ sudo vi /etc/exports
在文件的末尾添加以下内容:
/home/用户名/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash) :<<' /home/用户名/nfs/rootfs:根文件系统的路径 nfs服务从这个路径下挂在跟文件系统 注:修改为自己的跟文件系统的路径 *:所有的用户 rw:可读可写的权限 sync:同步 no_subtree_check:不检查子目录的权限 no_root_squash:如果客户端时root用户, 具有相同的访问权限 注意: *( ----》 之间不允许有空格,否则会报没有写的权限 '
-
在家目录下创建 nfs 目录,并修改权限为 777
$ cd ~ $ mkdir nfs $ chmod 777 nfs 将 根文件系统 的压缩包拷贝到家目录录下的 nfs 中 并解压
-
重启 nfs 服务
sudo server nfs-kernel-server restart
-
本地测试nfs服务是否安装成功
原理:将跟文件系统使用mount命令挂载到ubuntu的/mnt目录下 sudo mount -t nfs 192.168.1.222:/home/hqyj/nfs/rootfs /mnt -t nfs : 使用nfs服务 192.168.1.222:/home/hqyj/nfs/rootfs ----》ip:路径 注:改成自己的ubuntu的ip地址 改成自己的跟文件系统的路径 /mnt --> 跟文件系统挂在到/mnt目录下 取消跟文件系统的挂载 sudo umount /mnt 注意:不可已在/mnt路径下执行卸载命令
为什么安装nfs服务? 参考图:安装nfs服务.png