环境:Fedora 12 (linux-2.6.31.5)
内核: linux-2.6.31.5
GCC: 4.4.2
STEP 1: 启动Fedora 12,查看Fedora 12的内核版本号,GCC版本号。明白这些后方便以后排错。
STEP 2:下载一个与Fedora 12相同版本的内核源代码linux-2.6.31.5,否则实验时一般会出现奇怪错误。为什么需要这个内核代码?因为Fedora 12自身带的内核代码没有usbip的代码。
STEP 3:解压源代码到/usr/src/kernels/.
STEP 4: 进入/usr/src/kernels/linux-2.6.31/drivers/staging目录,把里面的usb整个目录复制到/home/usbip.
mkdir /home/usbip
cp -r /usr/src/kernels/linux-2.6.31/drivers/staging /home/usbip
|
STEP 5:进入/home/usbip目录,为usbip编写新的Makefile,可以参考usbip-0.1.7里面的Makefile。在Makefile中,KSOURCE的值一定要是你的发行版正在使用的内核的源代码的目录,这样make的时候,使用的就是正在使用的内核的配置进行编译,那么编译的过程中不容易出错,产生的模块在加载的时候就不会出错,编译模块用的配置和当前运行的内核配置一样,那么二者同时运行时就肯定不会出错,因为用的配置一样,GCC也一样什么都一样!!(这个浪费了我N多时间)。Makefile如下:
DEBUG ?= n KSOURCE ?= /usr/src/kernels/2.6.31.5-127.fc12.i686.PAE
#%.x:%.c # gcc -o $@ $<
#KBUILD_VERBOSE:=1
HCD_HEADER:=$(KSOURCE)/drivers/usb/core/hcd.h
usbip_common_mod-objs := usbip_common.o usbip_event.o usbip-objs := stub_dev.o stub_main.o stub_rx.o stub_tx.o vhci-hcd-objs := vhci_sysfs.o vhci_tx.o vhci_rx.o vhci_hcd.o
obj-m += usbip_common_mod.o obj-m += usbip.o obj-m += vhci-hcd.o
EXTRA_CFLAGS += -DHCD_HEADER=\"$(HCD_HEADER)\"
ifeq ($(DEBUG),y) EXTRA_CFLAGS += -DCONFIG_USB_DEBUG endif
default: make -C $(KSOURCE) M=`pwd` modules
check: #make -C $(KSOURCE) LANG=C KBUILD_VERBOSE=${KBUILD_VERBOSE} C=1 M=`pwd` modules checkstack namespacecheck headers_check make -C $(KSOURCE) LANG=C KBUILD_VERBOSE=${KBUILD_VERBOSE} C=1 M=`pwd` modules
.PHONY: cscope cscope: cscope -b -k -R
.PHONY: clean clean: make -C $(KSOURCE) LANG=C KBUILD_VERBOSE=${KBUILD_VERBOSE} M=`pwd` clean rm -f *.x *~
|
STEP 6:make. 产生一个错误:
在包含自 /home/usbip/vhci_sysfs.c:21 的文件中: /home/usbip/vhci.h:21:32: 错误:../../usb/core/hcd.h:没有那个文件或目录 In file included from /home/usbip/vhci_sysfs.c:21: /home/usbip/vhci.h:129: 警告:‘struct usb_hcd’在形参表内部声明 /home/usbip/vhci.h:129: 警告:它的作用域仅限于此定义或声明,这可能并不是您想要的 /home/usbip/vhci.h: 在函数‘hcd_to_vhci’中: /home/usbip/vhci.h:131: 错误:提领指向不完全类型的指针 /home/usbip/vhci.h: 在函数‘vhci_to_hcd’中: /home/usbip/vhci.h:136: 错误:提领指向不完全类型的指针 /home/usbip/vhci.h:136: 警告:在‘__mptr’的声明中,类型默认为‘int’ /home/usbip/vhci.h:136: 错误:对未定义类型‘struct usb_hcd’的使用无效 /home/usbip/vhci.h: 在函数‘vhci_dev’中: /home/usbip/vhci.h:141: 错误:提领指向不完全类型的指针 make[2]: *** [/home/usbip/vhci_sysfs.o] 错误 1 make[1]: *** [_module_/home/usbip] 错误 2 make[1]: Leaving directory `/usr/src/kernels/linux-2.6.31.5' make: *** [default] 错误 2
|
这个错误是上面的Makefile犯下的,我的解决办法是直接在vhci_sysfs.c中用绝对路径把hcd.h包含进来。在vhci_sysfs.c中知道这个错误和vhci.h有关。打开vhci.h,
#include "../../usb/core/hcd.h"
改成:
#include "/usr/src/kernels/linux-2.6.31.5/drviers/usb/core/hcd.h"
|
STEP 7: 加载模块,modprobe subip.产生一个错误:
[root@localhost usbip]# modprobe usbip FATAL: Module usbip not found.
|
解决办法是,把产生的模块复制到/lib/moduels/${uname -r}/kernel.再执行模块依赖关系分析命令depmod,然后加载模块。
[root@localhost usbip]# cp *.ko /lib/modules/2.6.31.5-127.fc12.i686.PAE/kernel/ [root@localhost usbip]# depmod [root@localhost usbip]# modprobe usbip
|
STEP 8:至此,模块能够加载成功,为修改和调试usbip代码搭建好了开发平台。
STEP 9: 在此步骤之前,在同一个虚拟机上面装好了2个linux系统。在一个linux系统中,加载模块:
modprobe usbip modprobe usbip_common_mod
|
为了确保系统每次启动自动加载模块,修改gedit /etc/modules,加入:
STEP 10:按照usbip-0.1.7/src/README里的提示安装usbip命令工具包。OK!
参考:
http://www.symantec.com/connect/articles/compiling-drivers-linux-and-adding-them-your-linux-automation-image
附:
像这种错误:
[root@localhost usbip]# modprobe -f usbip FATAL: Error inserting usbip (/lib/modules/2.6.31.5-127.fc12.i686.PAE/kernel/usbip.ko): Invalid module format |
一般是由以下原因造成的:
- 所用内核源码版本号与目前使用的内核不同;
- 编译目标不同,比如编译的是i686,装好的是i386;
- 使用编译器版本不同;
- 目前使用的内核不是自己编译出来的。
阅读(8614) | 评论(0) | 转发(0) |