分类: LINUX
2010-01-27 10:40:46
研究了一下,可以把ldd3的scull添加到内核里面去。内核采用的是
为了使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 debugging (NEW)
因为要试试调试,所以我选了[*] char device driver debugging。char 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.1GA的
编译安装内核模块和内核,重启进入。如果编译为模块,那么modprobe scull都是可以使用的;如果直接连入内核,那么直接cat /proc/kallsyms就可以找到scull导出的函数。
DEBUG也被正确的打开了,因为/proc/scullseq等文件都存在,而且/var/log/messages也能发现我的调试语句。
最后,我想试试我的ioctl程序,好像这样就可以,但不一定标准:
修改scripts/Makefile,加入scullioc的编译方法:
hostprogs-$(CONFIG_IKCONFIG) += bin
hostprogs-$(CONFIG_YUZG_CDEV_DEBUG) += scullioc
然后把scullioc.c和scullioc.h拷贝到scripts目录,还是先试验:
make scripts/
看来正常,没有问题。
后来我想这个程序会被安装到哪里去呢?都知道系统模块的话是安装到了/lib/modules/
build -> /home/yuzg/package/linux-
所以,还是不知道这个程序有没有被安装。
验证了一下连入内核的模块,启动时设置参数:
在/boot/grub/grub.conf中的启动选项中设置相关启动参数:
kernel /vmlinuz-
通过cat /proc/scullseq,可以确认设置成功了。
后来补充:
cat /sys/module/scull/parameters/scull_qset可以查看确认参数。
另外,估计当时没有修改参数的权限,也就是说,编译进内核的模块,启动时设置参数,不需要参数有写权限的。默认的代码是(当时应该没改动什么):
module_param(scull_qset, int, S_IRUGO);
这里设置了读权限,那么就会有上面的文件;如果这里设置为0,那么也就是没有任何权限,也就不会有上面的文件。
然而通过IOCTL,总是可以对参数进行重新赋值的。
如果没有任何参数是可读的,那么将不会有/sys/module/scull/parameters目录