开发板 Ping 不通虚拟机和主机
Ubuntu Linux 内核降级或升级到指定版本,更新引导
Ubuntu Linux内核降级或升级到指定版本,更新引导 - 云吱 - 博客园
NFS下载文件报错
Ubuntu 22.04版本无法挂载NFS V2的解决方法-OpenEdv-开源电子网
u-boot NFS下载文件报错:Loading: *** ERROR: File lookup fail解决方法-CSDN博客
vscode免密连接ubuntu虚拟机
ubuntu 图形界面配置 Clash
ubuntu 安装特定版本 gcc
正点原子 Linux 内核编译错误
vscode 远程连接虚拟机可双向 ping 通却无法写入指定的管道
参考 【linux】VSCode连接VMware Linux 过程试图写入的管道不存在_linux_松鼠不吃桂鱼-华为开发者空间
- 原因 :known_hosts 文件内容没有更新
如果 ssh 重新生成密钥后,之前 known_hosts 文件内容没有更新,又不会自动覆盖,需要把该文件内容清空。
- 解决
C:\Users\gdfangxy. ssh(主机内 SSH 的地址,每个人不同)内的 known_hosts 文件,清除文件内的所有内容,再重新连接。
vscode 远程连接基于clangd实现内核/外部代码跳转
参考实现
vscode 中 clangd 忽略 gcc 参数爆错
在建立阅读外部代码的环境时 ?为什么需要把内核目录保存为工作区之后,再把外部代码添加到工作区呢?
1. 内核与驱动的依赖关系
驱动程序依赖内核源码:驱动程序需要引用内核的头文件(如
linux/module.h
、linux/fs.h
等)和内核符号(如函数、结构体、宏定义等)。直接打开驱动目录的问题:如果仅单独打开驱动目录,VSCode 的代码分析工具(如 Clangd)会因为找不到内核头文件而无法正确解析代码,导致代码跳转、悬停提示等功能失效。
2. 工作区的作用
通过将内核目录保存为工作区,可以实现以下关键功能:
(1) 全局代码索引
Clangd 的索引范围:VSCode 的 Clangd 插件会基于工作区内的所有文件建立全局索引。
内核源码的覆盖:将内核目录加入工作区后,Clangd 会索引整个内核源码,包括头文件、函数定义、符号表等,使得驱动代码可以正确跳转到内核源码中的定义。
(2) 统一的编译配置
- compile_commands. json:该文件记录了每个源文件的编译参数(如头文件路径、宏定义等)。
- 内核的编译配置:内核目录的
compile_commands.json
包含了内核编译时的完整配置(如架构ARCH=arm
、交叉编译器路径等)。 - 驱动的编译配置:驱动目录的
compile_commands.json
需要与内核的编译配置保持一致(例如使用相同的交叉编译器arm-buildroot-linux-gnueabihf-gcc
)。
(3) 跨目录依赖解析
头文件路径解析:驱动代码中可能包含如下头文件引用:
#include <linux/module.h> // 内核头文件
如果内核目录不在工作区中,Clangd 将无法找到这些头文件的实际路径。
(4) 避免路径冲突
相对路径与绝对路径:内核和驱动可能分布在不同的目录中(例如内核在
/home/book/linux-kernel
,驱动在/home/book/drivers
)。工作区统一管理:通过工作区将两者绑定,Clangd 可以自动处理跨目录的路径关系,无需手动配置头文件路径。
3. 操作步骤的意义
根据文章中的步骤,具体逻辑如下:
4.1 创建内核工作区
- 目的:将内核源码目录作为工作区的根目录,确保 Clangd 能索引整个内核源码。
- 操作:在 VSCode 中打开内核目录,保存为
.code-workspace
文件。
4.2 将驱动目录加入工作区
编译驱动生成
compile_commands.json
:cd /home/book/nfs_rootfs/drivers_projects/01_hello_drv/
bear make # 生成 compile_commands. json
bear
会记录make
编译时的命令,生成驱动代码的编译配置。
修改
compile_commands.json
:将文件中的编译器
"cc"
替换为交叉编译器"arm-buildroot-linux-gnueabihf-gcc"
。原因:驱动代码需要针对 ARM 架构交叉编译,确保 Clangd 使用正确的编译器解析代码。
将驱动目录加入工作区:
在 VSCode 中通过 File > Add Folder to Workspace 添加驱动目录。
效果:工作区现在包含内核和驱动两个目录,Clangd 会同时索引两者的代码。
4.3 验证
代码跳转:在驱动代码中按住
Ctrl
点击内核头文件(如#include <linux/module.h>
),应能跳转到内核源码中的定义。悬停提示:将鼠标悬停在函数或变量上,显示其定义和注释。
4. 不保存工作区的后果
如果直接打开驱动目录而不包含内核目录,会出现以下问题:
头文件找不到:Clangd 无法解析
#include <linux/...>
的头文件路径,导致代码飘红(报错)。符号无法跳转:无法跳转到内核中的函数或结构体定义。
编译配置冲突:驱动的
compile_commands.json
可能使用默认的本地编译器(如gcc
),而非交叉编译器,导致代码语义分析错误。
5. 总结
保存内核目录为工作区:是为了让代码分析工具(如 Clangd)能够访问内核源码,建立全局索引。
添加驱动目录到工作区:确保驱动代码能正确引用内核头文件,并使用交叉编译器的配置。
修改
compile_commands.json
:解决架构和编译器不一致的问题,保证代码分析的准确性。
通过这种方式,VSCode 可以像本地开发环境一样高效地处理嵌入式内核和驱动的开发!