linux 2.6下编译最简单的hello.ko驱动

 

linux 2.6下编译最简单的hello.ko驱动

1.下载kernel源码 http://www.kernel.org/
2.配置内核
luther@gliethttp:~/work/kernel/linux-2.6.22.14$ make oldconfig
luther@gliethttp:~/work/kernel/linux-2.6.22.14$ make prepare
luther@gliethttp:~/work/kernel/linux-2.6.22.14$ make scripts 否则提示:MODPOST 1 modules /bin/sh: scripts/mod/modpost: not found
3.写测试程序hello.c
//luther
@gliethttp:~/work/kernel/module_drivers/hello$ vim hello.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

static int init_hello_4(void)
{
   printk(KERN_ALERT "Hello, world 4 ");
   return 0;
}

static void cleanup_hello_4(void)
{
   printk(KERN_ALERT "Goodbye, world 4 ");
}

module_init(init_hello_4);
module_exit(cleanup_hello_4);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Playmud");
MODULE_DESCRIPTION("Test only!");
4.配置Makefile和执行ko编译
luther@gliethttp:~/work/kernel/module_drivers/hello$ echo "obj-m:=hello.o" > Makefile
luther@gliethttp:~/work/kernel/module_drivers/hello$ make -C /usr/src/`uname -r` M=`pwd` modules
我下载的内核位置为~/work/kernel/linux-2.6.22.14,所以这里指定为:
luther@gliethttp:~/work/kernel/module_drivers/hello$ make -C ../../linux-2.6.22.14 M=`pwd` modules
make: Entering directory `/home/
luther/work/kernel/linux-2.6.22.14'

  WARNING: Symbol version dump /home/luther
/work/kernel/linux-2.6.22.14/Module.symvers
           is missing; modules will have no dependencies and modversions.

  Building modules, stage 2.
  MODPOST 1 modules
  CC /home/luther/work/kernel/module_drivers/hello/hello.mod.o
  LD [M] /home/luther/work/kernel/module_drivers/hello/hello.ko
make: Leaving directory `/home/luther/work/kernel/linux-2.6.22.14'

luther@gliethttp:~/work/kernel/module_drivers/hello$



上面的做法当然是可以,但是老是提示:
WARNING: Symbol version dump /home/luhter/work/kernel/linux-2.6.22.14/Module.symvers is missing; modules will have no dependencies and modversions.

通过摸索,原来,编译hello.ko其实是非常简单的,不用下载kernel源码,
写测试程序hello.c
//luther@gliethttp:~/work/kernel/module_drivers/hello$ vim hello.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

static int init_hello_4(void)
{
   printk(KERN_ALERT "Hello, world 4 ");
   return 0;
}

static void cleanup_hello_4(void)
{
   printk(KERN_ALERT "Goodbye, world 4 ");
}

module_init(init_hello_4);
module_exit(cleanup_hello_4);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Playmud");
MODULE_DESCRIPTION("Test only!");
4.配置Makefile和执行ko编译
luther@gliethttp:~/work/kernel/module_drivers/hello$ echo "obj-m:=hello.o" > Makefile
luther@gliethttp:~/work/kernel/module_drivers/hello$ make -C /lib/modules/`uname -r`/build M=`pwd` modules
make: Entering directory `/usr/src/linux-headers-2.6.22-14-generic'
  CC [M]  /home/
luther/work/kernel/module_drivers/hello/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/
luther/work/kernel/module_drivers/hello/hello.mod.o
  LD [M]  /home/
luther/work/kernel/module_drivers/hello/hello.ko
make: Leaving directory `/usr/src/linux-headers-2.6.22-14-generic'
luther@gliethttp:~/work/kernel/module_drivers/hello$

/lib/modules/`uname -r`/build就是本地ubuntu机子的module编译配置目录

不是为正在运行的内核编译模块:
make -C <path-to-kernel> M='pwd'
为正在运行的内核编译模块:
make -C /lib/modules/'uname -r'/build M='pwd'

不用下载kernel,直接就在本地机搞定了!

printk没有在console上打印出提示,通过
luther@gliethttp:~/work/kernel/module_drivers/hello$ dmesg |tail
可以查到,具体配置可以查看
luther@gliethttp:~/work/kernel/module_drivers/hello$ vim /etc/syslog.conf

原文:http://blog.chinaunix.net/space.php?uid=20564848&do=blog&cuid=707711

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值