Chinaunix首页 | 论坛 | 博客
  • 博客访问: 356739
  • 博文数量: 73
  • 博客积分: 4096
  • 博客等级: 上校
  • 技术积分: 1102
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-21 14:53
文章分类
文章存档

2009年(3)

2008年(70)

我的朋友

分类: LINUX

2008-11-24 17:03:00

开发环境:Fedora 8
内核版本:2.6.23.1-42.fc8
编译器:GCC   (先在主机下做一些驱动的开发和验证,一方面,条件宽裕,另一方面,以后转入开发板,修改下编译器,再修改些设置,即可)
第一个驱动例程:

#filename:hello.c
#include
#include

MODULE_LICENCE("Dual BSD/GPL")

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

static void hello_exit(void)
{
      printk("Bye\n");
}
module_init(hello_init);      //宏。当驱动以模块方式加载时,加载的时候会去调用这个宏
module_exit(hello_exit);      //宏。当驱动以模块方式加载时,卸载的时候会去调用这个宏


Makefile如下:

KERNELDIR = /usr/src/kernel/2.6.23.1-42.fc8-i686   //设置内核头文件所在的位置。
PWD:=$(shell pwd)                                  //源文件的所在路径
CC = gcc                                           //编译器
obj-m:=hello.o                                                                    
modules:
       $(MAKE) -C $(KERNELDIR) M=$(PWD) modules    //-C $(KERNELDIR):指定内核源码的位置
                                                   //M=$(PWD):指定模块源码的位置
                                                   //modules:指向obj-m变量中设定的模块。
clean:
       rm -rf *.o *.mod.c
.PHONY:                                            //.PHONY:伪目标。
       modules clean

.PHONY:伪目标。是指,clean并不是一个生成的目标文件的名字,只是一个需要执行的命令。不是一个目标。
详见:http://blog.chinaunix.net/u/13991/showart_113965.html
#make
#insmod hello.ko
#dmesg
就可以看到打印的信息。因为内核中打印的信息并不一定输出到终端,会保存在一个特定的位置。

如何给内核模块传递参数?


如果希望给一个内核模块传递参数,则可以通过module_param()

module_param使用了3个参数: 变量名,它的类型,以及一个权限掩码。这个宏定义应当放在任何函数之外,典型的是出现在源文件的前面,定义如:


static int swap_xy = 0;

static int rotate = 0;

module_param(swap_xy, int, S_IRUGO);

module_param(rotate, int, S_IRUGO);


模块参数支持许多类型:


bool

invbool 一个布尔型(true或者false)值。

charp 一个字符指针值。内存为用户提供的字串分配,指针因此设置。

int

long

short

uint

ulong

ushort 基本的变长整型值。以 u 开头的是无符号值。


最后的 module_param 字段是一个权限值,应当使用中定义的值。这个值控制谁可以存取这些模块参数在sysfs中的表示。如果perm 被设为0,就没有sysfs项。否则,出现在/sys/module下面,并带有给定的权限。使用S_IRUGO作为参数可以被所有人读取,但是不能改变。S_IRUGO|S_IWUSR允许root来改变参数。注意,如果一个参数被sysfs修改,你的模块看到的参数值也改变了,但是你的模块没有任何 其他的通知。因此你应当不要使模块参数可写。

例程:


阅读(1192) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~