VSCode搭建内核源码阅读开发环境

news2024/11/16 13:26:42

0. 参考链接

使用VSCode进行linux内核代码阅读和开发_vscode阅读linux内核-CSDN博客

1. 搭建Linux内核源码阅读环境

现状,Linux内核源码比较庞大文件非常多,其中又包含的众多的宏定义开关配置选项,这使得阅读内核源代码称为一件头疼的事。

主要的解决防范有:

  1. 使用 文本浏览工具 + grep 命令来搜索内核源码,这种方式最简单,效率也最低
  2. 使用 SourceInsight 进行内核代码浏览,这种方式使用的人最多,但是在浏览内核源码文件时有多个硬件平台的头文件和源码配置,如果不做排除在进行符号跳转的时候往往会找到多个同名函数或定义。最重要的是 SourceInsight 是商业收费软件,需要付费购买才能使用。
  3. Vim + ctags ,这种方法比较高大上,但是比较适合Linux高手使用,对于初学者有可能玩不太转。
  4. VSCode + C++ Intellisense插件或者global插件,和SourceInsight类似,在源码符号跳转时往往会找到多个同名函数或定义。

阅读内核源码的主要痛点在于,查看一个内核函数或者宏,一个函数或宏对应着很多用 ‘#ifdef CONFIG_XXX’ 隔离起来的多个版本,并且在不同的硬件平台上又有不同的多种版本,造成我们不清楚当前开发的平台上到底使用的是哪一个内核函数版本。

新的方法

参考引用链接中的方法,可以使用 VSCode + RemoteSSH + Clangd 插件来构建内核源码阅读开发环境。其中 VSCode 作为强大的源码文本浏览编辑器,负责主题框架和显示。RemoteSSH访问远程服务器,实现远程代码的本地访问。Clangd 用于代码语义分析,代码补全,代码跳转等。该方案几乎克服了上面列出的几种方案的所有缺点,能够做到代码精准跳转,代码精准补全,其它的默认如代码颜色着色,代码缩进等都是VSCode自带的。另外,最重要的是这些是免费的。

除了 VSCode IDE 之外,该方案的核心是 Clangd 插件,clangd插件通过读取工程编译期间生成的 ompile_commands.json 文件来索引其中包含的源文件和关联的头文件,因此能避免所引导非编译代码造成的符号语义解析混乱。

compile_commands.json 文件就是由每个源文件的编译参数,路径等信息组成的一个json 文件,clangd 通过这个文件可以准确定位源文件引用的头文件从而精确的找到各种宏定义,函数,变量声明的准确值。

那么问题来了,编译内核的时候也没有生成 compile_commands.json 文件。在这文件在编译 cmake 工程的时候可以调用 cmake 命令时添加 -DMAKE_EXPORT_COMPILE_COMMANDS=on 参数,编译的时候回自动生成。但是内核使用的是make,这就需要另一个工具bear了,它就是专门用来生成这个 compile_commands.json 文件的。

在 Unbuntu 下直接使用 apt install bear 来安装 bear 工具就可以了。

sudo apt install bear

使用 bear 来生成内核编译 json 文件的方法也很简单,只需要在你平时编译内核的命令前加上 bear 就可以了,例如:

bear make ARCH=arm CROSS_COMPILE=arm-linux-gnu- zImage

2. 查看并下载需要的内核版本

当前想在 x86 32bit Ubuntu-14.04 Virtualbox 虚拟机上测试和开发Linux内核模块(驱动),所以我想阅读下当前我安装的 x86 32bit Ubuntu-14.04 Virtualbox 虚拟机内核编译使用的源码,并传入当前正在使用的virtualbox x86 32bit ubuntu-14.04 虚拟机的编译选型(宏开关),来准确的定义到需要的源码中的头文件,函数,变量的准确定义,排除同一个变量名(函数名)的多个声明。

查看我当前Ubuntu-14.04 虚拟机的内核版本:

##查看 /porc/version文件来查看当前Ubuntu-14.04 虚拟机的内核版本
dimon@dimon-VirtualBox:~$ cat /proc/version
Linux version 4.4.0-142-generic (buildd@lgw01-amd64-032) (gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.4) ) #168~14.04.1-Ubuntu SMP Sat Jan 19 11:28:33 UTC 2019

##使用命名 uname -r 查看当前Ubuntu-14.04 虚拟机的内核版本
dimon@dimon-VirtualBox:~$ uname -r
4.4.0-142-generic
dimon@dimon-VirtualBox:~$

