初次尝试内核模块编译及运行,遇到了许多问题,但好歹也算是实现了基于linux 2.6 kernel的编译。
一。树莓派
一直在通过树莓派学习linux的知识,于是首先尝试基于树莓派的内核模块编译。内核编译需要Kernel-header,尝试sudo apt-cache search kernel-headers获取对应的内核头文件,发现没有对应版本的。直接编译会出现 insmod: error inserting 'hello.ko': -1 Invalid module format 的错误。于是参考http://blog.csdn.net/u010398378/article/details/50075417,下载对应的内核头文件包,继续编译,发现不存在/proc/config.gz。通过 sudo modprobe configs解决了这个问题。但是继续编译一直有generated/timeconst.h: No such file or directory的问题。
二。ubuntu 14.04版本
内核具体版本我忘记了,但是并非我想用的2.6内核,于是按照网上的教程进行2.6内核的安装,参考教程为http://blog.csdn.net/TrueLie/article/details/1715078?utm_source=jiancool和。。。。make时出现错误
- drivers/video/sstfb.c:150:6: error: #elif with no expression
- drivers/video/sstfb.c: In function ‘sst_detect_ics’:
- drivers/video/sstfb.c:990:26: warning: variable ‘n_clk1_b’ set but not used [-Wunused-but-set-variable]
- drivers/video/sstfb.c:990:16: warning: variable ‘n_clk0_7’ set but not used [-Wunused-but-set-variable]
- drivers/video/sstfb.c:990:6: warning: variable ‘n_clk0_1’ set but not used [-Wunused-but-set-variable]
- make[2]: *** [drivers/video/sstfb.o] Error 1
- make[1]: *** [drivers/video] Error 2
- make: *** [drivers] Error 2
将elif 改为else得以解决。(http://blog.csdn.net/twigliu/article/details/24940855)
接着cp /usr/src/linux-2.6.6/arch/i386/boot/bzImage时 发生错误。提示bzImage no such file,通过检查发现,arch的次级目录不是i386而是x86_64。然而最后编辑/etc/grub.conf文件时,要添加内核的信息作为启动项。添加完成后发生错误,系统直接无法启动。。。需要再次尝试。
三。ubuntu 10.04版本
自带2.6内核,符合学习要求。存在问题为无法更新软件,如vim无法通过apt-get install获得。通过更新软件源sudo gedit /etc/apt/source.list修改更新源,然而并不行。那就算了。。QAQ
直接通过http://www.cnblogs.com/huangwei/archive/2010/05/13/1734994.html,进行内核模块的编写和编译。出现问题是make无对象。是因为复制时,all:下一行开头是一个空格或者tab,并非许多空格。通过dmesg | tail -6查看最近6个结果,并modinfo hello查看模块信息,或者通过rmmod hello移除模块
代码见下:
1 #Makefile 2 obj-m :=hello.o #search for hello.c automatically 3 4 LINUX_KERN_DIR :=/usr/src/linux-headers-`uname -r` 5 6 all: 7 make -C $(LINUX_KERN_DIR) M=`pwd` modules
hello.c
/*hello.c*/ #include <linux/init.h> #include <linux/module.h> static int hello_init(void){ printk(KERN_ALERT "Hello,world\n"); return 0; } static void hello_exit(void){ printk(KERN_ALERT "Goodbye\n"); } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("GPL");
并可以这么操作
- MODULE_LICENSE("GPL"); // 版权
- MODULE_AUTHOR("zzg"); // 作者
- MODULE_DESCRIPTION("Hello_world test"); // 描述
- MODULE_VERSION("1.0.1"); // 版本
- MODULE_ALIAS("hello 01"); // 别名
接下去需要了解Makefile的编写,以及Char drivers的编写