【问题标题】:Compiling a kernel module, header problems, makefile problems编译内核模块,头文件问题,makefile问题
【发布时间】:2025-12-05 03:30:02
【问题描述】:

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

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. 我需要将我的包含更新到什么以便它知道正确的目录(如果它类似于我正在使用的内核等,请解释我如何解决这个问题)。

  2. 谁能解释一下makefile 是如何知道调用gcc 和编译的?

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

-- 奖金问题

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

【问题讨论】:

    标签: c module linux-kernel


    【解决方案1】:

    对于 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) 等...,内核构建系统参与进来,并为您完成工作。

    【讨论】:

    • 谢谢你的回答兄弟,它也帮助我解决了我的问题。顺便说一句,你能告诉我在哪里可以像你一样学习编写makefile吗?一些教程或链接?
    【解决方案2】:

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

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

    这看起来可能是您的编译问题的原因。你有什么特别的原因改变它吗?

    【讨论】:

    • 猜我读到这一行:你必须使用你正在编译的内核的内核头文件。使用默认的 /usr/include/linux 将不起作用。并认为这意味着我需要找到我的 makefile 中提到的标头,我把它们放回去并得到相同的错误
    【解决方案3】:

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

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

    所以我猜你的 Makefile 中缺少包含目录。

    【讨论】: