嵌入式开发通常使用主机-开发板的开发模式,在裸板开发中,我们通常使用串口调试工具传递文件,比如windows平台的超级终端,SecuCRT以及Linux平台的ckermit(题外话:ckermit比windows的那两个快多了)。但在OS的开发环境中,由于程序复杂,规模巨大,串口的低速和易错就不再适合我们开发了,而在这种环境下,基于网络的开发环境由于高速和准确受到了大家的青睐。
结构说明在有OS的嵌入式系统中,SoC的启动过程有3个加载。
上电的第一个程序就是片上固化的启动代码,它负责把bootloader从Flash中加载到内存中并执行
bootloader会从Flash中加载Linux内核以及设备树文件到内存,并对两者进行相关的配置。完成所有工作后跳转到内核的首地址
内核接管bootloader配置好的硬件资源,内核启动过程中非常重要的一件事就是挂载文件系统。
在开发过程中,由于bootloader通常都具有网络功能,而linux内核,设备树dts和文件系统fs都是不断迭代的,所以我们自然希望通过配置bootloader的网络功能使其直接通过服务器(开发主机)下载内核并进一步下载设备树文件(tftp),甚至直接挂接网络上的文件系统(nfs)。整个开发环境的结构框图如下:
tftp即tiny ftp,是一种轻型的ftp协议,Ubuntu下可以使用下面这个小脚本安装并配置。
#!/bin/bash echo "Please input tftpdir" read tftpdir sudo mkdir $tftpdir #创建用于传输文件的目录 sudo chmod 0777 $tftpdir sudo apt-get install tftp-hpa tftpd-hpa xinetd -y #sudo vi /etc/default/tftp-hpa sudo touch /etc/default/tftpd-hpa sudo chmod 0777 /etc/default/tftpd-hpa sudo echo "TFTP_USERNAME=\"tftp\"" > /etc/default/tftpd-hpa sudo echo "TFTP_DIRECTORY=\"$tftpdir\"" >> /etc/default/tftpd-hpa #tftpd-hpa的服务目录,这个想建立在哪里都行 sudo echo "TFTP_ADDRESS=\"0.0.0.0:69\"" >> /etc/default/tftpd-hpa #指定开发板地址,需要和主机的ip在同一个网段 sudo echo "TFTP_OPTIONS=\"-l -c -s\"" >> /etc/default/tftpd-hpa #-c是可以上传文件的参数,-s是指定tftpd-hpa服务目录,上面已指定 sudo service tftpd-hpa restart echo -e '\n' nfs的安装和配置nfs即network filesystem,可以使客户端直接从服务器挂接文件系统,方便开发板直接访问我们的程序或文件。nfs的安装和配置脚本
#!/bin/bash echo "nfs service" echo "Please input nfs dir" read nfsdir sudo mkdir $nfsdir sudo apt-get install nfs-kernel-server nfs-common portmap -y #sudo vi /etc/exports sudo touch /etc/exports sudo chmod 0777 /etc/exports sudo echo "$nfsdir *(rw,sync,no_subtree_check,no_root_squash)" > /etc/exports sudo service nfs-kernel-server restart echo -e '\n'export文件的属性选项
ro 只读访问 rw 读写访问 sync 所有数据在请求时写入共享 async nfs在写入数据前可以响应请求 secure nfs通过1024以下的安全TCP/IP端口发送 insecure nfs通过1024以上的端口发送 wdelay 如果多个用户要写入nfs目录,则归组写入(默认) no_wdelay 如果多个用户要写入nfs目录,则立即写入,当使用async时,无需此设置 hide 在nfs共享目录中不共享其子目录 no_hide 共享nfs目录的子目录 subtree_check 如果共享/usr/bin之类的子目录时,强制nfs检查父目录的权限(默认) no_subtree_check 不检查父目录权限 all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录 no_all_squash 保留共享文件的UID和GID(默认) root_squash 用户的所有请求映射成如anonymous用户一样的权限(默认) no_root_squash root用户具有根目录的完全管理访问权限 anonuid=xxx 指定nfs服务器/etc/passwd文件中匿名用户的UID anongid=xxx 指定nfs服务器/etc/passwd文件中匿名用户的GID安装完毕可以使用下面的命令测试一下
$sudo mount -t nfs localhost:/home/jiang/nfs /mnt/ #localhost后面接的是nfs共享目录 $ls /mnt/ 1.txt #如果能看到nfs里面的1.txt就表示挂接成功了,nfs服务器没有问题 $sudo unmount /mnt/ uboot环境配置