VSCode远程开发Linux内核驱动
受够了Vim的换台电脑就要倒腾N天配置的折磨,受够了Windows下Source Insight眼花的界面。这些软件虽然很多人在用,但是缺点也不少。然而Linux内核代码非常庞大,编译内核又需要在Linux下进行。
有没有一种能在Windows下开发又能在Windows下“编译”的方法呢?
答案就是:VSCode!
首先介绍一下基本思路:
——————————————————————————————-
1、使用VSCode远程开发进行 SSH无缝连接,在Windows下码代码的同时又能“编译”
2、使用 C/C++ 插件提供智能感知(追代码)
3、使用NFS让开发板通过网络挂载驱动生成文件目录,快速测试安装驱动(可选)
关于远程SSH请看:【VSCode远程开发配置指南】
操作步骤
【创建工程文件夹】
这步我借鉴了CSDN的 Ningjianwen ,链接
【打开文件夹】
安装好或远程连接vscode后,选择 文件-打开文件夹 打开内核源码文件夹。在内核源码文件夹的根目录下会生成一个.vscode 的文件夹,该文件夹保存了你的工程配置信息。如果Ubuntu的文件资源管理器看不到,按Ctrl+H取消隐藏即可看到。
【配置C/C++ 索引】
在右下角点击C/C++配置,选择UI方式编辑配置。熟悉配置的同学也可以使用json修改。

出现如上图所示。将交叉编译器路径和头文件相对路径填入。
以我为例
编译器
--------------
/home/pi/toolchain/toolsraspi/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
#以上是我的交叉编译器绝对路径,仅供参考 定义
-------------
对于某些Android工程,如高通,该文件在out/target/product/xxx/obj/KERNEL_XXX下。一般在include/generated/autoconf.h。
请将内核include/generated/autoconf.h文件中的内容复制出来,删除#define 开头并添加 xxx = xxx 的格式,如:
CONFIG_CMD_BOOTM = 1
CONFIG_ARM = 1 包含路径
-----------------
分别对应平台架构的头文件目录和内核的头文件目录,想要获得正常的代码感知和错误提示,一下目录必须配置。以下是我的头文件相对路径,仅供参考,/**是以递归形式查找目录下的所有头文件。
不同平台的索引目录可以从kernel工程根目录的makefile文件中找到。 /home/pi/worksapce/rok-rk3399-pc/kernel/drivers/**
/home/pi/worksapce/rok-rk3399-pc/kernel/usr/
/home/pi/worksapce/rok-rk3399-pc/kernel/include/
/home/pi/worksapce/rok-rk3399-pc/kernel/include/generated/
/home/pi/worksapce/rok-rk3399-pc/kernel/arch/arm64/include/
/home/pi/worksapce/rok-rk3399-pc/kernel/arch/arm64/include/generated/ 高通android平台示例
/home/pi/workspace/8953_810_LA301/kernel/msm-3.18/drivers/**"
/home/pi/workspace/8953_810_LA301/kernel/msm-3.18/include/"
/home/pi/workspace/8953_810_LA301/kernel/msm-3.18/arch/arm64/include/"
/home/pi/workspace/8953_810_LA301/out/target/product/msm8953_64/obj/kernel/msm-3.18/include/"
/home/pi/workspace/8953_810_LA301/out/target/product/msm8953_64/obj/kernel/msm-3.18/include/generated/"
/home/pi/workspace/8953_810_LA301/out/target/product/msm8953_64/obj/kernel/msm-3.18/usr/include/"
/home/pi/workspace/8953_810_LA301/out/target/product/msm8953_64/obj/kernel/msm-3.18/arch/arm64/include/"
/home/pi/workspace/8953_810_LA301/out/target/product/msm8953_64/obj/kernel/msm-3.18/arch/arm64/include/generated
【添加宏定义】
关于如何处理autoconf.h 文件。

复制文件,用VSCode打开
编辑文件,添加宏定义
将autoconf.h中的注释删掉,选中”#define “,右键->更改所有匹配项->退格 删除所有”#define “。然后在开头添加”__KERNEL__”, “__GUN__”, “KBUILD_MODNAME = \”\””。用同样的方法,选中”CONFIG”,右键->更改所有匹配项->Ctrl+方向键→,跳转到第一个字符串的结尾,输入空格和=,最后Ctrl+A全选择,复制粘贴到 C/C++配置 的”定义”中。
【C/C++插件优化】
Ctrl + Shift + P 打开 首选项:打开设置(UI)
根据是远程连接或者是本地打开的情况选择相应的配置,再在右上角点击打开json文件,将以下配置添加到json配置中。以下配置可以屏蔽部分编译生成的零时文件,并修改代码格式化风格,修改智能感知缓存路径到工程路径下,增大索引缓存大小。
{
"remote.autoForwardPortsSource": "output",
"files.exclude": {
"**/*.cmd": true,
"**/*.o": true,
"**/*.s": true,
"**/*.su": true,
"**/*.i": true
},
"C_Cpp.clang_format_fallbackStyle": "WebKit",
"C_Cpp.intelliSenseCachePath": "${workspaceFolder}/.vscode",
"C_Cpp.intelliSenseCacheSize": 10240,
"C_Cpp.intelliSenseMemoryLimit": 10240
}
【配置NFS (可选) 】
开发板通过NFS挂载工程文件夹,编译好后直接的开发板上就能安装。
# 主机安装服务
$sudo apt-get install nfs-kernel-server nfs-common
#主机配置
$sudo vim /etc/exports
#添加
#/home/pi/project/rootfs/ *(rw,sync,no_subtree_check,no_root_squash)
#/dir :共享的目录
#* :指定哪些用户可以访问
# * 所有可以ping同该主机的用户
# 192.168.1.* 指定网段,在该网段中的用户可以挂载
# 192.168.1.12 只有该用户能挂载
#(ro,sync,no_root_squash): 权限
#ro : 只读
#rw : 读写
#sync : 同步
#no_root_squash: 不降低root用户的权限
#其他选项man 5 exports 查看
#Ubuntu 18.10默认的NFS不支持NFS2协议,需要手动添加协议支持
$vi /etc/default/nfs-kernel-server
#添加
RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog" #主机重启NFS服务
$sudo service nfs-kernel-server restart
#开发板挂载NFS 注意主机IP地址和相对路径。如果有路由可以选择绑定IP
$sudo mount -t nfs 192.168.2.100:/home/pi/nfs/ /home/pi/nfs/
#查看
$ls /mnt
卸载NFS
$umount /mnt
【试试看】