可以看到当前我Ubuntu-14.04 虚拟机的内核版本是 Kernl-4.4.0-142,然后去下载对应的 kernel 内核源码包。

到 Linux 内核源码网站上下载对应的 kernel-4.4.0-142 内核源码,访问内核官方网站:

The Linux Kernel Archives

访问 kernel.org 网站,下载速率可能会比较慢(原因你懂的),我们可以到国内和内核镜像站去下载对应内核版本,例如,清华镜像站,阿里云镜像站等。如下,到清华镜像下载kernkernel-4.4.0-142 内核源码。

使用 wget 命令下载需要的内核版本 

wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v4.x/linux-4.4.tar.xz

 至此我需要的和我当前Virtualbox x86 32bit Ubuntu-14.04 虚拟机对应的内核源码包已经下载成功。根据你自己的虚拟机配置,也可以下载自己虚拟机Ubuntu版本对应的内核源码包。

3. 使用Clang搭建内核源码阅读环境

解压下载到的kernel-4.4.0 内核源码包。

tar -xvf linux-4.4.tar.xz

如在我上一个博文中记录的,查看当前环境中 x86 32bit Ubuntu-14.04 虚拟机虚拟机的内核编译参数。当前我Ubuntu-14.04 虚拟机内核的编译参数配置文件,存放在虚拟机的如下文件目录中。

查看当前运行Linux内核的编译参数-CSDN博客

/usr/src/linux-headers-4.4.0-142-generic/.config

我们可以使用这个当前Ubuntu-14.04 内核编译参数配置文件 '.config' 加上下载的kernel-4.4.0 源码包,来自行编译出当前虚拟机对应的内核。

我们进入之前解压的kernel-4.4.0 目录,通过内核源码来编译一下内核,如上一节提到的我们在编译命令前加上 ‘bear’ 来让内核编译时生成 compile_command.json 文件。

拷贝 '.config '内核编译配置文件到解压的内核源码目录。

## 把当前unbuntu-14.04 内核编译的配置参数文件,拷贝到我们解压的内核源码目录
cp /usr/src/linux-headers-4.4.0-142-generic/.config .

使用加上了'bear'前缀的 'make zimage' 命令来编译内核镜像。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1611256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android AIDL接口

一.AlDI接口简介 AIDL(Android Interface Definition Language)是一种 IDL 语言,用于生成可以在 Android 设备上两个进程之间进行进程间通信(IPC)的代码。 通过 AIDL,可以在一个进程中获取另一个进程的数据…

Go源码--Strings库

1. 简介 strings库 存储了 一些针对 字符串的具体操作 其 代码短小精悍 可以学习到很多编程的思路 尤其是 涉及到字符串使用性能的方面,其源码库有好多的优秀案例可以学习。向强者对齐不一定成为强者,但向弱者对齐一定变为弱者。 介绍思路是先介绍 stri…

.net6项目模板

1.集成log4net 安装依赖包: 安装扩展依赖即可,已经包含了log4net依赖: Microsoft.Extensions.Logging.Log4Net.AspNetCore 添加日志配置文件: 日志配置文件属性设置为始终复制: 注入服务: #region 注入…

React【Day4】

路由快速上手 1. 什么是前端路由 一个路径 path 对应一个组件 component 当我们在浏览器中访问一个 path 的时候,path 对应的组件会在页面中进行渲染 2. 创建路由开发环境 # 使用CRA创建项目 npm create-react-app react-router-pro# 安装最新的ReactRouter包 …

软件设计师软考中项学习(二)之计算机系统基础知识

读者大大们好呀!!!☀️☀️☀️ 🔥 欢迎来到我的博客 👀期待大大的关注哦❗️❗️❗️ 🚀欢迎收看我的主页文章➡️寻至善的主页 文章目录 学习目标学习内容学习笔记学习总结 学习目标 计算机系统硬件基本组成 中央处理…

「51媒体」新闻媒体邀约如何进行媒体宣传(方法)

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 新闻媒体邀约进行媒体宣传是一个策略性的过程,旨在吸引媒体的注意力并促使其对特定事件、产品发布或企业活动进行报道。以下是一些关键步骤和策略: 制定媒体传播方…

Advanced RAG 04:重排序(Re-ranking)技术探讨

编者按:重排序(Re-ranking)技术在检索增强生成(Retrieval Augmented Generation,RAG)系统中扮演着关键角色。通过对检索到的上下文进行筛选和排序,可以提高 RAG 系统的有效性和准确性&#xff0…

苍穹外卖学习笔记(4.套餐管理,店铺营业状态设置)

