コンパイルカーネルモジュールerror:negative width in bit-fieldエラー

4436 ワード

今日は简単なカーネルテストモジュールを书く时に変な问题が出てきました.ネットで调べても谁も解决していません.自分で试してやっと解决しました.だから、みんなの参考にして、まずソースコードを贴ります.
/**********************************************
 *     :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 ‘’/home/linux/driver/experiment/ex04/hello.c:25:2: error: negative width in bit-field ‘’ 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);
いいですよ.