关于linux模块编程
2015-03-25 17:05
281 查看
刚开始看linux设备驱动,就是大家都比较推崇的《LINUX设备驱动程序》(第三版)。看到了第一个hellworld的示例,就在自己的系统上试了一下,然后不那么爽。
具体代码如下:
于是乎就用gcc编译之
但是各种报错啊
在网上一顿神搜,未果。虽然很多时候都会有类似于
expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before XX
这样的东西出现,但是究其原因,真是五花八门。
(以下是我个人的一些啰嗦,如觉无意义可略过该段落)
针对于后面说“缺少文件”的问题,我到所说的目录里查看了一下,存在类似的文件,只是文件名不一样(要求的是asm/linkage.h,但是有asm-generic/linkage.h)。我甚至复制并更名了文件目录。但是编译后又出现了种种新的问题。然后我意识到,我这样随便更改/usr/src里的东西似乎不太好,一定是有某种其他的解决办法,于是又改了回去。后来我又怀疑是不是系统版本问题,书中说的测试环境是linux 2.6.x(典型环境是2.6.10),而我的是linux 3.13.0。我就考虑是否有必要安装一个2.6.10内核。下载之,make menuconfig(基本默认),make。然后又报了好多错,网上说编译2.6.10内核需要2.95.3版本的gcc,而linux 3.13.0的README里也有此说明,于是又在网上找了gcc 2.95.3的源码,编译之,又报了好多错。网上说是因为编译gcc 2.95.3的gcc的版本过高,我的是4.8.2。然后……我就有些力不从心了……
就在我头痛欲裂时,我发现了这篇帖子
http://www.it165.net/os/html/201403/7540.html
就写了一个Makefile
然后我就无敌了。
至于到底发生了什么,我觉得我以后可以回答这个问题。
具体代码如下:
1 #include <linux/kernel.h> 2 #include <linux/module.h> 3 #include <linux/init.h> 4 5 MODULE_LICENSE("GPL"); 6 7 static int hello_init(void) 8 { 9 printk("Hello, world\n"); 10 return 0; 11 } 12 13 static void hello_exit(void) 14 { 15 printk("Goodbye, cruel world\n"); 16 } 17 18 module_init(hello_init); 19 module_exit(hello_exit);
于是乎就用gcc编译之
gcc -I /lib/modules/3.13.0-46-generic/build/include/ -c hello_module.c
但是各种报错啊
In file included from hello_module.c:1:0: /usr/src/linux-headers-3.13.0-46/include/linux/init.h:153:13: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘load_default_modules’ void __init load_default_modules(void); ^ /usr/src/linux-headers-3.13.0-46/include/linux/init.h:154:12: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘init_rootfs’ int __init init_rootfs(void); ^ /usr/src/linux-headers-3.13.0-46/include/linux/init.h:254:13: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘parse_early_param’ void __init parse_early_param(void); ^ /usr/src/linux-headers-3.13.0-46/include/linux/init.h:255:13: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘parse_early_options’ void __init parse_early_options(char *cmdline); ^ In file included from /usr/src/linux-headers-3.13.0-46/include/linux/kernel.h:6:0, from /usr/src/linux-headers-3.13.0-46/include/linux/cache.h:4, from /usr/src/linux-headers-3.13.0-46/include/linux/time.h:4, from /usr/src/linux-headers-3.13.0-46/include/linux/stat.h:18, from /usr/src/linux-headers-3.13.0-46/include/linux/module.h:10, from hello_module.c:2: /usr/src/linux-headers-3.13.0-46/include/linux/linkage.h:7:25: fatal error: asm/linkage.h: 没有那个文件或目录
在网上一顿神搜,未果。虽然很多时候都会有类似于
expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before XX
这样的东西出现,但是究其原因,真是五花八门。
(以下是我个人的一些啰嗦,如觉无意义可略过该段落)
针对于后面说“缺少文件”的问题,我到所说的目录里查看了一下,存在类似的文件,只是文件名不一样(要求的是asm/linkage.h,但是有asm-generic/linkage.h)。我甚至复制并更名了文件目录。但是编译后又出现了种种新的问题。然后我意识到,我这样随便更改/usr/src里的东西似乎不太好,一定是有某种其他的解决办法,于是又改了回去。后来我又怀疑是不是系统版本问题,书中说的测试环境是linux 2.6.x(典型环境是2.6.10),而我的是linux 3.13.0。我就考虑是否有必要安装一个2.6.10内核。下载之,make menuconfig(基本默认),make。然后又报了好多错,网上说编译2.6.10内核需要2.95.3版本的gcc,而linux 3.13.0的README里也有此说明,于是又在网上找了gcc 2.95.3的源码,编译之,又报了好多错。网上说是因为编译gcc 2.95.3的gcc的版本过高,我的是4.8.2。然后……我就有些力不从心了……
就在我头痛欲裂时,我发现了这篇帖子
http://www.it165.net/os/html/201403/7540.html
就写了一个Makefile
1 obj-m := hello_module.o 2 3 all: 4 $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 5 6 clean: 7 $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
然后我就无敌了。
至于到底发生了什么,我觉得我以后可以回答这个问题。
相关文章推荐
- linux编程笔记 关于信号
- 关于Linux操作系统下C语言编程的注意事项
- 09.12.13 linux/unix编程学习途径 关于个人技术发展的一些考量
- IBM开发社区上关于Linux多线程编程的文章
- linux 2.6内核编程-加载模块的过程
- linux内核2.6中设备模块编程的解决方法
- 关于Linux的视频编程(v4l2编程)
- 关于linux图形界面编程基本知识
- 关于linux下的openmp编程基础[转]
- 关于Linux的视频编程(v4l2编程)
- 关于linux 下的编程
- Linux 2.6.xx 内核模块编程入门
- 关于linux进程编程的一些笔记整理
- linux 内核模块编程简要总结
- linux 关于编译模块缺少config.h而产生错误的问题
- 关于Linux操作系统下C语言编程的注意事项
- 关于Linux的视频编程
- linux模块编程-current引用错误
- linux 内核模块编程简要总结
- linux设备驱动编程-初探(2)--在内核中构造和运行模块