IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> VsCode 搭建远程linux内核开发环境 -> 正文阅读

[开发工具]VsCode 搭建远程linux内核开发环境

环境

  • ssh
  • g++/gcc , gdb ,make
  • vscode

远程连接服务器

安装Remote ssh

在这里插入图片描述

连接服务器

在这里插入图片描述
选第一个,感觉没啥关系
在这里插入图片描述

右下角Open Config

在这里插入图片描述
HostNameip
在这里插入图片描述
然后就像打开本地文件一样打开服务器里的文件
在这里插入图片描述

搭建c/c++ 环境

安装c/c++ 插件

在这里插入图片描述

搭建普通c/c++开发环境

经典hello,World

#include<stdio.h>
int main(){
    printf("%s","Hello,World\n");
    return 0;
}

debug, gdbgcc
在这里插入图片描述

在这里插入图片描述
调试成功
在这里插入图片描述

搭建linux内核开发环境

ctrl+shift+p打开命令面板。
在这里插入图片描述
生成了一个配置文件 c_cpp_properties.json
在这里插入图片描述

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                // 编译环境
                "${default}",
                "/lib/modules/4.18.0-305.12.1.el8_4.x86_64/build/include",
                "/lib/modules/4.18.0-305.12.1.el8_4.x86_64/build/arch/x86/include",
                "/lib/modules/4.18.0-305.12.1.el8_4.x86_64/build/arch/x86/include/generated"

                // 编辑器环境
                // "/usr/src/kernels/4.18.0-305.12.1.el8_4.x86_64/include",
                // "/usr/src/kernels/4.18.0-305.12.1.el8_4.x86_64/arch/x86/include",
                // "/usr/src/kernels/4.18.0-305.12.1.el8_4.x86_64/arch/x86/include/generated"
                // g++ -v -E -x c++ -
            ],
            "defines": [
                "__KERNEL__=1",
                "MODULE=1",
                "KBUILD_MODNAME=\"hello\""
            ],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu17",
            "cppStandard": "gnu++14",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

版本换成uname -r 命令输出的。
这里解释一下。如过你下了源码包可以用/usr/src目录下的。这里我就注释掉了。而且不同linux发行版位置还不太一样。这里我用的是CentOS


还有一个defines很重要。
如图,linux内核的一些宏要定义了特殊的宏才可以被条件编译。否则vscode会无法识别这些宏。
在这里插入图片描述

测试

//必要的头文件
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
//模块许可证声明(必须)
MODULE_LICENSE("Dual BSD/GPL");
//模块加载函数(必须)
static int hello_init(void)
{
    printk(KERN_ALERT "Hello World enter/n");
    return 0;
}
//模块卸载函数(必须)
static void hello_exit(void)
{
    printk(KERN_ALERT "Hello World exit/n");
}
//模块的注册
module_init(hello_init);
module_exit(hello_exit);
//声明模块的作者(可选)
MODULE_AUTHOR("lyf");
//声明模块的描述(可选)
MODULE_DESCRIPTION("This is a simple example!/n");
//声明模块的别名(可选)
MODULE_ALIAS("A simplest example");

Makefile 文件

CONFIG_MODULE_SIG=n
# 如果定义了KERNELRELEASE,那么我们已经从内核构建系统中被调用,并且可以使用它的语言。
ifneq ($(KERNELRELEASE),)
	obj-m := hello.o
# 否则,我们直接从命令行调用;调用内核构建系统。
else
	KERNELDIR ?= /lib/modules/$(shell uname -r)/build
	PWD := $(shell pwd)
default:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
endif

在这里插入图片描述

# 加载模块
insmod ./hello.ko
# 删除模块
rmmod hello
# 列出模块
lsmod
# 查看模块日志
dmesg | tail
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-10-15 11:58:54  更:2021-10-15 12:01:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:37:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码