十二、驱动开发环境准备

一、虚拟机安装和配置

1.由于想用Clangd实现Vscode + Clangd的代码精确跳转,所以需要一个较高的Linux内核版本,但是又不想系统占用太大的空间,因此操作系统镜像选择Debian-12服务器版。

2.虚拟机配置3个网卡,分别实现虚拟机与主机共享上网,主机连接虚拟机,开发板连接虚拟机:

ens33: NAT,用于与主机共享上网,IP地址自动配置。

ens37:Host-Only,用于主机连接虚拟机,实现SSH和Samba共享等功能,IP = 192.168.189.100

ens38:Brige(复制物理网络连接状态),与主机的有线网卡(USB网卡)+ 开发板组建局域网络。USB网卡静态IP = 192.168.1.1, 开发板网卡静态IP = 192.168.1.2, ens38网卡静态IP = 192.168.1.100。

由于我的主机电脑没有固定的有线网口,所以用的USB转接网口,其插拔会影响主机的网络状态,故单独组件了一个brige网络,以免其插拔影响到虚拟机上网功能或者主机与虚拟机的连接。这样就将三个作用不同的网络隔离开,它们相互隔离,一个网络出问题也不会影响到其它网络域的功能。

二、内核代码阅读环境

1.阅读代码使用Vscode + Source Insight双开:Vscode配合Clangd插件实现C语言代码精准跳转,SI用于阅读汇编以及分析函数调用上下文。

2.拷贝一份内核代码,单独对其进行编译,生成Vscode Clangd插件需要的信息,方便在阅读时进行C代码的精确跳转。

3.进入内核源码目录后,执行如下几个命令,编译linux内核源码:

bash 复制代码
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_alientek_emmc_defconfig
bear -- make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j2

编译完成之后会在内核源码顶层目录中生成compile_commands.json文件,clangd就使用这个文件里面保存的构建信息来实现C代码精准跳转。

使用bear -- make要比直接使用make编译要慢一些,因为要记录编译信息到compile_commands.json文件中。

4.windows上的Vscode安装Remote SSH插件和Clangd插件,并且需要给Debian12虚拟机也安装Clangd服务以及Vscode Server服务,具体方法可以参考其它专门的相关博客。

5.在windows系统上使用Vscode使用Remote SSH远程打开Debian12上刚刚编译的内核源码目录,如果Clangd工作正常,其会自动检测compile_commands.json文件,并实现代码点击精准跳转。

6.在linux内核源码根目录下新建.vscode文件夹,里面新增一个settings.json文件,输入不需要显示和检索的文件后缀如下:

bash 复制代码
{
    "search.exclude": {
        "**/*.o": true,
        "**/*.su": true,
        "**/*.cmd": true,
        "**/*.txt": true,
        "**/*.idx": true,
        "**/*.ihex": true,
    },
    "files.exclude": {
        "**/*.o": true,
        "**/*.su": true,
        "**/*.cmd": true,
        "**/*.txt": true,
        "**/*.idx": true,
        "**/*.ihex": true,
    }
}

这样可以排除掉一些非源码文件类型的干扰,让代码阅读工程更简洁。

7.在SI中新建Linux内核源码阅读工程,选择性添加源码目录和文件后缀,尽量减少无用的目录和文件,这样可以加快工程的同步和检索速度。

三、镜像引导启动

1.使用mfgtool工具将uboot烧录进EMMC后,设置开发板为从EMMC启动,进入uboot。

2.Linux内核镜像(也可从EMMC加载)和设备树通过TFTP下载,根文件系统使用NFS,所以uboot中的bootcmd和bootargs参数设置如下:

bash 复制代码
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000'
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.100:/home/david/share/nfs/rootfs,vers=3,tcp ip=192.168.1.2:192.168.1.100:192.168.1.1:255.255.255.0::eth0:on'
saveenv

由于debian12内核版本较高,其不支持NFS V2协议了,所以uboot中无法使用nfs命令下载文件。但是板子的linux内核支持NFS V3,所以仍然可以挂载网络文件系统,需要在挂载命令中加上vers=3的参数,显式指定使用NFS V3协议。

相关推荐
gwf21615 小时前
Completion Queue(CQ)与中断处理:轮询、中断聚合与错误码 —— 面向AI集群的驱动级深度剖析
驱动开发·性能调优·pcie·rdma·ai集群·中断聚合·cq
kakakahahahaha1 天前
Windows鼠标失灵排查:Ctrl Alt Delete、Mouse Keys、USB控制器与驱动修复
windows·驱动开发·电脑·笔记本电脑·软件需求
傲世仙尊1 天前
TCP报头全解-序号确认应答与可靠性是一个准数
驱动开发·网络协议·tcp/ip
sukalot2 天前
Windows 驱动实例分析系列:libwdi 驱动分析 - libwdi 篇(五)
windows·驱动开发
沫璃染墨2 天前
《从零入门Linux系统篇(五十六):线程篇·九——生产者消费者模型:从条件变量到BlockingQueue实现》
linux·服务器·c++·驱动开发·设计模式·架构·系统架构
傲世仙尊2 天前
UDP底层与守护进程化-报头结构体skbuff指针移动与自成会话
驱动开发·网络协议·udp
沫璃染墨3 天前
《从零入门Linux系统篇(五十四):线程篇·七——互斥锁底层原理:从原子交换到线程竞争与锁实现》
linux·运维·服务器·开发语言·c++·驱动开发·系统架构
海盗12344 天前
微软技术日报 2026-10-01:VS Code 1.140 让模型互相挑错,EWS 今天起关停
人工智能·驱动开发·microsoft·机器人·aigc
铅笔小新z4 天前
【stm32】SPI Flash 驱动开发
驱动开发·stm32·嵌入式硬件
夜听莺儿鸣4 天前
502-002_Linux驱动开发模块化编程
linux·驱动开发·模块化编程