如何将依赖模块插入内核?

时间:2018-10-06 19:56:48

标签: linux linux-kernel driver ar.drone

我有一个运行Ubuntu的Parrot AR.Drone 2.0,我想使用电缆将其连接到单板计算机。无人机上没有以太网端口,因此我决定使用USB-以太网适配器(D-Link DUB-E100)。 在终端中输入uname -a后,我得到以下行:

Linux uclibc 2.6.32.9-g980dab2 #1 PREEMPT Mon Oct 6 11:50:23 CEST 2013 armv7l GNU/Linux

我遵循了this的文章,而不是使用wifi模块,而是使用了USB-以太网适配器模块。

这是我如何编辑Makefile:

TARGET  = dub_e100
OBJS    = dub_e100.o
MDIR    = drivers/net/usb
KDIR    = /home/artemii/Downloads/linux

EXTRA_CFLAGS = -DEXPORT_SYMTAB
PWD = $(shell pwd)
DEST = /home/artemii/Downloads/linux/$(MDIR)

obj-m      := $(TARGET).o

default:
    make -C $(KDIR) SUBDIRS=$(PWD) modules

$(TARGET).o: $(OBJS)
    $(LD) $(LD_RFLAG) -r -o $@ $(OBJS)

install:
    su -c "cp -v $(TARGET).ko $(DEST) && /sbin/depmod -a"

clean:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean

.PHONY: modules clean

-include $(KDIR)/Rules.make

之后,我用以下几行编译内核:

make
export ARCH=arm
export CROSS_COMPILE=arm-none-linux-gnueabi-
make 

随后我将生成的'dub_e100.ko'文件传输到无人机并运行以下命令行:

insmod dube100.ko

终端抛出错误insmod: can't insert 'dub_e100.ko': unknown symbol in module, or unknown parameter。 检查dmesg |尾巴给出:

usb 1-1:1.0: uevent
dub_e100: Unknown symbol mii_ethtool_sset
dub_e100: Unknown symbol mii_link_ok
dub_e100: Unknown symbol mii_nway_restart
dub_e100: Unknown symbol generic_mii_ioctl
dub_e100: Unknown symbol mii_ethtool_gset

我假设适配器的模块取决于mii模块,所以我生成了带有以下makefile的mii.ko文件:

TARGET  = dub_e100
OBJS    = dub_e100.o
MDIR    = drivers/net/usb
KDIR    = /home/artemii/Downloads/linux

EXTRA_CFLAGS = -DEXPORT_SYMTAB
PWD = $(shell pwd)
DEST = /home/artemii/Downloads/linux/$(MDIR)

obj-m      := $(TARGET).o
obj-m += mii.o

default:
    make -C $(KDIR) SUBDIRS=$(PWD) modules

$(TARGET).o: $(OBJS)
    $(LD) $(LD_RFLAG) -r -o $@ $(OBJS)

install:
    su -c "cp -v $(TARGET).ko $(DEST) && /sbin/depmod -a"

clean:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean

.PHONY: modules clean

-include $(KDIR)/Rules.make

此后,我立即在无人机上运行mii.kodube100.kolsmod中所有可见的模块。但是,将适配器插入无人机后,它会挤压并重新启动。重新启动后,该模块会从lsmod开始进行设计。 我做错什么了吗?我可能会错误地生成或运行模块。

1 个答案:

答案 0 :(得分:0)

json.foo do json.a @foo.a json.b @foo.b end 不处理模块依赖性。 manual page说:

  

insmod 是一个简单的程序,用于将模块插入内核。大多数用户将改为使用modprobe(8),它更聪明并且可以处理模块依赖性。

请注意,在insmod自动依赖项加载按预期工作之前,您可能必须运行depmod