Chinaunix首页 | 论坛 | 博客
  • 博客访问: 836896
  • 博文数量: 91
  • 博客积分: 2544
  • 博客等级: 少校
  • 技术积分: 1885
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-12 09:08
文章存档

2016年(10)

2014年(2)

2013年(4)

2012年(23)

2011年(23)

2010年(13)

2009年(14)

2007年(2)

分类: LINUX

2010-04-05 11:01:35

linux 模块编程

1, 先准备好编译环境
  最好是重新编译内核,并用编译好的内核启动和运行系统,注意不好删除编译的源码文件,保留内核源码,在编译模块时要用到源码树。现在一切就绪,可以开始编写我们自己的模块了。

2, 最简单的模块
 

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>

static int __init hello_init(void)
{
    printk("hello world!\n");
    return 0;
}

static void __exit hello_exit(void)
{
    printk("goodbye world!\n");
}

MODULE_LICENSE("GPL");

module_init(hello_init);
module_exit(hello_exit);


Makefile的内容

obj-m := hello.o

all :
    make -C /root/linux-2.6.28 SUBDIRS=`pwd` modules

clean :
    rm *.o *.ko *.mod.c *.order *.symvers

2.1 运行模块
#insmod ./hello.ko
可以看到有信息输出了把,说明模块安装成功了。不过这个模块什么也做不了。它只能告诉你它已经活了。
#lsmod | grep hello

#cat /proc/modules | grep hello
可以看到模块已经被加载上了。

3,带参数的模块


#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("GPL");

static char *book_name = "lld3";
static int num = 400;


static int book_init(void)
{
    printk(KERN_ALERT "book name : %s\n", book_name);
    printk(KERN_ALERT "book num : %d\n", num);
    return 0;
}

static void book_exit(void)
{
    printk(KERN_INFO "book module exit\n ");
}

module_init(book_init);
module_exit(book_exit);

module_param(num, int, S_IRUGO);
module_param(book_name, charp, S_IRUGO);

MODULE_AUTHOR("Hover");
MODULE_DESCRIPTION("A simple module with parameter");
MODULE_VERSION("V1.0");


3.1 Makefile的内容

obj-m := m_para.o

all :
    make -C /root/linux-2.6.28 SUBDIRS=`pwd` modules

clean :
    rm *.o *.ko *.mod.c *.order *.symvers

3.2 运行
注意这次的模块是可以加参数的了
#insmod m_para book_name="hellobook" num=1000
可以看到输出信息了,说明模块加载好了。

待续...
阅读(1512) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~