• 编译内核模块出现error: negative width in bit-field 错误


    今天在写一个简单的内核测试模块的时候出现了一个挺奇怪的问题,网上查了一下也没人解决,自己试了好久终于解决了,所以分享出来供大家参考,先贴出源码:

    /**********************************************
     *文 件 名:hello.c
     *文件描述:给模块传参
     *创 建 人:Wang.J,2013.10.26
     *版 本 号:0.1
     *修改记录:
    **********************************************/
     #include <linux/kernel.h>
     #include <linux/module.h>
    
     MODULE_LICENSE("Dual BSD/GPL");
    
     //定义参数
     int myint = 100;
     char *mystring = "This is name!";
     short myshort = 10;
     long mylong = 100;
     int array[2] = {0};
    
     //模块参数声明
     module_param(myshort, short, 0555);
     module_param(myint, int, 0444);
     module_param(mylong, long, 0444);
     module_param(mystring, charp, 0777);
     module_param_array(array, int, NULL, 0777);
    
    /*==============================================
     *函 数 名:hello_module_init
     *参    数:void
     *功能描述:注册模块
     *返 回 值:成功,返回0
     *异    常:
     *创 建 人:Wang.J,2013.10.26
     *修改记录:
    ==============================================*/
     static int hello_module_init(void)
     {
         int ret = 0;
         int i;
    
         printk("This shirt is %d
    ", myshort);
         printk("This int is %d
    ", myint);
         printk("This long is %ld
    ", mylong);
         printk("This string is %s
    ", mystring);
         for (i = 0; i < sizeof(array)/sizeof(array[0]); i++) {
             printk("The %d of number is %d
    ", i, array[i]);
         }
    
         return ret;
     }
    
    /*==============================================
     *函 数 名:hello_module_cleanup
     *参    数:void
     *功能描述:卸载函数
     *返 回 值:void
     *异    常:
     *创 建 人:Wang.J,2013.10.26
     *修改记录:
    ==============================================*/
     static void hello_module_cleanup(void)
     {
         printk("hello_module_cleanup
    ");
     }
    
    module_init(hello_module_init);
    module_exit(hello_module_cleanup);
    
    //模块声明与描述
    MODULE_AUTHOR("Wang.J");
    MODULE_DESCRIPTION("hello This");
    MODULE_ALIAS("别名");
    MODULE_SUPPORTED_DEVICE("内存模拟");

    编译错误提示:

    make -C /lib/modules/3.2.0-29-generic-pae/build M=/home/linux/driver/experiment/ex04
    make[1]: Entering directory `/usr/src/linux-headers-3.2.0-29-generic-pae'
      LD      /home/linux/driver/experiment/ex04/built-in.o
      CC [M]  /home/linux/driver/experiment/ex04/hello.o
    /home/linux/driver/experiment/ex04/hello.c:24:1: error: negative width in bit-field ‘<anonymous>’
    /home/linux/driver/experiment/ex04/hello.c:25:2: error: negative width in bit-field ‘<anonymous>’
    make[2]: *** [/home/linux/driver/experiment/ex04/hello.o] Error 1
    make[1]: *** [_module_/home/linux/driver/experiment/ex04] Error 2
    make[1]: Leaving directory `/usr/src/linux-headers-3.2.0-29-generic-pae'
    make: *** [modules] Error 2

    最后发现是module_param声明中有关权限的问题,这个权限不能是可写的.也就是说这个权限只能是rx的任意组合,5或4或1.因为模块运行在内核空间中,权限要求比较严格.

    所以将

    module_param(mystring, charp, 0777);

    module_param_array(array, int, NULL, 0777);

    改成

    module_param(mystring, charp, 0555);

    module_param_array(array, int, NULL, 0444);

    就可以了.

  • 相关阅读:
    Unity---游戏设计模式(6)之策略模式
    Unity---游戏设计模式(5)之桥接模式
    Unity---游戏设计模式(3)之单例模式
    ThinkPHP钩子和行为
    如何理解ThinkPHP框架里的依赖注入
    MySql读写分离实现
    PHP 微服务集群搭建
    详解MySQL的主从复制、读写分离、备份恢复
    索引差异
    nginx高可用
  • 原文地址:https://www.cnblogs.com/wangluojisuan/p/3390758.html
Copyright © 2020-2023  润新知