本文适合过去一直用VisualStudio进行windows程序设计的人阅读
环境:
服务器端centOS8(必需安装linux内核源码),客户端windows+VisualCode+putty
vscode插件繁多功能强大,我暂时只是将其作为一个远程代码书写工具,用于编写C/C++代码和Makefile文件。编译则是通过putty远程执行make命令。vscode有maketools插件,但插件安装之后的配置对我来说是个麻烦事。所以干脆使用putty,反正也得用它执行其它指令。
我的vscode主要安装有SSH插件和C/C++插件,参见vscode安装笔记
最重要的是centOS8上必需安装好内核源码,此乃一切工作之基础。 然后在配置C/C++插件时,把其路径include进去,这样vscode才能"认识"代码前面所包含的头文件。
注:centos内核源码路径为usr/src/kernels如果没安装此路径下无内容。安装方式为:
yum install "kernel-devel-uname-r == $(uname -r)"
安装gcc: yum -y install gcc
安装g++: yum install -y gcc-c++
c_pp_properties.json
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/home/szm/linux/IMX6ULL/szm_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga/include/**",
"/home/szm/linux/IMX6ULL/szm_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include",
"/home/szm/linux/IMX6ULL/szm_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include/generated/"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-x64"
}
],
"version": 4
源码根下的include是主要包含路径,除此处还可能用到其它路径,当发现vscode中头文件有红色波浪线,就在putty中CD到源码根路径后find -name xxx.h头文件,找到后将相关路径添加到上面配置文件中。
发现设置了includepath后头文件还可能飘红,可参考我另一篇博文“centos7 netfilter过滤程序”
搞定头文件后,vscode可能还会报"不允许使用不完整的类类型"这样的错误,经我实践并不影响编译。
下面进入正题,一个最新版的、最简单的netfilter代码:
#include <linux/kernel.h>
#include <linux/kern_levels.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/init.h>
static struct nf_hook_ops nfho;
unsigned int hook_func(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)
{
printk(KERN_INFO"netflt packet dropped !\n");
return NF_DROP;
}
int init_module()
{
nfho.hook = hook_func;
nfho.hooknum = NF_INET_PRE_ROUTING;
nfho.pf = PF_INET;
nfho.priority = NF_IP_PRI_FIRST;
int r = nf_register_net_hook(&init_net, &nfho);//成功返回0
printk(KERN_INFO"netflt init ! %d\n",r);
return 0;
}
void cleanup_module()
{
nf_unregister_net_hook(&init_net,&nfho);
printk(KERN_INFO"netflt exit !\n");
}
接下来说一下makefile,linux下makefile就是名为"Makefile"的一个文件,没有扩展名。
# KERNELDIR表示内核源码路径
KERNELDIR := /home/szm/linux/IMX6ULL/szm_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga
# 表示当前路径,即pwd
CURRENT_PATH := $(shell pwd)
# 将netflt.c编译成模块
obj-m := netflt.o
build : kernel_modules
# 具体的编译命令,后面的 modules 表示编译模块,-C 表示将当前的工作目录切
# 换到指定目录中,也就是 KERNERLDIR 目录。M 表示模块源码目录,“make modules”命令
# 中加入 M=dir 以后程序会自动到指定的 dir 目录中读取模块的源码并将其编译为.ko 文件。
kernel_modules:
$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean
关于makefile可参阅:https://blog.csdn.net/daocaokafei/article/details/124641034
vscode安装完后会在服务器端用户目录下建.vscode-server目录,编写的代码和makefile文件也在该目录下或其子目录中,putty CD到那里,执行make。如果成功会生成一个.ko文件,insmod这个ko文件,netfilter驱动被加载入内核。由于我这个示例代码太过简单粗暴,直接屏蔽所有IP包,于是insmod后putty和vscode就立刻瘫痪了。。。要恢复得在运营商控制面板那重启服务器。