搭建阅读linux源码的舒适环境(vscode+clangd)

准备linux源码

linux官网下载源码压缩包

https://www.kernel.org/

解压

由于源码是经过两次压缩的,所以需要解压两次

复制代码
xz -d linux-6.14.7.tar.xz 

tar xvf linux-6.14.7.tar

编译内核

生成.config文件

假设是需要生成x86_64下的架构下的编译框架

bash 复制代码
cd ~/code/linux/linux-6.14.7/
make ARCH=x86_64 defconfig
bash 复制代码
sinizu@sinizu-GP65-Leopard-9SD ~/c/l/linux-6.14.7 [1]> make ARCH=x86_64 defconfig                                                                                                      (base) 
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/confdata.o
  HOSTCC  scripts/kconfig/expr.o
  LEX     scripts/kconfig/lexer.lex.c
  YACC    scripts/kconfig/parser.tab.[ch]
  HOSTCC  scripts/kconfig/lexer.lex.o
  HOSTCC  scripts/kconfig/menu.o
  HOSTCC  scripts/kconfig/parser.tab.o
  HOSTCC  scripts/kconfig/preprocess.o
  HOSTCC  scripts/kconfig/symbol.o
  HOSTCC  scripts/kconfig/util.o
  HOSTLD  scripts/kconfig/conf
*** Default configuration is based on 'x86_64_defconfig'
#
# configuration written to .config
#

查看.config文件,实际上就是内核的配置,是否要开启某些功能,这里咱们已经选择了默认的配置,如下所示

bash 复制代码
sinizu@sinizu-GP65-Leopard-9SD ~/c/l/linux-6.14.7> cat .config                                                                                                                         (base) 
#
# Automatically generated file; DO NOT EDIT.
# Linux/x86_64 6.14.7 Kernel Configuration
#
CONFIG_CC_VERSION_TEXT="gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0"
CONFIG_CC_IS_GCC=y
CONFIG_GCC_VERSION=130300
CONFIG_CLANG_VERSION=0
CONFIG_AS_IS_GNU=y
CONFIG_AS_VERSION=24200
CONFIG_LD_IS_BFD=y
CONFIG_LD_VERSION=24200
CONFIG_LLD_VERSION=0
CONFIG_RUSTC_VERSION=108600
CONFIG_RUSTC_LLVM_VERSION=190107
CONFIG_CC_CAN_LINK=y
CONFIG_CC_CAN_LINK_STATIC=y
CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y
CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y
CONFIG_TOOLS_SUPPORT_RELR=y
CONFIG_CC_HAS_ASM_INLINE=y
CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y
CONFIG_LD_CAN_USE_KEEP_IN_OVERLAY=y
CONFIG_RUSTC_HAS_COERCE_POINTEE=y
CONFIG_PAHOLE_VERSION=0
CONFIG_IRQ_WORK=y
CONFIG_BUILDTIME_TABLE_SORT=y
CONFIG_THREAD_INFO_IN_TASK=y

开始编译

由于内核项目中make工程已经提供了生成compile_commands.json文件的配置,所以可以直接使用,只需指定框架即可

bash 复制代码
make ARCH=x86_64 compile_commands.json                                                                                              
bash 复制代码
sinizu@sinizu-GP65-Leopard-9SD ~/c/l/linux-6.14.7> make ARCH=x86_64 compile_commands.json                                                                                              (base) 
  SYSHDR  arch/x86/include/generated/uapi/asm/unistd_32.h
  SYSHDR  arch/x86/include/generated/uapi/asm/unistd_64.h
  SYSHDR  arch/x86/include/generated/uapi/asm/unistd_x32.h
  SYSTBL  arch/x86/include/generated/asm/syscalls_32.h
  SYSHDR  arch/x86/include/generated/asm/unistd_32_ia32.h
  SYSHDR  arch/x86/include/generated/asm/unistd_64_x32.h
  SYSTBL  arch/x86/include/generated/asm/syscalls_64.h
  HOSTCC  arch/x86/tools/relocs_32.o
  HOSTCC  arch/x86/tools/relocs_64.o
  HOSTCC  arch/x86/tools/relocs_common.o
  HOSTLD  arch/x86/tools/relocs
  HOSTCC  scripts/selinux/mdp/mdp
  HOSTCC  scripts/kallsyms
  HOSTCC  scripts/sorttable

检查是否生产compile_command.json

bash 复制代码
...
  CC      arch/x86/pci/mmconfig_64.o
  CC      arch/x86/pci/direct.o
  CC      arch/x86/pci/mmconfig-shared.o
  CC      arch/x86/pci/fixup.o
  CC      arch/x86/pci/acpi.o
  CC      arch/x86/pci/legacy.o
  CC      arch/x86/pci/irq.o
  CC      arch/x86/pci/common.o
  CC      arch/x86/pci/early.o
  CC      arch/x86/pci/bus_numa.o
  CC      arch/x86/pci/amd_bus.o
  AR      arch/x86/pci/built-in.a
  CC      arch/x86/power/cpu.o
  CC      arch/x86/power/hibernate_64.o
  AS      arch/x86/power/hibernate_asm_64.o
  CC      arch/x86/power/hibernate.o
  AR      arch/x86/power/built-in.a
  CC      arch/x86/video/video-common.o
  AR      arch/x86/video/built-in.a
  AR      built-in.a
  AR      vmlinux.a
  GEN     compile_commands.json
sinizu@sinizu-GP65-Leopard-9SD ~/c/l/linux-6.14.7> ls -lh                                                                                                                              (base) 
总计 8.4M
drwxrwxr-x  23 sinizu sinizu 4.0K  5月 18 14:26 arch/
drwxrwxr-x   3 sinizu sinizu 4.0K  5月 21 20:12 block/
-rw-rw-r--   1 sinizu sinizu 238K  5月 21 20:27 built-in.a
drwxrwxr-x   2 sinizu sinizu 4.0K  5月 21 20:07 certs/
-rw-rw-r--   1 sinizu sinizu 6.8M  5月 21 20:27 compile_commands.json
-rw-rw-r--   1 sinizu sinizu  496  5月 18 14:26 COPYING
-rw-rw-r--   1 sinizu sinizu 104K  5月 18 14:26 CREDITS

可见编译参数的json文件已经生成。

准备vscode环境

下载vscode

https://code.visualstudio.com/

按照官网下载软件,并进行安装,安装过程略

安装clangd插件

插件市场搜索clangd,直接进行安装即可

准备clangd

安装clangd

github下载最新版本的clangd
https://github.com/clangd/clangd/releases/tag/18.1.3

解压将clangd的可执行文件配置到vscode中

假设解压后,我的clangd位于如下路径

bash 复制代码
/home/sinizu/clangd_18.1.3/bin/clangd

打开vscode,按下shift+ctrl+p,选择用户配置,如下所示

接下来,将如下的配置行写到配置的json文件中

bash 复制代码
"clangd.path": "/home/sinizu/clangd_18.1.3/bin/clangd",

大功告成

将linux文件夹打开,随便打开一个文件,可以看到clangd正在索引

等待索引完毕,就可以直接ctrl+鼠标左键进行代码跳转了!

其他说明

可选择的内核配置

  • 自行配置内核参数(图像界面)
bash 复制代码
make ARCH=x86_64 menuconfig  # 终端文本界面
# 或
make ARCH=x86_64 xconfig     # 图形界面(需安装 Qt)
  • 和当前操作系统一样的配置
bash 复制代码
cp /boot/config-$(uname -r) .config 

缺少工具安装

如果报错缺少工具(如 menuconfig),安装依赖:

bash 复制代码
sudo apt-get install build-essential ncurses-dev libssl-dev  # Ubuntu/Debian
# 或
sudo dnf install ncurses-devel openssl-devel                 # Fedora
相关推荐
琥珀色糖4 小时前
Linux守护进程
linux·终端·守护进程·会话·进程组
开心大爆炸7 小时前
xrdp 连接 登录对话框输入密码后闪退
linux·运维·服务器
oushaojun28 小时前
大厂 C++ 面试:深度剖析 Linux Signal 信号机制(转)
linux
苏生Susheng9 小时前
【软件实施】Linux系统Shell脚本教程
linux·运维·服务器·chrome·spring boot·学习·实施
Ruiery9 小时前
Linux 6.6内核 IOMMU 深度解析(七):DMA API 与 IOMMU 集成 — 从 dma_map_single 到 iommu_map
linux·运维·服务器
分支预测失败9 小时前
RISC-V AIA 中断架构实战:从 PLIC 到 APLIC 与 IMSIC 的迁移
linux·后端
GeW9 小时前
RHCE学习拿证计划:锁定核心考点,实现备考效率最大化
linux
snow@li9 小时前
服务器运维:Alibaba Cloud Linux 4 LTS 64位 根目录全景深度解析文章
linux·运维·服务器
苏生Susheng10 小时前
【软件实施】Linux企业运维常用命令手册
java·linux·运维·服务器·springboot·springcloud·软件实施
额额额对了10 小时前
Linux 进程间通信(IPC)核心机制:消息队列、共享内存与信号量详解
linux·网络·网络协议