目录 一、Redis1、redis在java中的运用 二、店铺营业状态设置1、需求分析设计2、代码设计3、测试 三、套餐管理1、需求设计分析2、代码设计3、测试 一、Redis 具体的redis基本操作就不多再介绍,本节主要学习redis在java中的运用。 1、redis在java中的运用 具体…

Java 多线程加法求和

Java 多线程加法求和 代码 先上代码再上解析: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger;public class Sum implements …

基于人工智能的机动车号牌检测与推理系统v1.0

基于人工智能的机动车号牌检测与推理系统v1.0代码重构与实现。 目前整合3中现有算法,并完成阶段性改造,包括【传统方法检测车牌,SVM推理字符】、【YOLO方法检测车牌,SVM推理字符】、【YOLO方法检测车牌,CNN推理字符】&…

ADSP-21479的开发详解十(用CCES做Flash的编程)

硬件准备 ADSP-21479EVB开发板: 产品链接:https://item.taobao.com/item.htm?id555500952801&spma1z10.5-c.w4002-5192690539.11.151441a3Z16RLU AD-HP530ICE仿真器: 产品链接:https://item.taobao.com/item.htm?id38007…

墨子web3实时周报

蚂蚁集团Web3研发进展与布局 国内Web3赛道的领军企业——蚂蚁集团,凭借其在前沿科技领域的深耕不辍,已在Web3技术研发疆域缔造了卓越战绩。特别是在引领行业革新的关键时刻,集团于今年四月末震撼推出了颠覆性的Web3全套解决方案,…

Hive基础3

一、表的分区 大数据开发数据量较大,在进行数据查询计算时,需要对数据进行拆分,提升的查询速度 1-1 单个分区 单个分区是创建单个目录 -- 创建表指定分区,对原始数据进行分区保存 create table new_tb_user(id int,name string,ag…

通过实例学C#之序列化与反序列化XmlSerializer类

简介 可以将类序列化成xml文件,或者将xml文件反序列化成类对象,一般用于保存或加载项目参数。 构造函数 XmlSerializer() 不使用函数创建一个xmlSerializer对象。 XmlSerializer(Type type) 使用type对象创建一个xmlSerializer对象,注意&…

[阅读笔记23][JAM]JOINTLY TRAINING LARGE AUTOREGRESSIVE MULTIMODAL MODELS

这篇论文是24年1月发表的,然后是基于的RA-CM3和CM3Leon这两篇论文。它所提出的JAM结构系统地融合了现有的文本模型和图像生成模型。 主要有两点贡献,第一点是提出了融合两个模型的方法,第二点是为混合模型精心设计的指令微调策略。 下图是一个…

【Java笔记】第4章:深入学习循环结构

前言1. 循环的理解2. while循环3. do...while循环4. for循环5. 循环的控制语句6. 循环的嵌套结语 ↓ 上期回顾: 【Java笔记】第3章:深入学习分支结构 个人主页:C_GUIQU 归属专栏:【Java学习】 ↑ 前言 各位小伙伴大家好!上期小编…

C语言读取数据检索存档《C语言程序设计》·第6章·用数组处理批量数据

C数组使用 添加链接描述 C语言读取数据检索存档 1 添加链接描述 2 添加链接描述 3 添加链接描述 4 添加链接描述 5 添加链接描述 6 添加链接描述 7 matlab转C 添加链接描述

19.表单输入绑定

表单输入绑定 在前端处理表单时&#xff0c;我们常常需要将表单输入框的内容同步给 JavaScript 中相应的变量。手动连接值绑定和更改事件监听器可能会很麻烦,v-model 指令帮我们简化了这一步骤 <template><input type"text" v-model"message">…

Sylar C++高性能服务器学习记录02 【日志管理-代码分析篇】

早在19年5月就在某站上看到sylar的视频了&#xff0c;一直认为这是一个非常不错的视频&#xff0c;还有幸加了sylar本人的wx&#xff0c;由于本人一直是自学编程&#xff0c;基础不扎实&#xff0c;也没有任何人的督促&#xff0c;没能坚持下去&#xff0c;每每想起倍感惋惜。恰…

部署轻量级Gitea替代GitLab进行版本控制(一)

Gitea 是一款使用 Golang 编写的可自运营的代码管理工具。 Gitea Official Website gitea: Gitea的首要目标是创建一个极易安装&#xff0c;运行非常快速&#xff0c;安装和使用体验良好的自建 Git 服务。我们采用Go作为后端语言&#xff0c;这使我们只要生成一个可执行程序即…