2. Modbus RTU从站设备接入与寄存器映射
任务说明
本案例目标是为工业IoT边缘网关搭建可运行的Linux系统环境。边缘网关通常基于ARM或x86平台,需要承载数据采集、协议转换、边缘计算等任务。我们采用最小化根文件系统方案,使用BusyBox提供核心用户态工具,通过内核模块加载支撑硬件驱动,并配置网络与启动流程,最终生成一个可通过QEMU启动验证的完整系统镜像。
系统架构与组成
构建步骤与实现
1. 准备交叉编译工具链
边缘网关通常资源受限,需在x86主机上交叉编译ARM目标代码。使用Linaro提供的ARM交叉工具链:
# 下载并解压工具链(约200MB)
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
tar -xf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
export PATH=$PWD/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH
# 验证工具链
arm-linux-gnueabihf-gcc --version
2. 编译Linux内核
# 下载内核源码
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.284.tar.xz
tar -xf linux-5.4.284.tar.xz
cd linux-5.4.284
# 使用vexpress开发板默认配置(包含网络、GPIO、串口驱动)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_defconfig
# 启用devtmpfs支持(自动创建设备节点)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
# 进入 Device Drivers → Generic Driver Options → 勾选 [*] Maintain a devtmpfs filesystem to mount at /dev
# 编译内核与设备树
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 zImage
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 dtbs
3. 构建BusyBox根文件系统
# 下载BusyBox
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar -xf busybox-1.36.1.tar.bz2
cd busybox-1.36.1
# 静态编译配置(避免动态库依赖)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
# 进入 Settings → Build Options → 勾选 [*] Build static binary (no shared libs)
# 编译并安装到临时目录
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- CONFIG_PREFIX=$PWD/_install install
4. 组装根文件系统目录结构
# 创建必要目录
cd _install
mkdir -p proc sys dev etc/init.d lib/modules
# 创建init脚本(PID 1进程)
cat > etc/init.d/rcS << 'EOF'
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev
echo "Edge Gateway Linux System Ready"
hostname edge-gw-01
ifconfig eth0 192.168.1.100 netmask 255.255.255.0 up
EOF
chmod +x etc/init.d/rcS
# 创建inittab
cat > etc/inittab << 'EOF'
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::ctrlaltdel:/sbin/reboot
EOF
# 打包为cpio归档
find . | cpio -H newc -o | gzip > ../rootfs.cpio.gz
5. 内核模块编译与集成
# 在内核源码目录编译模块
cd linux-5.4.284
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules -j4
# 安装模块到根文件系统目录
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=$PWD/../busybox-1.36.1/_install modules_install
验证方法
使用QEMU模拟vexpress-a9开发板,验证系统能否完整启动并进入shell:
# 启动QEMU(需提前安装:sudo apt install qemu-system-arm)
qemu-system-arm \
-M vexpress-a9 \
-m 256M \
-kernel linux-5.4.284/arch/arm/boot/zImage \
-dtb linux-5.4.284/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-initrd rootfs.cpio.gz \
-append "console=ttyAMA0 rdinit=/bin/sh" \
-nographic
判定标准:
- QEMU启动后串口输出内核日志,无panic错误;
- 进入shell提示符后,执行
cat /proc/cpuinfo能看到ARMv7 Processor信息; - 执行
ifconfig能看到eth0接口已配置IP 192.168.1.100; - 执行
ls /dev能看到ttyAMA0、mmcblk0等设备节点自动创建; - 执行
lsmod能列出已加载的内核模块。
关键文件清单
| 文件 | 说明 |
|---|---|
| linux-5.4.284/arch/arm/boot/zImage | ARM内核镜像 |
| linux-5.4.284/arch/arm/boot/dts/vexpress-v2p-ca9.dtb | 设备树二进制 |
| rootfs.cpio.gz | BusyBox根文件系统归档 |
| busybox-1.36.1/_install/etc/init.d/rcS | 系统初始化脚本 |
本案例构建的Linux系统环境为边缘网关提供了基础运行平台,后续案例可在此环境上部署采集程序、协议栈和远程管理服务。系统镜像约8MB,可烧录至SD卡或Flash运行于真实硬件。