编译内核模块,头文件问题,makefile问题

时间:2010-09-15 03:11:05

标签: c module linux-kernel

好吧我正在尝试编译一个简单的内核模块,当我指向包含include的下面任何一个时,它会抱怨各种各样的东西。

linux-headers-2.6.31-21              linux-headers-2.6.31-22              
linux-headers-2.6.31-21-generic      linux-headers-2.6.31-22-generic      
linux-headers-2.6.31-21-generic-pae  linux-headers-2.6.31-22-generic-pae

我正在尝试按照以下网站上的说明操作: http://www.faqs.org/docs/kernel/x145.html

我将make文件更新为:

TARGET  := hello_world
WARN    := -W -Wall -Wstrict-prototypes -Wmissing-prototypes
INCLUDE := -isystem /usr/src/linux-headers-2.6.31-22-generic/include
CFLAGS  := -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE}
CC      := gcc

${TARGET}.o: ${TARGET}.c

.PHONY: clean

clean:
    rm -rf ${TARGET}.o

例如,当我输入make时,我得到以下错误以及更多,调查文件夹我看到处理器和缓存文件是asm-generic,如果它是世界的我应该如何编译它没有指向文件的正确位置?

/usr/src/linux-headers-2.6.31-22-generic/include/linux/prefetch.h:14:27: error: asm/processor.h: No such file or directory
/usr/src/linux-headers-2.6.31-22-generic/include/linux/prefetch.h:15:23: error: asm/cache.h: No such file or directory

最终目标(可怕)是建立一个虚拟文件系统,星期四......(是的,我知道这不太可能) 我理解了一些make文件,但奇怪的是我希望我能看到像$ {CC} $ {INCLUDE}之类的东西,这样的东西,但我根本看不到,

有人可以解释和/或以下所有问题吗?

  1. 我需要更新我的include以便它知道正确的目录(如果它类似于我正在使用的内核等,请解释我如何解决这个问题)。

  2. 有人可以解释makefile如何知道调用gcc和编译?

  3. 还有什么我需要知道才能编译这个东西吗?

  4. - 奖金问题

    1. 任何人都知道有关如何构建VFS的任何真正详细的教程,我有一个我们被分配到另一所学校的项目,http://oslab.info/index.php/Labs/HW4,并且基于我们之前完成的有限编程,它出现了是一项艰巨的任务。

3 个答案:

答案 0 :(得分:4)

使用2.6内核,您应该使用内核构建系统。以下是在内核树之外构建的模块的示例:

ifneq ($(KERNELRELEASE),)
# We were called by kbuild

obj-m += target.o

else  # We were called from command line

KDIR := /lib/modules/$(shell uname -r)/build
#KDIR := /home/cynove/src/kernel/linux-source-2.6.31
PWD  := $(shell pwd)

default:
    @echo '    Building target module 2.6 kernel.'
    @echo '    PLEASE IGNORE THE "Overriding SUBDIRS" WARNING'
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

install:
    ./do_install.sh *.ko

endif  # End kbuild check
######################### Version independent targets ##########################

clean:
    rm -f -r *.o *.ko .*cmd .tmp* core *.i

通过调用make -C($ KDIR)等...,内核构建系统会参与其中,并为您完成工作。

答案 1 :(得分:1)

您的链接的示例2.2包含以下行而不是您列出的行:

INCLUDE := -isystem /lib/modules/`uname -r`/build/include

这看起来像是编译问题的可能原因。你改变它的任何特殊原因?

答案 2 :(得分:0)

查看几个源树(2.6.32是我手头上最老的),没有processor.h的实例位于通用目录中,所有都是特定于体系结构的。例如

/usr/src/linux-headers-2.6.32-24/arch/x86/include/asm/processor.h

所以我猜你在Makefile中缺少一个include目录。