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

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.mzph.cn/pingmian/1155.shtml

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

相关文章

常见的七种排序

目录 一、插入排序 1、直接插入排序 2、希尔排序(缩小增量排序) 二、选择排序 3、直接选择排序 4、堆排序 三、交换排序 5、冒泡排序 6、快速排序 四、归并排序 7、归并排序 五、总结 一、插入排序 1、直接插入排序 思路: i 用来…

文本溢出体验进阶:CSS 技巧实现单行/多行隐藏展示以及实际场景应用,确保内容可读性和布局整洁性

CSS文本溢出隐藏是一种常见的场景,它广泛应用于各种网页设计中,旨在确保内容的可读性和布局的整洁性,特别是在空间有限或需要适应不同屏幕尺寸的情况下。 一、文本溢出隐藏并显示省略号 1、单行文本溢出隐藏并显示省略号 对于单行文本&…

paho-mqtt 库揭秘

文章目录 **paho-mqtt 库揭秘**第一部分:背景介绍第二部分:paho-mqtt 是什么?第三部分:如何安装这个库?第四部分:库函数使用方法第五部分:场景应用第六部分:常见Bug及解决方案第七部…

Swift-25-普通函数、闭包函数与Lamda表达式编程

函数 语法定义 先来看下swift中函数的定义,函数用关键字func来指定,语法相对复杂一点,主要有下列4种基本情况,还有比较复杂的,会在后续详细讲解。 无参函数定义 有参函数定义 一个简单的函数和函数调用示例如下&…

分类预测 | Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类预测

分类预测 | Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类预测 目录 分类预测 | Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类…

A1322 电烙铁发热芯热电偶温度与电压数据

就是这种四根线比较细的发热芯: 两根红色线是发热丝,另外两根是热电偶线,透明线是正极,不能搞错了。 非常粗略的测了一下,根本没有考虑误差。拿万用表直接测量热电偶的输出电压;用可调电源手动调节电压&am…

suse15 系统分区信息损坏修复案例一则

关键词 suse linux、系统分区fdisk、分区类型testdisk、grub2、bios There are many things that can not be broken! 如果觉得本文对你有帮助,欢迎点赞、收藏、评论! 一、问题现象 业务反馈一台suse服务器,因错误执行了fdisk分区…

Linux 服务器硬件及RAID配置实战

服务器详解 服务器分类 可以分为:塔式服务器、机架服务器、刀片服务器、机柜服务器等。 其中以机架式居多 服务器架构 服务器品牌: 戴尔、AMD、英特尔、惠普、华为、华3(H3C)、联想、浪潮、长城 服务器规格: 规格…

【 C++ 】 讲解与实现 对数器接口

什么是对数器 说是叫对数器,但我觉得叫做核验器更好。 为什么?因为其作用是核验算法是否正确,所以我觉得叫核验器更好。 注意:本文实现的是生成只能int类型的对数器,其余类型不支持。 对数器的原理 对于一个核验器&am…

怎么用手机远程控制电脑 远程控制怎么用

怎么用手机远程控制电脑:远程控制怎么用 在这个科技日新月异的时代,远程控制电脑已经成为了很多人的需求。有时,我们可能在外出时突然需要访问家中的电脑,或者在工作中需要远程操控办公室的电脑。这时,如果能用手机远…

layui框架实战案例(27):弹出二次验证

HTML容器 <button class"layui-btn layui-btn-sm layui-btn-danger" lay-event"delete"><i class"layui-icon layui-icon-delete"></i>批量删除</button>删除封装函数 function delAll(school_id, school_name) {var lo…

Springboot+Vue项目-基于Java+MySQL的网上超市系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

【信号处理】基于EEG脑电信号的自闭症预测典型方法实现

理论 自闭者主要受到遗传和环境因素的共同影响。由于自闭症是一种谱系障碍&#xff0c;因此每个自闭症患者都有独特的优势和挑战。自闭症患者学习、思考和解决问题的方式可以是高技能的&#xff0c;也可以是严峻的挑战。研究表明&#xff0c;高质量的早期干预可以改善学习、沟…

ZStack教育云计算解决方案入选高质量数字化转型技术解决方案集

近日&#xff0c;中国信通院“铸基计划”《高质量数字化转型技术解决方案&#xff08;2023年度&#xff09;》&#xff08;以下简称“方案集”&#xff09;发布&#xff0c;云轴科技ZStack智慧教育云计算解决方案入选《高质量数字化转型技术解决方案集》。 为促进数字化转型相…

第63天:服务攻防-框架安全CVE 复现DjangoFlaskNode.JSJQuery

目录 思维导图 案例一&#xff1a;JavaScript-开发框架安全-Jquery&Node node.js目录穿越 CVE-2021-21315命令执行 Jquery CVE-2018-9207 案例二&#xff1a;Python-开发框架安全-Django&Flask django cve_2019_14234 CVE-2021-35042 flask ssti 思维导图 案…

Jenkins和gitlab实现CICD

1 背景 在开发TracerBackend服务的时候&#xff0c;每次更改代码之后需要推送到gitlab&#xff0c;然后ssh登录到Ubuntu的服务器上部署新的代码。服务成功启动之后&#xff0c;在本地执行测试用例&#xff0c;觉得这一套操作流程还是挺复杂的。想起公司的代码发布流程&#xf…

多模态视觉语言模型:BLIP和BLIP2

1. BLIP BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation BLIP的总体结构如下所示&#xff0c;主要包括三部分&#xff1a; 单模态编码器&#xff08;Image encoder/Text encoder&#xff09;&#xff1a;分别进…

智慧浪潮下的产业园区:解读智慧化转型如何打造高效、绿色、安全的新产业高地

随着信息技术的飞速发展&#xff0c;智慧化转型已经成为产业园区发展的重要趋势。在智慧浪潮的推动下&#xff0c;产业园区通过集成应用物联网、大数据、云计算、人工智能等先进技术手段&#xff0c;实现园区的智慧化、高效化、绿色化和安全化&#xff0c;从而打造成为新产业高…

(四)SQL面试题(连续登录、近N日留存)学习简要笔记 #CDA学习打卡

目录 一. 连续登录N天的用户数量 1&#xff09;举例题目 2&#xff09;分析思路 3&#xff09;解题步骤 &#xff08;a&#xff09;Step1&#xff1a;选择12月的记录&#xff0c;并根据用户ID和登录日期先去重 &#xff08;b&#xff09;Step2&#xff1a;创建辅助列a_rk…

数字接龙(蓝桥杯)

文章目录 数字接龙【问题描述】解题思路DFS 数字接龙 【问题描述】 小蓝最近迷上了一款名为《数字接龙》的迷宫游戏&#xff0c;游戏在一个大小为N N 的格子棋盘上展开&#xff0c;其中每一个格子处都有着一个 0 . . . K − 1 之间的整数。游戏规则如下&#xff1a; 从左上…