2026/1/10 11:57:38
网站建设
项目流程
联盟网站做的最好,app立即打开,门户型网站特点,养殖网站 模板QEMU 执行第一个驱动#xff08;hello_drv.ko#xff09;全过程总结
核心流程#xff1a;获取源码 → 设置工具链 → 编译内核 / 设备树 → 编译驱动 → 部署驱动到 QEMU 根文件系统 → 启动 QEMU 加载测试驱动#xff0c;全程在主机 Ubuntu 操作#xff0c;QEMU 仅负责运…QEMU 执行第一个驱动hello_drv.ko全过程总结核心流程获取源码 → 设置工具链 → 编译内核 / 设备树 → 编译驱动 → 部署驱动到 QEMU 根文件系统 → 启动 QEMU 加载测试驱动全程在主机 Ubuntu 操作QEMU 仅负责运行验证。一、获取全套源码主机 Ubuntu 终端基础前提作用下载 QEMU 模拟器、内核、工具链等所有开发必需的源码后续编译、运行都依赖这些文件。# 1. 配置Git首次使用需设置邮箱和用户名可随意填book100ask:~$gitconfig --global user.emailabc123.combook100ask:~$gitconfig --global user.nameMyName# 2. 下载repo工具多仓库管理工具用于同步全套源码book100ask:~$gitclone https://e.coding.net/codebug8/repo.git# 3. 创建源码目录并进入book100ask:~$mkdir-p 100ask_imx6ull-qemu book100ask:~$cd100ask_imx6ull-qemu# 4. 初始化repo并关联源码仓库国内仓库下载更快book100ask:~/100ask_imx6ull-qemu$../repo/repo init -u https://e.coding.net/weidongshan/manifests.git -b linux-sdk -m imx6ull/100ask-imx6ull_qemu_release_v1.0.xml --no-repo-verify# 5. 同步源码4线程加速约10-30分钟中断后重新执行此命令续传book100ask:~/100ask_imx6ull-qemu$../repo/reposync-j4# 6. 下载QEMU模拟器镜像含启动脚本、根文件系统等book100ask:~$gitclone https://e.coding.net/weidongshan/ubuntu-18.04_imx6ul_qemu_system.git# 7. 验证源码是否下载成功查看目录内容book100ask:~$ls~/100ask_imx6ull-qemu# 应显示 buildroot2019.02、Linux-4.9.88、ToolChain 等目录book100ask:~$ls~/ubuntu-18.04_imx6ul_qemu_system# 应显示 imx6ul-system-image、qemu-imx6ull-gui.sh 等文件二、设置交叉编译工具链主机 Ubuntu 终端作用让主机能编译出 ARM 架构的内核、驱动适配 QEMU 模拟的 IMX6ULL1. 临时生效推荐小白仅当前终端有效# 添加交叉编译器路径到环境变量exportPATH$PATH:/home/book/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin# 指定目标架构为ARMexportARCHarm# 指定交叉编译器前缀exportCROSS_COMPILEarm-linux-gnueabihf-2. 永久生效可选重启终端仍有效# 编辑用户配置文件vi~/.bashrc# 在文件末尾添加以下3行保存退出按Esc→:wqexportARCHarmexportCROSS_COMPILEarm-linux-gnueabihf-exportPATH$PATH:/home/book/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin# 使配置生效source~/.bashrc验证工具链是否配置成功arm-linux-gnueabihf-gcc -v# 输出编译器版本信息即正常三、编译 QEMU 专用内核和设备树主机 Ubuntu 终端作用生成适配 QEMU 的内核zImage和硬件配置设备树.dtb驱动需依赖内核运行# 1. 进入内核源码目录cd~/100ask_imx6ull-qemu/linux-4.9.88# 2. 清理编译残留makemrproper# 3. 加载QEMU专用配置无需手动配置驱动make100ask_imx6ull_qemu_defconfig# 4. 编译内核镜像-j4按CPU核心数调整如-j8加速先执行nproc查看核心数nprocmakezImage -j4# 5. 编译设备树硬件配置文件makedtbs# 6. 替换QEMU原有的内核和设备树备份旧文件复制新文件cd~/ubuntu-18.04_imx6ul_qemu_system/imx6ul-system-imagemvzImage zImage_oldmv100ask_imx6ull_qemu.dtb 100ask_imx6ull_qemu.dtb_oldcp~/100ask_imx6ull-qemu/linux-4.9.88/arch/arm/boot/zImage ./cp~/100ask_imx6ull-qemu/linux-4.9.88/arch/arm/boot/dts/100ask_imx6ull_qemu.dtb ./四、编译第一个驱动hello_drv.ko主机 Ubuntu 终端作用将驱动源码编译为 ARM 架构的.ko 模块供 QEMU 加载1. 准备驱动文件# 1. 创建驱动目录并进入mkdir-p ~/nfs_rootfs/01_hello_drvcd~/nfs_rootfs/01_hello_drv# 2. 新建驱动源码hello_drv.c复制以下内容粘贴vihello_drv.c2. 新建 Makefile指定编译规则# 1. 使用不同的开发板内核时, 一定要修改KERN_DIR# 2. KERN_DIR中的内核要事先配置、编译, 为了能编译内核, 要先设置下列环境变量:# 2.1 ARCH, 比如: export ARCHarm64# 2.2 CROSS_COMPILE, 比如: export CROSS_COMPILEaarch64-linux-gnu-# 2.3 PATH, 比如: export PATH$PATH:/home/book/100ask_roc-rk3399-pc/ToolChain-6.3.1/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin# 注意: 不同的开发板不同的编译器上述3个环境变量不一定相同,# 请参考各开发板的高级用户使用手册KERN_DIR/home/book/100ask_imx6ull-qemu/linux-4.9.88 all:make-C$(KERN_DIR)Mpwdmodules$(CROSS_COMPILE)gcc -o hello_drv_test hello_drv_test.c clean:make-C$(KERN_DIR)Mpwdmodules cleanrm-rf modules.orderrm-f hello_drv_test obj-mhello_drv.o ~ ~Makefile21L, 853C3. 编译驱动# 执行编译无报错则生成hello_drv.komake-j4五、部署驱动到 QEMU 根文件系统主机 Ubuntu 终端作用将编译好的驱动拷贝到 QEMU 的 “系统盘”rootfs.imgQEMU 启动后可访问# 1. 挂载QEMU根文件系统镜像rootfs.img到主机/mntsudomount-o loop ~/ubuntu-18.04_imx6ul_qemu_system/imx6ul-system-image/rootfs.img /mnt# 2. 拷贝驱动到QEMU的/root目录临时测试用方便查找sudocp~/nfs_rootfs/01_hello_drv/hello_drv.ko /mnt/root/sudocp~/nfs_rootfs/01_hello_drv/hello_drv_test /mnt/root/# 3. 卸载镜像必须执行否则镜像损坏sudoumount/mnt六、启动 QEMU 并加载测试驱动主机→QEMU 终端1. 启动 QEMU主机 Ubuntu 终端# 进入QEMU主目录启动带GUI的模拟器首次启动需安装SDL环境cd~/ubuntu-18.04_imx6ul_qemu_systemsudo./install_sdl.sh# 首次启动执行输入密码123456./qemu-imx6ull-gui.sh# QEMU启动后在登录界面输入root无需密码登录2. 加载驱动QEMU 终端root 用户# 1. 查看驱动文件是否存在ls/root/hello_drv.ko# 2. 加载驱动模块insmod /root/hello_drv.ko# 3. 验证驱动加载成功lsmod# 查看模块列表能看到hello_drvdmesg|tail# 查看内核打印显示hello_drv init success!cat/proc/devices3.运行程序驱动根据实际程序来./hello_drv_test七、关键注意事项所有编译操作需确保工具链已配置终端输入arm-linux-gnueabihf-gcc -v有版本输出则正常挂载 / 卸载 rootfs.img 时需保证无其他程序占用 /mnt 目录否则报错执行cd ~退出 /mnt 再卸载驱动加载报错 “Invalid module format”需确认内核版本一致主机内核目录执行make kernelreleaseQEMU 终端执行uname -r两者需相同QEMU 快捷键鼠标锁定按CtrlAltg解锁退出 QEMU 按Ctrla松开后按x若 QEMU 启动无 GUI需重新执行sudo ./install_sdl.sh安装 SDL 环境。最后谢谢阅读笔者记录驱动学习过程如有错误之处还请指正。