jiaoyi8483 2019-10-22 18:53 采纳率: 0%
浏览 1030
已结题

linux 编译驱动程序 没有生成ko文件 大家帮看下

系统:centos
内核:5.3.7

代码:
sockopt_test.h

#ifndef __SOCKOPT_TEST_H_
#define __SOCKOPT_TEST_H_

#define SOCKOPT_BASE                 (10240)
#define SOCKOPT_SET_MIN              ((SOCKOPT_BASE) + 1)
#define SOCKOPT_SET_BUFFER                ((SOCKOPT_BASE) + 1)
#define SOCKOPT_SET_MAX              ((SOCKOPT_BASE) + 2)

#define SOCKOPT_GET_MIN              ((SOCKOPT_BASE) + 1)
#define SOCKOPT_GET_BUFFER                ((SOCKOPT_BASE) + 1)
#define SOCKOPT_GET_MAX              ((SOCKOPT_BASE) + 2)

#endif

sockopt_test.c:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/netfilter.h>
#include "sockopt_test.h"

#define BUFFER_LEN_MAX 1024
static char buffer[BUFFER_LEN_MAX];

/* setsockopt 回调处理函数 */ 
int setsockopt_handler(struct sock *sk, int optval, void __user *user, unsigned int len)
{

        switch(optval)
        {
            case SOCKOPT_SET_BUFFER:
                if ( copy_from_user((void*)&buffer, user, len) != 0 ) 
                {
                        return -EFAULT;
                }

                break;
            default:
                printk(KERN_INFO "invalid setsockopt opt : %d\n", optval);
                return -EFAULT;
        }

        printk(KERN_INFO "buffer[]: %s\n", buffer);
        return 0;
}

/* getsockopt 回调处理函数 */  
int getsockopt_handler(struct sock *sk, int optval, void __user *user, int *len)
{
        unsigned int cpy_len;

        cpy_len = *len > BUFFER_LEN_MAX ? BUFFER_LEN_MAX : *len;
        switch(optval)
        {
            case SOCKOPT_GET_BUFFER:
                if(copy_to_user(user, (void*)&buffer[0], cpy_len) != 0) 
                {
                        printk(KERN_INFO "getsockopt_handler fail \n");
                        return -EFAULT;
                }

                    break;
            default:
                    printk(KERN_INFO "unrecognized getsockopt optvalue : %d\n", optval);
                    return -EFAULT;
        }

        return 0;
}

/* 定义nf_sockopt_ops结构体 */ 
static struct nf_sockopt_ops sockopt_ops_test =
{
        .pf                     = PF_INET,
        .set_optmin             = SOCKOPT_SET_MIN,
        .set_optmax             = SOCKOPT_SET_MAX,
        .set                    = setsockopt_handler,
        .get_optmin             = SOCKOPT_GET_MIN,
        .get_optmax             = SOCKOPT_GET_MAX,
        .get                    = getsockopt_handler,
};

static __init int sockopt_test_init(void)
{
        int result;
        /* 注册sockopt */
        result = nf_register_sockopt(&sockopt_ops_test);
        if(result != 0) 
        {
                printk("register sockopt error!\n");
        }

        printk("sockopt_test register success !\n");
        return 0;
}

static __exit void sockopt_test_exit(void)
{
        /* 注销sockopt */
        nf_unregister_sockopt(&sockopt_ops_test);
        printk("sockopt_test unregister\n");
}

module_init(sockopt_test_init);
module_exit(sockopt_test_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Stone");

MakeFile:

obj-m :=sockopt_test.o  
KERNEL :=/usr/src/kernels/linux-5.3.7/  
PWD :=$(shell pwd)  
modules :  
    $(MAKE) -C $(KERNEL) M=$(PWD) modules  
.PHONEY:clean  
clean :  
    rm -f *.o *.ko

编译结果:
图片说明

  • 写回答

2条回答

  • weixin_44740898 2019-10-22 22:29
    关注
    $(MAKE)  前面应该是 TAB键,当前摘录的代码是4个空格。 
    
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?