什么是nfs?嵌入式软件开发为什么要用到nfs 这个工具_7天实现基于嵌入式开发板的云计算平台搭建!第一步,移植操作系统...

我是张权,今日起正式入驻达尔闻,将给大家分享我在嵌入式系列研究的经验和成果。

1704c8a9d78d09a4aec8e4b747a86b94.png

> 复旦大学微电子在读硕士

> 从事数字芯片设计及嵌入式系统开发研究

> 擅长RISC-V指令集架构及AI处理器架构

> 树莓派爱好者

> 喜欢打篮球和慢跑

“ 跟着我一起,一步步操作,7天实现基于嵌入式开发板的驱动设计和云计算平台的搭建! 3篇超详细全文档攻略助你操作无障碍: 本篇教你完成操作系统的移植,第二篇是驱动的设计,第三篇用网页调用设计的驱动和扩展部分云计算平台的搭建! ”

正式进入今天分享的第一步,在开发板中移植一个操作系统和文件系统:

移植u-boot至SD卡

安装toolschain的命令:

tar ‐zxvf arm‐linux‐gcc‐4.5.1‐v6‐vfp‐20120301.tgz

在.bashrc文件里面添加工具链bin文件和lib文件路径:

db16f11c0b7cfe36846b1b870915b938.png

(点击可放大)

生成u-boot文件:

f7327d2049c84dab6269f9023b0b4e9d.png

观察看到没有../../u-boot.bin与../mkbl2两个文件,但是在../目录夹Makefile下找到以下命令可生成mkbl2与sd_fdisk,下一步考虑怎么生成u-boot.bin文件。

241082a60cdfb3d92870b9ed228a6efb.png

471397b61eba6a270eb65ec0366a537f.png

跳到../../目录夹下直接执行make all O=build发现有Error,如下图:

6336473c5b57c544acd78b936df3f91e.png

通过观看Makefile,感觉如下有些东西暂时没有配置,后面会再尝试确定:

807379ff2ea26877a3ce455cdb9176b2.png

下图可见config.mk基本奠定了此次编译的基调

df5affeed09ffa8335c81b4c2ac7de9c.png

Build uboot的步骤:

a)安装好toolchain (arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz)

b)设置好环境变量PATH,保证可以正常使用,PATH设置在bin目录下

c)配置 uboot 并编译

cd uboot_tiny4412make tiny4412_configmake

d) 编译 用于生成bl2 的工具

make ‐C sd_fuse

或者

cd sd_fusemake

在执行make过程中,发现即使路径设置正确,仍爆出No such file or directory

经过debug发现是32位程序运行在64位系统的错误,参考以下解决:

# 确定有一个64架构的内核dpkg ‐‐print‐architecture# 结果会提示如下amd64# 确认打开多架构支持功能dpkg ‐‐print‐foreign‐architectures# 结果会如下提示i386# 打开多架构支持sudo dpkg ‐‐add‐architecture i386sudo apt‐get update# 检查拥有的库文件是否需要更新版本sudo apt‐get dist‐upgrade# 执行下面语句安装sudo apt‐get install lib32ncursesw5 lib32ncursesw5‐dev

接着发现无法调用动态链接库

144b24c5ca53e22a777bd1f11e51fa76.png

问题仍是64位系统不能调用32位的动态链接库,解决方法如下

sudo apt‐get install zlib1g:i386

之后买了一张8G的内存卡,用读卡器接到PC主机上,内存被识别为/dev/sdb

执行以下命令,烧入u-boot至内存卡中:

cd sd_fuse/tiny4412./sd_fusing.sh /dev/sdb

9b94b34c45f90e1f91ca134c1290fd40.png

启动设备后,第一次没有看到虚拟机有任何反应,并没有进入到uboot终端,经考虑发现需要串口工具(原谅我第一次接触嵌入式系统开发,有点蠢),之后选用IPOP作为串口调试工具,并安装相关驱动

50b39cdeb24fb5fbeb7e4b03d47985c7.png

之后会看到如下交互界面:

78ce51c070862a33000172725c9c57c0.png

每一次烧写都要重拔USB

d569d08f20b192761aee101a5560dc43.png

将u-boot移植至emmc

首先需要格式化emmc,u-boot模式下输入以下指令来格式化emmc设备

>fdisk ‐c 1 320 2057 520

执行后会返回分区信息,继续格式化分区,需要注意第一分区是fat格式化,分区2,3,4作ext3格式化,至此格式化完成。

