系统组成
windows系统
BIOS(引导系统) windows系统核心 应用程序 驱动 文件系统(程序 就是维护我们自己存储文件)linux系统
bootloader(引导系统) kernel(linux内核) 应用程序 驱动 文件系统
开发环境
- 交叉工具链
- tftp服务器
- nfs服务器
- ubuntu系统(命令)
linux特点
- linux系统有硬件限制
- linux系统比较复杂
- 开源不免费,涉及到一些技术问题还是要自行解决
- 有各种资源,需要自行移植优化是比较复杂
系统移植要点
- 搭建交叉开发环境
- bootloader 的选择和移植
- kernel 的配置、编译、移植和调试
- 根文件系统的制作
交叉开发环境
硬件环境
- fs4412/串口线(显示调试信息)/网线(传输数据)
- 当前PC(ubuntu)
- 拨码开关
- 0110 : EMMC启动模式
- 1000 : SD卡启动模式
软件环境
交叉编译: 当前程序编译的处理器架构与执行的处理器架构不同,因此需要使用交叉编译来编译一个可以在arm架构下执行的可执行程序
交叉编译工具链: 交叉编译使用的工具
获取交叉编译工具链
- 可以自己制作交叉编译工具链(crosstools-ng)
- 可以进行交叉工具链的下载
- 使用厂家提供的交叉编译工具链
安装交叉工具链方法
- 在ubuntu中创建一个文件夹将gcc-4.6.4.tar 拷贝到当前目录下
解压当前文件(其中有几个目录bin目录下有很多可执行程序)
tar xvf gcc-4.6.4.tar
对PATH变量进行赋值(原有的PATH值和当前交叉工具链接下后的bin目录)
sudo vi /etc/bash.bashrc export PATH=$PATH:/home/lf/sys/gcc-4.6.4/bin (个人路径)
export:导出为全局
注:将当前bin目录下的可执行程序变成全局的命令,PATH变量就是表示系统中可执行命令路径的全局变量重新执行当前脚本程序
source /etc/bash.bashrc
gcc的编译过程
预处理 (头文件包含/宏替换/条件编译) —->
.i
cpp main.c > main.i
编译 将.i文件(c语言)翻译成汇编文件 —->
.s
sudo ./cc1 main.i(/usr/lib/gcc/i686-linux-gnu/4.8)
汇编 将.s生成.o文件(二进制文件) ——>
.o
as main.s -o main.o
链接 主要是链接库文件(库函数)—>生成可执行文件
ld main.o -I 指定所有的头文件路径 -L 指定需要的库文件路径
elf相关命令
elf格式文件:就是linux/unix中常见的可执行文件格式(二进制文件格式)
补充命令:
readelf -h a.out(elf) 查看elf文件的头部信息 magic 魔数(标识的当前文件的类型的一串数据) machine/type readelf -a a.out(elf) 查看elf文件的全部信息 size a.out 查看对应的各个段的大小 nm a.out 查看符号表(表示各个段的开始和结束) 符号表的目的:表示编译的链接时,需要以何种方式进行链接
重要命令:
file a.out 查看文件的信息 strip a.out 瘦身命令(减小可执行程序的大小/删除的是静态库符号表) 注:不要对中间文件瘦身 objdump -d a.out 反汇编 我们可以去看init中的执行内容(是调用main函数等c语言执行内容) 注:当前会提供虚拟地址,如果可以知道问题的地址,我们可以通过地址找到执行位置(pc寄存器) objdump -D a.out 更加详细的信息(.dis表示反汇编文件后缀) objcopy 格式转换( 将elf格式文件转换为其他二进制格式) objcopy --gap-fill=0xff -O binary a.out main.bin 字节对齐填充为1 指明修改的格式 elf源文件 目标文件 objcopy --gap-fill=0xff -O srec a.out main.srec(摩托罗拉格式)
tftp服务器
文件传输服务器(网络)存储一些文件,提供给客户端下载
重启tftp服务器(监测当前是否包含tftp服务器)
sudo service tftpd-hpa restart
在线安装服务器
sudo apt-get install tftpd-hpa(tftp服务器端) tftp-hpa(tftp客户端)
配置(指定对应下载上传的目录)
sudo vi /etc/default/tftpd-hpa TFTP_USERNAME="tftp" tftp服务器的用户名 TFTP_DIRECTORY="/tftpboot" tftp的服务器目录(自行指定/自行创建/并且需要给目录最大权限) 注:最好tftp服务器目录放在根目录下 TFTP_ADDRESS="0.0.0.0:69" tftp协议地址,特定端口号 TFTP_OPTIONS="-c -s -l" tftp服务器权限选项(表示最大权限,可上传,可下载,可连接)
重启服务器生效当前配置
sudo service tftpd-hpa restart
本机测试
tftp + ip地址(发起连接的作为客户端) tftp 127.0.0.1 get + 文件名 上传 (上传文件为当前连接目录下的文件,上传位置为对应的tftp服务器目录) put +文件名 下载(从对应服务器目录中下载到当前路径) q 退出
nfs服务器(网络文件系统)
重启nfs服务器
sudo service nfs-kernel-server restart
在线安装
sudo apt-get install nfs-kernel-server
配置
sudo vi /etc/exports /source/rootfs *(rw,sync,no_subtree_check,no_root_squash)
指定目录(放文件系统) 可读可写
source/rootfs 需要自行创建并加最大权限重启nfs服务器
sudo service nfs-kernel-server restart