写这篇文章,主要是为了记录一下工作中用到的一些技术、协议等等,随时填充一些细节,方便后续需要,不用再到处找资料了。如有错误的地方,希望各位大佬予以指教!
一、交叉开发模式介绍
在主机中编写代码、编译得到一个可执行文件,传输到ARM环境运行调试,出现bug返回linux修改代码编译再传输,这种在主机下开发,在开发板上运行的模式叫做交叉开发。
二、配置编译环境
设置交叉工具链 ,把下载好的工具链解压
tar -vxf gcc-4.6.4.tar.xz -C ~/usr/crosstools
设置环境变量
vim ~/.bashrc
export PATH=$PATH:/home/root/usr/crosstools/gcc-4.6.4/bin
更新脚本
source ~/.bashrc
三、运行开发板
一般做驱动开发(需要先将linux系统在开发板运行起来) 启动流程: 上电→BootLoader→内核→rootfs ,rootfs包括bin(命令)、sbin、etc(系统配置)、 lib(动态库)等。
1.通过tftp启动内核
将uImage(内核镜像文件)和dtb(设备树)文件放入linux中的/tftpboot
tftpboot目录的作用:将从tftp服务下载到开发板的程序存到这个目录下,当使用tftp服务下载程序时,tftp就会从tftpboot目录下查找你要下载的文件名。
在开发板上设置uboot参数,加载内核
set bootcmd tftp 0x83000000 uImage \; tftp 0x84000000 exynos4412-fs4412.dtb \; bootm 0x83000000 - 0x84000000
save
//tftp命令 将内核uImage下载到0x83000000 “;”为连续执行 将设备树dtb下载到0x84000000,
bootm在这个0x83000000启动内核,0x84000000读取数据,“-”表示预留一个ramdisk 目前没用到
bootm命令格式
bootm [image_addr] [ramdisk_addr] [dtb_addr]
set ipaddr //开发板设置ip
set serverip //linux ip
save
2.通过nfs挂载rootfs
需要rootfs系统目录-- rootfs.tar.xz,解压到/opt/rootfs
配置nfs服务器,目的是让/opt/rootfs可以被挂载
vim /etc/exports
/opt/rootfs *(subtree_check,rw,no_root_squash,async)
sudo service nfs-kernel-server restart //重启nfs服务器
测试是否配置成功
sudo mount -t nfs 192.168.xx.xx:/opt/rootfs /mnt
mount命令格式
mount [-参数] [设备名称] [挂载点]
[-参数] -t 指定设备的文件系统类型,例如nfs 网络文件系统、ext2 linux目前常用的文件系统
[挂载点]必须是一个已经存在的目录,挂载后这个目录下以前的内容将不可用,umount以后会恢复正常。
卸载挂载:
umount /mnt
在开发板中指定内核挂载/opt/rootfs--切换到开发板操作
set bootargs console=ttySAC1,115200 init=/linuxrc root=/dev/nfs rw nfsroot=192.168.10.21:/opt/rootfs ip=192.168.10.22
save
bootargs命令参数
bootargs是uboot传递给内核的启动参数
console=
控制台信息声明,console=ttySAC1,115200 表示控制台使用串口1,波特率115200。内核启动后会根据console=来初始化硬件,这里的传参会影响后续是否能从串口终端上接收到内核打印的信息
init=
告诉内核linux第一个用户进程是什么,一般init=/linuxrc,/linuxrc指的是/目录下面的linuxrc脚本,一般指向busybox。
root=
指定rootfs的位置,如果是基于nfs,则root=/dev/nfs。后面还需要指定nfsroot=serverip:nfs_dir,表示指明文件系统存在哪个主机的哪个目录下面。
ip=
设置系统启动之后内核的ip地址,开发基于nfs的文件系统,必须要有这个参数设置。属于静态分配ip。
至此整个编译环境以及开发板运行linux就搭建好了。