SSH远程连接并查看结构体信息
远程编译并在开发板上安装驱动模块
VSCode远程开发Linux内核驱动的更多相关文章
- Unix/Linux环境C编程新手教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建
1. openSUSE是一款优秀的linux. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRjYXN0Y3Bw/font/5a6L5L2T/font ...
- Unix/Linux环境C编程入门教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建
1. openSUSE是一款优秀的linux. 2.选择默认虚拟机 3.选择稍后安装操作系统 4.选择linux opensuse 5. 选择默认虚拟机名称 6.设置处理器为双核. 7.内存设置为2 ...
- OMAP4之DSP核(Tesla)软件开发学习(二)Linux内核驱动支持OMAP4 DSP核
注:必须是Linux/arm 3.0以上内核才支持RPMSG,在此使用的是.config - Linux/arm 3.0.31 Kernel Configuration.(soure code fro ...
- Linux内核驱动开发之KGDB原理介绍及kgdboe方式配置
接博文<Linux内核驱动开发之KGDB单步调试内核(kgdboc方式)>.上篇博文中,仅简单介绍使用串口的Kgbd的流程(kgdboc方式),本文将重点介绍KGDB调试Linux内核的原 ...
- 嵌入式C语言自我修养 02:Linux 内核驱动中的指定初始化
2.1 什么是指定初始化 在标准 C 中,当我们定义并初始化一个数组时,常用方法如下: ] = {,,,,,,,,}; 按照这种固定的顺序,我们可以依次给 a[0] 和 a[8] 赋值.因为没有对 a ...
- Linux内核驱动学习(八)GPIO驱动模拟输出PWM
文章目录 前言 原理图 IO模拟输出PWM 设备树 驱动端 调试信息 实验结果 附录 前言 上一篇的学习中介绍了如何在用户空间直接操作GPIO,并写了一个脚本可以产生PWM.本篇的学习会将写一个驱动操 ...
- vscode远程连接linux服务器,可视化绘图
vscode远程连接linux服务器 想要实现的功能和解决方案 实现的功能: windows下直接使用远程linux服务器的python环境和文件来编写和运行py文件, 实时的编写py文件,和可视化绘 ...
- 在树莓派上开发SpringBoot 之使用VSCode远程开发
一些运行在ARM单板电脑上的IoT应用通常会提供RESTful风格的API接口.本次的文章记录如何在本地电脑上通过VS Code的远程开发功能,在树莓派端创建一个SpringBoot工程,并实现调试和 ...
- linux内核驱动模型
linux内核驱动模型,以2.6.32内核为例.(一边写一边看的,有点乱.) 1.以内核对象为基础.用kobject表示,相当于其它对象的基类,是构建linux驱动模型的关键.具有相同类型的内核对象构 ...
- linux 内核驱动--Platform Device和Platform_driver注册过程
linux 内核驱动--Platform Device和Platform_driver注册过程 从 Linux 2.6 起引入了一套新的驱动管理和注册机制 :Platform_device 和 Pla ...
随机推荐
- Cartographer学习——地图概率更新过程
前言:最近一直在研究建图,对google的开源SLAM框架 Cartographer 进行了源码梳理,发现很多巧妙的算法设计,结合原论文 <Real-time Loop Closure in 2 ...
- 串(C语言实现)
文章目录 1.串的数据类型定义 数据对象 1.1 数据关系 1.2 基本操作 2.串的存储结构 2.1 串的顺序存储 2.2 串的链式存储 3.串的模式匹配算法 3.1BF 算法 3.2KMP 算法 ...
- CerberusDet:不同任务共享不同的部分,新多任务目标检测方案
传统的目标检测模型通常受到其训练数据和定义的类别逻辑的限制.随着语言-视觉模型的近期兴起,出现了不受这些固定类别限制的新方法.尽管这些开放词汇检测模型具有灵活性,但与传统的固定类别模型相比,仍然在准确 ...
- IntelliJ IDEA 2024.1 安装激活 (亲测有效!)
第一步:下载 IDEA 安装包 访问 IDEA 官网,下载 IDEA 2024.1.4 版本的安装包,下载链接如下 : idea官方链接 也可以在这里点击下载idea下载idea 第二步: 安装 ID ...
- RL 基础 | 如何使用 OpenAI Gym 接口,搭建自定义 RL 环境(详细版)
参考: 官方链接:Gym documentation | Make your own custom environment 腾讯云 | OpenAI Gym 中级教程--环境定制与创建 知乎 | 如何 ...
- 全新向量数据库SQL Server 2025:带你迈入AI驱动的数据未来
全新向量数据库SQL Server 2025:带你迈入AI驱动的数据未来 上次大家下单的<微软憋大招:SQL Server + Copilot = 地表最强AI数据库!> 抱怨迟迟没有发货 ...
- Java网络编程之JavaMail发送邮件和接受邮件
JavaMail是API 是一个标准的Java扩展,它是J2EE的范畴,在J2EE开发过程中可能会需要用到这个API.在学习JavaMail之前,有必须要对现在的互联网的邮件协议进行有个大体的了解. ...
- 前端项目部署之pushstate-server
pushstate-server 内部的原理是通过 connect 服务器,开启一个端口,将 dist/index.html 文件作为静态模板输出 这种方式可以将本地的项目打包成静态文件,以服务的方式 ...
- vue中登录超时跳转到登录页面设置拦截器
axios中添加响应拦截器 Axios.interceptors.response.use(res = > { let resData = res.data; if (resData.code ...
- Dockerfile&Docker-Compose之基础
使用了很久的docker,之前却从来没有总结过, 于是开此篇来记录平常使用Dockerfile和docker-compose.yaml的点滴, 先从基础命令开始哦 [Dockerfile] Docke ...