当前位置:   article > 正文

VsCode 搭建远程linux内核开发环境_#include vscode

#include vscode

环境

  • 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5

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

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

搭建linux内核开发环境

安装库

yum install elfutils-libelf-devel
  • 1

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": [
                 "__GNUC__",
                "__KERNEL__",
                "MODULE"
            ],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu17",
            "cppStandard": "gnu++14",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

版本换成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");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这里插入图片描述

# 加载模块
insmod ./hello.ko
# 删除模块
rmmod hello
# 列出模块
lsmod
# 查看模块日志
dmesg | tail
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/239895
推荐阅读
相关标签
  

闽ICP备14008679号