4、驱动开发环境搭建:交叉编译工具链安装、Linux内核源码获取与配置、Windows WDK安装、虚拟机与目标机调试环境
说实话,驱动开发这事儿,七分靠环境,三分靠代码。我见过太多新手,代码写得挺溜,结果卡在环境搭建上,一卡就是好几天。今天咱们就把这四块硬骨头啃下来:交叉编译工具链、Linux内核源码、Windows WDK,还有虚拟机调试环境。
4.1 交叉编译工具链安装
工控机嘛,目标硬件往往是ARM、MIPS或者x86嵌入式平台。你不可能在目标机上写代码、编译——那玩意儿资源太有限了。所以得用交叉编译:在PC上编译,生成目标机可执行的二进制文件。
我个人习惯用Linaro提供的GCC工具链,稳定,社区活跃。以ARM Cortex-A系列为例:
# 下载ARM交叉编译工具链
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 -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/
# 配置环境变量
export PATH=/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
~/.bashrc 或 /etc/profile 里,省得每次开终端都要 export 一遍。我一般会在 /opt 下建个 toolchains 目录,把所有交叉工具链都放一起,方便管理。
验证安装是否成功:
arm-linux-gnueabihf-gcc --version
看到版本号就对了。嗯,这里要注意:不同内核版本对GCC版本有要求。比如Linux 4.19内核,建议用GCC 7.x或8.x。太新的GCC可能会编译出奇怪的问题。
4.2 Linux内核源码获取与配置
驱动开发离不开内核源码。你想想看,驱动本质上就是内核的一个模块,你得知道内核提供了哪些接口、数据结构长什么样。
获取内核源码,我推荐两种方式:
- 从kernel.org下载官方主线版本——适合学习、通用开发
- 从板卡厂商获取BSP内核——适合实际项目,因为厂商已经做了适配
# 下载Linux 5.10 LTS版本
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.100.tar.xz
# 解压
tar -xvf linux-5.10.100.tar.xz -C /home/user/kernel/
# 进入源码目录
cd /home/user/kernel/linux-5.10.100
配置内核,说白了就是告诉内核:你要支持哪些硬件、哪些功能。有三种方式:
| 命令 | 说明 | 适用场景 |
|---|---|---|
make menuconfig |
基于ncurses的文本菜单界面 | 最常用,SSH远程也能用 |
make xconfig |
基于Qt的图形界面 | 需要图形桌面环境 |
make defconfig |
使用默认配置 | 快速开始,再手动微调 |
我个人习惯用 make menuconfig。为什么?因为工控机开发经常在服务器上搞,没图形界面。menuconfig虽然看着土,但够用。
# 先加载默认配置
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- defconfig
# 然后手动配置
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
CONFIG_MODULES=y 打开。否则你编译的驱动模块根本加载不进去。我刚开始学的时候犯过这个错,编译了半天,insmod 一直报错,后来才发现内核根本没开模块支持。
4.3 Windows WDK安装
别以为工控机只有Linux。很多PLC、运动控制器、数据采集卡,它们的上位机驱动还是得跑在Windows上。这时候就需要WDK(Windows Driver Kit)。
WDK的安装步骤:
- 先装Visual Studio 2019或2022(社区版就行)
- 再装Windows SDK(WDK依赖它)
- 最后装WDK
安装顺序不能乱。我见过有人先装WDK再装VS,结果驱动项目模板死活出不来。
WDK装好后,你会得到几个关键工具:
- devcon——设备管理命令行工具,比设备管理器好用
- inf2cat——驱动签名工具
- verifier——驱动验证器,检查驱动有没有内存泄漏、违规操作
说实话,Windows驱动开发比Linux麻烦不少。光是签名认证就能折腾死人。但工控行业里,Windows的生态确实成熟,很多工业软件只支持Windows。
4.4 虚拟机与目标机调试环境
驱动开发最怕什么?怕把目标机搞死机。尤其是工控机,现场跑着产线,你一个蓝屏或内核panic,老板能把你吃了。所以,调试环境必须独立。
我推荐用虚拟机做调试目标机。具体方案:
| 组件 | 推荐方案 | 说明 |
|---|---|---|
| 虚拟机软件 | VMware Workstation 或 VirtualBox | VMware性能好,VirtualBox免费 |
| 目标OS | Ubuntu Server 或 Debian | 轻量,适合嵌入式模拟 |
| 网络模式 | 桥接模式 | 让虚拟机跟主机在同一网段 |
| 调试方式 | SSH + NFS + KGDB | 远程调试,不用来回插拔 |
搭建步骤:
- 在VMware里装好Ubuntu Server,分配2核CPU、4GB内存
- 配置桥接网络,让虚拟机IP跟主机在同一网段
- 在虚拟机上安装SSH服务:
sudo apt install openssh-server - 在主机上通过SSH连接虚拟机:
ssh user@192.168.1.100
我曾经在一个项目里,目标机是ARM工控板,跑在产线上。每次调试都要把板子拆下来,接串口线,改完再装回去。后来我搭了虚拟机环境,先在虚拟机上验证逻辑,没问题了再部署到真机上。效率提升了好几倍。
好了,环境搭建这块就这些。工具链、内核源码、WDK、虚拟机调试环境,这四个东西配齐了,你就能安心写驱动了。下一章咱们开始真正动手,写第一个字符设备驱动。