VSCode作为Linux kernel源码的开发环境

 

接下来我们就来安装配置VSCode环境,实现更加高效的阅读Kernel源码的目标,利用clangd+compile_commands.json还可以实现精确跳转,阅读代码从未如此高效。

顺便说一下,VSCode有一个强大的远程开发功能,可以实现浏览、编辑远程服务器上的代码,就如同本地一样。

安装VSCode

安装VSCode很简单,下载安装包之后,双击即可安装。下载地址如下
code.visualstudio.co...

下面使用命令行进行安装:

wget https://vscode.download.prss.microsoft.com/dbazure/download/stable/848b80aeb52026648a8ff9f7c45a9b0a80641e2e/code_1.100.2-1747260578_amd64.deb
sudo dpkg -i code_1.100.2-1747260578_amd64.deb

一路回车即可安装完成

安装clangd和clangd插件

我们实现精确跳转就是利用clangd和VSCode中的clangd插件完成的

安装clangd

sudo apt install clangd -y

如果系统提供的不是13的版本,建议从github下载安装
github.com/clangd/cl...

VSCode中安装clangd插件

使用命令打开VSCode,然后在插件商店中搜索clangd并安装
enter image description here

生成compile_commands.json文件

在配置VSCode之前,我们先生成对应的compile_commands.json文件

cd linux-imx-4.14
export ARCH=arm
bear -- make zImage -j4

执行后会生成compile_commands.json文件。

配置clangd插件

打开vscode后,打开内核源码目录,在clangd插件配置中,添加如下,每个一行。

–compile-commands-dir=${workspaceFolder}
–background-index
–completion-style=detailed
–header-insertion=never
-log=info

也可以配置在settings.json文件中,内容如下

{
    "C_Cpp.default.intelliSenseMode": "linux-gcc-arm",
    "C_Cpp.intelliSenseEngine": "disabled",
    "clangd.path": "/usr/bin/clangd",
    "clangd.arguments": [
        "--log=verbose",
        "--compile-commands-dir=${workspaceFolder}",
        "--background-index",
        "--pretty",
        "--completion-style=detailed",
        "--header-insertion=never"
    ],
}

不同CPU构架有区别,在workspace目录下创建一个.clangd文件,ARM32平台使用下面配置

CompileFlags:
  Add: --target=armv7-a

ARM64位平使用下面的配置

CompileFlags:
  Add: --target=aarch64-linux-gnu
  Remove: -mabi=lp64
CompileFlags: 
  Add:
  [
    "-I/usr/src/linux-headers-5.15.0-46/", # 配置linux源码目录
    "-I./include", # 配置包含目录
    "-DDEBUG", # 配置宏,方便调试模式切换
    "-Wunused-result", # 配置 clang 参数
  ]
  Remove: # 移除 clang 编译时的参数,因为clangd会使用compile_commands.json这个文件的编译参数,但是这个文件是gcc适用的,所以需要移除clang不适用的参数
  [
    "-mpreferred-stack-boundary*",
    "-mindirect-branch=thunk-extern",
    "-mindirect-branch-register",
    "-mfunction-return=thunk-extern",
    "-fno-allow-store-data-races",
    "-fconserve-stack",
    "-mrecord-mcount",
  ]
  Compiler: clang # 注意,内核使用的是gcc来编译代码的,但是此处配置的是使用clang来编译llvm IR进行语法提示,两者是不一样的

Diagnostics:
  ClangTidy:
    CheckOptions:
      readability-identifier-naming.VariableCase: CamelCase

禁用C/C++ extension有代码跳转功能的相关插件,否则与clangd可能有冲突。
作者:SteveChen  创建时间:2025-05-22 09:54
最后编辑:SteveChen  更新时间:2025-05-24 10:08
上一篇:
下一篇: