准备linux源码

linux官网下载源码压缩包

https://www.kernel.org/

解压

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

xz -d linux-6.14.7.tar.xz
tar xvf linux-6.14.7.tar

编译内核

生成.config文件

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

cd ~/code/linux/linux-6.14.7/
make ARCH=x86_64 defconfig
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文件,实际上就是内核的配置,是否要开启某些功能,这里咱们已经选择了默认的配置,如下所示

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文件的配置,所以可以直接使用,只需指定框架即可

make ARCH=x86_64 compile_commands.json
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

...
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位于如下路径

/home/sinizu/clangd_18.1.3/bin/clangd

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



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

"clangd.path": "/home/sinizu/clangd_18.1.3/bin/clangd",

大功告成

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

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

其他说明

可选择的内核配置

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

缺少工具安装

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

sudo apt-get install build-essential ncurses-dev libssl-dev  # Ubuntu/Debian
# 或
sudo dnf install ncurses-devel openssl-devel # Fedora

搭建阅读linux源码的舒适环境(vscode+clangd)的更多相关文章

  1. linux源码阅读笔记 数组定义

    在阅读linux源码的过程中遇到了下面的略显奇怪的结构体数组定义. static struct hd_struct{ long start_sect; long nr_sects; }hd[10]={ ...

  2. Linux 源码阅读 进程管理

    Linux 源码阅读 进程管理 版本:2.6.24 1.准备知识 1.1 Linux系统中,进程是最小的调度单位: 1.2 PCB数据结构:task_struct (Location:linux-2. ...

  3. linux源码阅读笔记 asm函数

    在linux源码中经常遇到__asm__函数.它其实是函数asm的宏定义 #define __asm__ asm,asm函数让系统执行汇编语句. __asm__常常与__volatile__一起出现. ...

  4. 阅读 Android源码的一些姿势

    日常开发中怎么阅读源码 找到正确的源码 IDE 是日常经常用的东西,Eclipse 就不说了,直接从 Android Studio(基于 IntelliJ Community 版本改造)开始. 我们平 ...

  5. 如何阅读JDK源码

    JDK源码阅读笔记: https://github.com/kangjianwei/LearningJDK 如何阅读源码,是每个程序员需要面临的一项挑战. 为什么需要阅读源码?从实用性的角度来看,主要 ...

  6. 《大牛到底是如何阅读JDK源码的?》一起来学习一下

    前言: 如何阅读源码,是每个程序员需要面临的一项挑战,为什么需要阅读源码?从实用性的角度来看,主要有三个目的: 第一,解决手头的新问题或者新需求; 第二,真正理解一部分理论的落地实现; 第三,应对面试 ...

  7. 基于Docker的TensorFlow机器学习框架搭建和实例源码解读

    概述:基于Docker的TensorFlow机器学习框架搭建和实例源码解读,TensorFlow作为最火热的机器学习框架之一,Docker是的容器,可以很好的结合起来,为机器学习或者科研人员提供便捷的 ...

  8. 从linux源码看socket的阻塞和非阻塞

    从linux源码看socket的阻塞和非阻塞 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 大部分高性能网络框架采用的是非阻塞模式.笔者这次就从linux ...

  9. 从linux源码看socket(tcp)的timeout

    从linux源码看socket(tcp)的timeout 前言 网络编程中超时时间是一个重要但又容易被忽略的问题,对其的设置需要仔细斟酌.在经历了数次物理机宕机之后,笔者详细的考察了在网络编程(tcp ...

  10. 从Linux源码看Socket(TCP)的listen及连接队列

    从Linux源码看Socket(TCP)的listen及连接队列 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的角度看 ...

随机推荐

  1. Flink Watermark 不止可以用时间戳衡量

    https://mp.weixin.qq.com/s/L5PqtcmffCIq_CnUs0WS3g

  2. 探究高空视频全景AR技术的实现原理

    1. 引言 笔者认为现阶段AR技术的应用是还是比较坑爹的,大都是噱头多但是实用的成分少,拿出来做做DEMO是可以,但是难以在实际的项目中落地产生实际的经济价值.一方面是很难在业务上难以找到合适的应用场 ...

  3. python文件不显示cmd黑窗口,打包py,pyw文件为exe文件

    问题描述:编写的python文件为定时任务,需要长时间运行,但是打开的cmd黑色窗口看起来很不舒服,于是打包为exe文件,隐藏cmd黑色窗口 步骤:1.使用pip install pyinstalle ...

  4. 探秘Transformer系列之(10)--- 自注意力

    探秘Transformer系列之(10)--- 自注意力 目录 探秘Transformer系列之(10)--- 自注意力 0x00 概述 0x01 原理 1.1 设计思路 1.2 输入 1.3 QKV ...

  5. Dify 和 Manus 的技术架构差异

    Dify 框架能够部分实现 Manus 的功能效果,但在复杂任务自动化.多代理协作等领域存在技术差距. 一.核心功能对比 1. 任务拆解与执行能力 Dify:支持通过 Agent 模式 进行任务分解, ...

  6. C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  7. ModuleNotFoundError: No module named '_bz2'

    前言 运行 python 报错:ModuleNotFoundError: No module named '_bz2' when building python 解决 安装在 Ubuntu/Debia ...

  8. Linux指令详解之:ctl相关命令大礼包

    目录 6.4 服务管理命令(ctl大礼包) 6.4.1 systemctl 6.5.2 systemctl小结 6.5.3 timedatectl 6.5.4 localectl 6.5.5 netw ...

  9. Hyperledger Fabric - 链码部署

    前提条件 启动测试网络 ./network-myself.sh up 创建通道 ./network-myself.sh createChannel 智能合约(链码) pom.xml文件 配置远程仓库 ...

  10. 【AI工具实战】一招解决英文视频困境,四步用AI搞定全中文字幕,你也可以!(文末附工具下载)

    "AI时代最大的红利,是让每个人都有机会成为那个"想到就能做到"的创造者." AI粉嫩特攻队,2025年4月5日. 故事源于一个我想看的国外视频.本想点开视频准 ...