0

我正在编写一个字符驱动程序以位于源代码树中 ahci 的修改版本之上。我基本上有这样的东西:

topdir
   |
   |- Makfile
   |
   |- mod_ahci
   |     | - Makefile, codefiles
   |
   |- char_interface
   |     | - Makefile, codefiles

现在,char_interface 需要来自 mod_ahci 的符号。EXPORT_SYMBOL()我对需要导出的符号有适当的宏使用。但是,我无法让 makefile 正确地从 char_interface 获取 mod_ahci 中的头文件。我的顶级 Makefile

ifneq ($(KERNELRELEASE),)
    obj-y := mod_ahci/ char_interface/

else
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)

default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

endif

char_interface 的生成文件(因为其他构建很好)

ifneq ($(KERNELRELEASE),)
    ccflags-y += -I../mod_ahci
    obj-m := char_interface.o

else
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build

default:
    $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules

modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules_install

endif

clean:
    -sudo rmmod ahcip
    -rm -f *.ko* *.mod.* *.o modules.order Modules.symvers

我在内核文档中引用了各种文本文件。例如,我现在指的是 .../Documentation/kbuild/makefiles.txt 以及 .../Documentation/kbuild/modules.txt。每当我构建时,我都会得到/home/captaink/devel/kmodtests/char_interface/char_interface.c:2:22: error: mod_ahci.h: No such file or directory. 目录中有一个名为mod_ahci.h的文件../mod_ahci。我ccflags-y在 char 驱动程序的 makefile 中使用了什么错误?

谢谢

4

1 回答 1

0

经过一番挖掘,我找到了问题的答案。我误解了makefile我从 LDD3 和内核文档中查看的 's 发生了什么(显然,这正是 O'Reilly 举他们的例子的地方)。构建系统实际上将目录更改为/usr/src/kernels/$(uname -r)/build(或类似),因为这就是编译器找不到我的头文件的原因。

我并不是说这是一种优雅的方式,但这是我修复它的方法。顶级目录中的makefile现在看起来像:

ifneq ($(KERNELRELEASE),)
    obj-y := mod_ahci/ char_interface/

else
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)

default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) TOP_DIR=$(PWD) modules

modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

endif

并且makefile在包含 char 驱动程序接口的子目录中如下所示:

ifneq ($(KERNELRELEASE),)
    ccflags-y += -I$(TOP_DIR)/mod_ahci
    obj-m := char_interface.o

else
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build

default:
    $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules

modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules_install

endif

clean:
    -sudo rmmod ahcip
    -rm -f *.ko* *.mod.* *.o modules.order Modules.symvers

如您所知,makefile 已被广泛复制。子目录可能不需要其中的“共享”makefile 内容,因为这是由更高级别的makefile 处理的。尽管如此,现在构建的模块和我所知道的字符驱动程序都知道我在修改后的 ahci 驱动程序中制作的导出符号。

我希望这可以帮助像我这样的新手,了解 Linux 内核构建世界和 Linux 内核驱动程序。

于 2015-05-08T23:03:16.263 回答