使用VSCode进行内核开发

Linux内核并没有任何官方IDE,所以大家都是各显神通,比较常见的就是使用Vim/Emacs结合各种插件,但这种方式普遍存在配置复杂和上手难度高的问题,我个人是不愿意浪费太多时间在IDE上的。碰巧有一款IDE,同样支持大量插件,并且社区活跃,它就是VSCode,所以今天就来看看如何通过各种插件将它打造为高效的内核开发IDE。

远程连接Linux服务器

我们要开发Linux内核,当然最好还是在Linux上进行,除非你的笔记本/台式机就是Linux系统,我们更多的还是使用Windows/Mac连接服务器来完成开发工作。

通过使用Remote - SSH插件,我们可以像在本地一样,在远程服务器上进行开发。

配置SSH连接

1
2
3
4
5
# <HOME>/.ssh/config

Host <IP or hostname>
HostName kernel-dev
User <username>

设置代码索引和代码补全

这一直是内核开发的老大难问题,因为内核源码过于庞大,以往的补全方案,要么速度快,但不精准,如ctags/cscope;要么精准,但速度慢,如C/C++ IntelliSense。

然而clangd插件的出现,非常好的解决了速度和精确性的问题,但它有一个强依赖:需要使用compile_commands.json来生成索引数据。好在内核源码树中已经有工具可以为我们生成compile_commands.json

  1. 安装clangd

    1
    sudo apt install clangd
  2. 生成compile_commands.json

    首先我们需要对内核或模块进行编译,编译成功后,在编译目录执行以下命令

    1
    ./scripts/clang-tools/gen_compile_commands.py

    打开compile_commands.json,确认不为空。

  3. 配置clangd插件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # Settings > Remote > Extensions > clangd > Arguments

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

    注意最后的-j=8是clangd在生成索引所创建的进程数,通常设置为CPU数量。

  4. 配置工程

    因为clangd使用clang来编译每个文件,如果我们的内核是使用GCC编译的,就会存在一些clang无法识别的编译选项,这些编译选项通常是用来进行代码优化的,所以去掉也不会影响代码索引。

    在VSCode中执行命令>clangd: Open project configuration file,打开.clangd文件,加入以下内容

    1
    2
    3
    4
    CompileFlags:
    Remove:
    - -m*
    - -f*
  5. 重启clangd

    在VSCode中执行命令>clangd: Restart language server

配置汇编代码高亮

做内核开发时,难免会涉及到一些汇编文件,但是VSCode默认并不对汇编文件进行高亮,因此需要安装插件来解决。

显示代码历史git commit

使用git blame是经常使用的“甩锅”手段,通过GitLens插件,我们可以实时看到每一行代码来自哪个commit。

配置Vim快捷键

我个人并不是Vim的狂热粉丝,但是Vim的快捷键设定,确实可以让我在大部分时间脱离鼠标和触控板,提高开发效率。通过安装Vim插件,即可立即享受大部分Vim的快捷键操作。

参考

https://github.com/clangd/clangd/issues/662

https://stackoverflow.com/questions/49198816/how-to-use-the-visual-studio-code-to-navigate-linux-kernel-source