Chinaunix首页 | 论坛 | 博客
  • 博客访问: 107753
  • 博文数量: 41
  • 博客积分: 2520
  • 博客等级: 少校
  • 技术积分: 440
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-22 16:25
文章分类

全部博文(41)

文章存档

2010年(41)

我的朋友

分类: LINUX

2010-01-27 10:40:46

研究了一下,可以把ldd3的scull添加到内核里面去。内核采用的是2.6.22.1

 

为了使make menuconfig时有配置选项,需要修改drivers/Kconfig。模仿已有的驱动(驱动都是以目录分开来存放),添加下面的语句:

 

source "drivers/kvm/Kconfig"

 

source "drivers/yuzgdev/Kconfig"

 

endmenu

 

建立自己的目录drivers/yuzgdev,编辑drivers/yuzgdev/Kconfig

#

# yuzgtest configuration

#

menu "yuzg's device test"

 

config YUZG_DEV

        bool "test case of device"

        depends on X86

        default y

        help

          yuzg's device driver test

 

          If unsure, say N.

 

config YUZG_CDEV

        tristate "char device driver"

        depends on YUZG_DEV

        default m

        help

          char device

 

config YUZG_CDEV_DEBUG

        bool "char device driver debugging"

        depends on YUZG_DEV

        default n

        help

          Say Y here if you want

 

          When in doubt, say N.

 

endmenu

 

这样的话,make menuconfig时就可以对我的驱动进行配置了:

Device Drivers  --->

yuzg's device test  --->

                                     [*] test case of device (NEW)

   char device driver (NEW)

[ ]   char device driver debugging (NEW)

 

因为要试试调试,所以我选了[*]   char device driver debuggingchar device driver (NEW)这一项我也分别试了*M,都是可以正常工作的。

 

基本Kconfig的界面设置这样就可以了,下面是驱动代码和Makefile

 

首先改drivers/Makefile,加上下面的语句,表明将进入yuzgdev目录:

obj-$(CONFIG_YUZG_DEV)          += yuzgdev/

然后编辑drivers/yuzgdev/Makefile

#

# Makefile for yuzg device driver module

#

 

scull-objs := main.o pipe.o access.o

obj-$(CONFIG_YUZG_CDEV) += scull.o

 

ifeq ($(CONFIG_YUZG_CDEV_DEBUG),y)

EXTRA_CFLAGS += -DSCULL_DEBUG

endif

 

表明我有三个目标文件,一起连接可以生成模块scull.ko。如果定义了DEBUG,则打开代码的DEBUG选项。

 

之后把相关的代码拷贝过来,当然之前要保证这个代码是可以正确的编译为模块的(make M=drivers/yuzgdev

结果报什么头文件不存在,原来是因为我当前的内核是RHEL5.1GA2.6.18,这里不兼容。添加了缺少的头文件,再试试OK了。

 

编译安装内核模块和内核,重启进入。如果编译为模块,那么modprobe scull都是可以使用的;如果直接连入内核,那么直接cat /proc/kallsyms就可以找到scull导出的函数。

 

DEBUG也被正确的打开了,因为/proc/scullseq等文件都存在,而且/var/log/messages也能发现我的调试语句。

 

最后,我想试试我的ioctl程序,好像这样就可以,但不一定标准:

修改scripts/Makefile,加入scullioc的编译方法:

hostprogs-$(CONFIG_IKCONFIG)     += bin2c

hostprogs-$(CONFIG_YUZG_CDEV_DEBUG) += scullioc

然后把scullioc.cscullioc.h拷贝到scripts目录,还是先试验:

make scripts/

看来正常,没有问题。

 

后来我想这个程序会被安装到哪里去呢?都知道系统模块的话是安装到了/lib/modules/2.6.22.1/下,我就去这里找找看。果然找到了/lib/modules/2.6.22.1/build/scripts/scullioc。但因为build目录是个连接,ll /lib/modules/2.6.22.1/

build -> /home/yuzg/package/linux-2.6.22.1

所以,还是不知道这个程序有没有被安装。

 

 

验证了一下连入内核的模块,启动时设置参数:

/boot/grub/grub.conf中的启动选项中设置相关启动参数:

kernel /vmlinuz-2.6.22.1 ro root=LABEL=/ scull.scull_qset=800

 

通过cat /proc/scullseq,可以确认设置成功了。

后来补充:

cat /sys/module/scull/parameters/scull_qset可以查看确认参数。

另外,估计当时没有修改参数的权限,也就是说,编译进内核的模块,启动时设置参数,不需要参数有写权限的。默认的代码是(当时应该没改动什么):

module_param(scull_qset, int, S_IRUGO);

 

这里设置了读权限,那么就会有上面的文件;如果这里设置为0,那么也就是没有任何权限,也就不会有上面的文件。

然而通过IOCTL,总是可以对参数进行重新赋值的。

 

如果没有任何参数是可读的,那么将不会有/sys/module/scull/parameters目录

阅读(543) | 评论(0) | 转发(0) |
0

上一篇:Xenbus (2)

下一篇:Kernel Audit System (1)

给主人留下些什么吧!~~