• <linux/init.h>,<linux/module.h>头文件不存在等问题的解决方法


    这个问题真心是处理了一个下午,还自己去下载了个最新的内核拿来编译,其实是完全没必要的,因为ubuntu系统是可以直接下载新内核的。

    你可以在/usr/src/文件夹下找到这些内核文件夹,比如说我自己的系统:

    写博客的时候使用的是3.13.0-19的内核。

    写一个hello.c的测试文件:

     1 #include <linux/kernel.h> /*Needed by all modules*/
     2 #include <linux/module.h> /*Needed for KERN_* */
     3 #include <linux/init.h> /* Needed for the macros */
     4 
     5 MODULE_LICENSE("GPL");
     6 
     7 static int year=2014;
     8 
     9 static int hello_init(void)
    10 {
    11   printk(KERN_WARNING "Hello kernel, it's %d!
    ",year);
    12   return 0;
    13 }
    14 
    15 
    16 static void hello_exit(void)
    17 {
    18   printk("Bye, kernel!
    ");
    19 }
    20 
    21 /* main module function*/
    22 module_init(hello_init);
    23 module_exit(hello_exit);

    然后用kbuild标准写一个Makefile文件:

    1 obj-m := hello.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 

    obj-m := name.o表示会编译一个模块(-m),生成的name.o文件来自于name.c文件。

    uname -r 命令返回的实际就是你现在使用的内核版本,比如说我的系统:

    所以-C选项后面完整的路径是:/lib/modules/3.13.0-19-generic/build,但是不建议给出具体的路径,而是用$(shell uname -r)这种可变的路径,这样,当你在低版本内核中编译过,拿到高版本内核中再次编译的时候也能正常通过。

    编译完成之后能够看到模块文件:
    $sudo insmod ./hello.ko #加载
    $sudo rmmod hello #删除 或者 sudo rmmod ./hello.ko 

    如果是要在Eclipse中开发也是差不多的,不过有些地方要作修改,一是项目中Path and symbol那里似乎要添加内核的include文件夹,然后在symbol选项卡中需添加__MODULE__。

    还有,要关闭当前项目的makefile自动生成功能。

    如果你想要Eclipse集成环境来开发的话,选工程的时候请选Makefile project。自己写Makefile。

    其它都是差不多的,网上写的那些乱七八糟的又复杂又报错,真特么是各种坑爹。

    参考文档:

    http://www.cnblogs.com/QuLory/archive/2012/10/23/2736339.html

  • 相关阅读:
    (24)码表
    (23)IO之打印流 PrintStream & Printwriter
    (22)Properties,这不会Io流中的类,但是通常和IO流中的一些流配合使用
    (21)IO流之对象的序列化和反序列化流ObjectOutputStream和ObjectInputStream
    (20)IO流之SequenceInputStream 序列流
    01.vue基础
    02.1插值操作-Mustache语法
    jQuery对节点的增删改查和一些常用的逻辑处理
    递归 阶乘
    电脑远程连接
  • 原文地址:https://www.cnblogs.com/nerohwang/p/3621316.html
Copyright © 2020-2023  润新知