>fatformat mmc 1:1>ext3format mmc 1:2>ext3format mmc 1:3>ext3format mmc 1:4

然后需要下载固件到开发板内存中。首先打开emmc设备,u-boot下输入:

>emmc open 1eMMC OPEN Success.!!!!!Notice!!!!You must close eMMC boot Partition after all image writing!!eMMC boot partition has continuity at image writing time.!!So, Do not close boot partition, Before, all images is written.!

上面提示emmc开启成功,注意说明,emmc一旦打开,需要连续烧录,烧录完成后可以关闭emmc。

接下来运行dnw,u-boot下面输入:

>dnwOTG cable Connected!Now, Waiting for DNW to transmit data

提示等待数据输入,这里就是等待我们从PC端通过DNW传送数据过来。

此时在PC端加载到E4412_N.bl1.bin目录夹下,确认bl1.bin已经烧进去了,但是执行mmc write 1 0xc0000000 0x10没有反应,是为什么?

f65c50208f8a01429911dfcc90df9711.png

是因为我在上面少了一个0

mmc write 1 0xc0000000 0 0x10

之后同理,将bl2.bin, u-boot.bin, E4412_tzsw.bin加载进emmc

Board: emmc open 1Board: dnwPC : sudo dnw sd_fuse/tiny4412/E4412_N.bl1.binBoard: mmc write 1 0xc0000000 0 0x10Board: dnwPC : sudo dnw sd_fuse/bl2.binBoard: mmc write 1 0xc0000000 0x10 0x1CBoard: dnwPC : sudo dnw u‐boot.binBoard: mmc write 1 0xc0000000 0x30 0x21DBoard: dnwPC : sudo dnw sd_fuse/tiny4412/E4412_tzsw.binBoard: mmc write 1 0xc0000000 0x2c0 0xB8Board: emmc close 1

编译内核

tar xzf linux‐3.5‐20150929.tgzcd linux‐3.5/cp tiny4412_linux_defconfig .config(如果不执行这一步会遇到很多莫名的错误)make menuconfig:去掉 Support TrustZone‐enabled Trusted Execution Environmentmake zImage

在运行make zImage时遇到三个没有找到头文件的问题,这里直接从其他路径下复制过来即可解决

7d9a6c906a382e64faa26b38077ee32c.png

0f19d275ff0fbf4a05159c2734652d34.png

然后又遇到以下问题

9fba36193a3939155ce2a1dcec557ff3.png

经在网上查询得知,是因为perl版本升级到了v5.22.1,将defined(@array)去掉了,可以直接使用数组判断非空。将if (!defined(@val))改为if (!@val),再次编译就 OK。

在编译mkfs_ext2.c文件的时候,会遇到没有ext2_fs.h的问题,里面许多宏和结构变量无法使用,这里我从工具链中将头文件放在内核根目录include子目录下直接调用

5782aad81848865a7962c7b51a457b8d.png

19369d17c3484e5c713e1f7d7e9d34f7.png

8bd6e86a42a7d3a00fc81dbfe55cfeca.png

最终内核编译结果如下

8c2ccf9831bc82fa654bdb886e9406b1.png

制作根文件系统

一、根文件系统创建

1、编译、安装busybox

tar xzf busybox‐1.17.2‐20101120.tgzmake menuconfig :添加交叉编译选项(arm‐linux‐) //也可以通过修改Makefile实现makemake CONFIG_PREFIX=/work/nfs_root/francis_linux_fs install

2、安装链接库

找到工具链下的库的目录并将lib库复制粘贴到自己的根文件系统中

mkdir libmkdir usr/libcd /opt/FriendlyARM/toolschain/4.5.1/arm‐none‐linux‐gnueabi/sys‐root/usr/libcp *so* /work/nfs_root/francis_linux_fs/usr/lib ‐dcd /opt/FriendlyARM/toolschain/4.5.1/arm‐none‐linux‐gnueabi/sys‐root/libcp *so* /work/nfs_root/francis_linux_fs/lib ‐d

3、构建etc目录

在etc目录下创建inttab文件,内容如下:

# /etc/inittab::sysinit:/etc/init.d/rcS //初始化执行rcS文件console::askfirst:‐/bin/sh::ctrlaltdel:/sbin/reboot //重启指令::shutdown:/bin/umount ‐a ‐r // 关机

在etc目录夹下继续创建init.d文件夹,并在init.d目录下创建rcS脚本文件,文件内容如下:

