内核模块编译

初次尝试内核模块编译及运行,遇到了许多问题,但好歹也算是实现了基于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时出现错误

  1. drivers/video/sstfb.c:150:6: error: #elif with no expression  
  2. drivers/video/sstfb.c: In function ‘sst_detect_ics’:  
  3. drivers/video/sstfb.c:990:26: warning: variable ‘n_clk1_b’ set but not used [-Wunused-but-set-variable]  
  4. drivers/video/sstfb.c:990:16: warning: variable ‘n_clk0_7’ set but not used [-Wunused-but-set-variable]  
  5. drivers/video/sstfb.c:990:6: warning: variable ‘n_clk0_1’ set but not used [-Wunused-but-set-variable]  
  6. make[2]: *** [drivers/video/sstfb.o] Error 1  
  7. make[1]: *** [drivers/video] Error 2  
  8. 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");

 并可以这么操作

  1. MODULE_LICENSE("GPL");          // 版权  
  2. MODULE_AUTHOR("zzg");    // 作者  
  3. MODULE_DESCRIPTION("Hello_world test"); // 描述  
  4. MODULE_VERSION("1.0.1");    // 版本  
  5. MODULE_ALIAS("hello 01");   // 别名  

接下去需要了解Makefile的编写,以及Char drivers的编写

 

 
posted @ 2017-10-13 04:31  zz刚  阅读(292)  评论(0编辑  收藏  举报