![交叉编译armv7的tun/tap设备驱动](https://linux22.com/image/98730/%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91armv7%E7%9A%84tun%2Ftap%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8.png)
我有多个来自中国的基于 Hi3516A SOC 的网络摄像机。它们运行良好,我想使用 VPN 访问它们。我决定在相机上安装,tinc-vpn
因为我可以使用 telnet 完全访问相机的外壳。
好吧,使用 buildroot 我已经成功创建了交叉编译工具链并构建了tinc。但 tinc 需要支持 tun/tap 设备,而相机默认不支持这些设备。所以,使用dmesg
后uname -a
我发现,哪些相机使用Linux 3.4.35内核。我下载内核源代码,添加对 TUN/TAP 作为可加载内核模块的支持并编译它:
~$ make ARCH=arm CROSS_COMPILE=/opt/hisilicon/arm/usr/bin/arm-linux- defconfig
~$ make ARCH=arm CROSS_COMPILE=/opt/hisilicon/arm/usr/bin/arm-linux- menuconfig
# add building of TUN/TAP driver
~$ make ARCH=arm CROSS_COMPILE=/opt/hisilicon/arm/usr/bin/arm-linux- -k
内核编译良好,我将 tun.ko 放入我的相机中。执行后insmod ./tun.ko
我得到了
insmod: can't insert 'tun.ko': invalid module format
~ # dmesg | tail -n 1
tun: version magic '3.4.35 mod_unload ARMv5 p2v8 ' should be '3.4.35 mod_unload ARMv7 p2v8 '
谷歌搜索了一段时间我发现这解决方案。之后,模块成功加载,但随后我尝试读取或写入/dev/net/tun
执行崩溃,并出现分段错误,并且开始tincd
以未定义的错误结束。
那么,有什么想法可以为我的相机构建 TUN/TAP 驱动程序吗?
聚苯乙烯
~ # dmesg | head -n 10
Booting Linux on physical CPU 0
Linux version 3.4.35 (root@wang) (gcc version 4.8.3 20131202 (prerelease) (Hisilicon_v300) ) #3 Mon Aug 10 15:39:44 CST 2015
CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c53c7d
CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
Machine: hi3516a
Memory policy: ECC disabled, Data cache writeback
On node 0 totalpages: 32768
free_area_init_node: node 0, pgdat c04c0878, node_mem_map c04e0000
Normal zone: 256 pages used for memmap
Normal zone: 0 pages reserved
我使用相同版本的编译器和 Linux 内核
~ # cat /proc/cpuinfo
Processor : ARMv7 Processor rev 5 (v7l)
BogoMIPS : 1196.85
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 5
Hardware : hi3516a
Revision : 0000
Serial : 0000000000000000
我尝试使用 buildroot 为 ARM Cortex-A7 构建交叉编译并用它编译 linux 内核,但没有结果。
提前致谢。