Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1047786
  • 博文数量: 297
  • 博客积分: 11721
  • 博客等级: 上将
  • 技术积分: 3431
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-25 10:21
文章分类

全部博文(297)

文章存档

2016年(9)

2011年(71)

2010年(137)

2009年(80)

分类: 嵌入式

2009-07-13 22:57:06

/* hello.c */

#include        /* Needed by all modules */
#include          /* Needed for the module-macros */
 
static int __init hello_init(void)    // Module entry function specified by module_init()
{
        printk("Hello,world!\n");
        return 0;
}
 
static void __exit hello_exit(void)  //Module exit function specified by module_exit()
{
        printk("Goodbye,cruel world!\n");
}
 
module_init(hello_init);
module_exit(hello_exit);
 
MODULE_LICENSE("Dual BSD/GPL");  //should always exist or you’ll get a warning
MODULE_AUTHOR("wfg"); //optional
MODULE_DESCRIPTION("STUDY_MODULE"); //optional
 
/* Makefile */
# Makefile2.6
ifneq ($(KERNELRELEASE),)
#kbuild syntax. dependency relationship of files and target modules are listed here.
obj-m +=hello.o
#obj-m :=gpio_driver.o
else
PWD :=$(shell pwd)
KEVER ?=$(shell uname -r)
#KDIR :=/home/wfg/linux-2.6.26.3/$(KEVER)/build
#KDIR :=/home/wfg/linux-2.6.26.3
KDIR :=/home/wuyan/download/linux-2.6.26
default:
 #$(MAKE) -C $(KDIR) M=$(PWD)
 make -C $(KDIR) M=$(PWD) modules
clean:
 rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions *.order *symvers
endif
 
obj-m := hello.o表示编译后生成hello.o模块。
$(KDIR) 指定了内核源码的路径,“M=”表示这是个外部模块,M=$(PWD) 指定了该模块文件所在的路径。
注: makefile预定义了$(PWD)变量,此处可以不必重复定义。
 
执行#make编译成功后将生成的hello.ko拷贝到nfs文件系统。需要注意的是insmod等模块加载命令需要从lib/modules/2.6.26.6
的目录下加载模块,所以必须先建立此目录,然后将模块放到此目录下面,否则将出现以下两种情况:
一是没有建立lib/modules/2.6.26.6目录,取决于内核版本号,将出现insmod: chdir(2.6.26.6): No such file or directory的错误
二是只将模块简单地放在根目录或其它文件夹,没有将其拷贝到指定的lib/modules/2.6.26.6目录,将出现
insmod: module 'gpio_driver' not found错误
 
 
加载到开发板上运行
#insmod hello.ko
Hello,world!
#lsmod 输出内核已加载模块信息,可以查看到刚刚加载成功的hello模块
……
Module                  Size  Used by
hello                   5632  0
 
卸载模块
#rmmod hello
无提示消息:
(1)查看内核消息 dmesg
(2)
<1> 将"printk(KERN_ALERT "Hello World enter!\n");”一句中的“KERN_ALERT”换成"KERN_EMERG"以提高内核打印的优先级(0);
<2> 同理将printk(KERN_ALERT "Hello world exit!\n");改成printk(KERN_ALERT "Hello world exit!\n");
Goodbye,cruel world!
#lsmod 发现hello模块已经被卸载
阅读(1132) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~