#!/bin/shmount ‐amkdir /dev/ptsmount ‐t devpts devpts /dev/ptsecho /sbin/mdev > /proc/sys/kernel/hotplug

在rcS里面可以添加:

#PATH变量PATH=/sbin:/bin:/usr/sbin:/usr/binrunlevel=S //单用户模式prelevel=Numask 022 //决定用户创建目录夹的权限,加起来为666export PATH runlevel prelevelmount ‐a //挂载所有应该被挂载的文件系统,这些文件以及格式包含在fstab里面/bin/hostname ‐F /etc/sysconfig/HOSTNAME //设置主机名ifconfig eth0 xxx.xxx.xxx.xxx //设置 ip地址

并给这个文件加上可执行权限:chmod +x rcS

在etc目录下创建fstab文件,内容如下:

# device mount‐point type options dump fsck orderproc /proc proc defaults 0 0tmpfs /tmp tmpfs defaults 0 0sysfs /sys sysfs defaults 0 0tmpfs /dev tmpfs defaults 0 0

4、构建dev目录

在这个目录下添加两个设备文件:console和null文件,执行以下命令

sudo mknod console c 5 1sudo mknod null c 1 3

5、构建其他目录

mkdir proc sys tmp mnt root

二、根文件系统镜像文件制作

dd if=/dev/zero of=francis_linux_fs_64M.img bs=1M count=64sudo losetup /dev/loop0 francis_linux_fs_64M.imgsudo mkfs.ext4 /dev/loop0cd /work/nfs_root/francis_linux_fs/sudo mount /dev/loop0 /mntsudo cp * ‐rfd /mntsudo umount /mntsudo losetup ‐d /dev/loop0

通过fastboot烧写内核和根文件系统

1、fastboot指令的安装

sudo apt‐get updatesudo apt‐get install android‐tools‐fastboot

2、移植内核和根文件系统镜像

将开发板设置为emmc启动,在u-boot命令行模式下让开发板执行:fastboot

在PC机上(装有fastboot命令)执行下面命令下载内核和根文件系统镜像:

fastboot flash kernel zImagefastboot flash fat francis_linux_fs_64M.imgfastboot reboot

在u-boot下设置一下启动参数

set bootargs "root=/dev/mmcblk0p1 rootfstype=ext4 console=ttySAC0,115200init=/linuxrc ctp=2 lcd=S70"set bootcmd "movi read kernel 0 0x40008000; bootm 0x40008000"savefast

开发板挂接NFS文件系统

1、主机安装NFS服务

首先要确认linux主机是否安装有NFS服务

$ ls ‐al /etc/init.d/nfs‐kernel‐server // 查看是否存在nfs服务

如果没有需要手动安装nfs-kernel-server服务

$ sudo apt‐get install nfs‐kernel‐server

修改 /etc/exports 文件,增加需要挂在的目录 /mnt *(rw, sync),(其中/mnt是要被挂在的目录,*表示任何服务器,也可以写客户端的IP地址,(rw,sync)表示挂载文件系统时的策略,rw表示读写,sync表示同步进行IO操作,还有其他的一些选项async(非同步进行IO操作)),然后重启nfs服务

$ sudo /etc/init.d/nfs‐kernel‐server restart

2、确保主机,网关,开发板在同一网段

因为是在笔记本上操作,所以需要将准备三根网线和一个交换器,其中一根连接以太网,一根连接笔记本,最后一根连接开发板。

查询host主机ip作为serverip为192.168.100.107

fa72664bace2bb3b7578280fdb5b4a0a.png

随后查询笔记本ip作为网关为192.168.100.106

2ebf5f5c68b83fc4307bb13e84536015.png

ifconfig eth0 192.168.100.108# 设置网关route add default gw 192.168.100.106

之后在板子上执行以下命令进行挂载

$ sudo mount ‐o ‐nolock ‐t nfs 10.24.21.143:/home/edision/work/nfs_root/francis_linux_fs /test

fcd7fb9171414b7a10299fdd79beed1b.png

94b4e4b8b2212cb1cf590819fc335131.png

结果如上图所示,至此,7天实现嵌入式开饭云计算平台搭建的第一步移植操作系统就完成了。

步骤很详细,祝你成功,如在移植过程中遇到问题,可以进达尔闻技术交流群找我。

第一步完成的老铁,可以进入第二篇,继续升级学习驱动的设计。93a3f5805b90b6097823a5f3f26619f3.png

21b8345aa7cc6b96168d04ee8c74b40c.png

11d0ff24ea7555361cb8b567f417dc6c.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值