如何构建没有内核源代码树的外部内核模块

时间:2017-05-31 08:39:16

标签: c linux makefile linux-kernel

我有一个第三方软件包,可以编译内核模块和用户空间应用程序。不幸的是,这个第三方非常复杂,并且不使用Kbuild来构建内核模块(我试过没有成功)。

我尝试用以下几行构建一个简单的驱动程序:

    arm-linux-gnueabihf-gcc  -D__KERNEL__ -Wall -include /lib/modules/4.4.62-18.6-default/build/include/generated/autoconf.h -MD -MP   -Werror -O2 -I /usr/src/linux-4.4.62-18.6/include -I /src/include -DMODULE -c -o hello_dkm.o hello_dkm.c  
    $(LD) -o $(debug_target) $(LD_COMMON_FLAGS) -g $(debug_Objs)

我有:

fatal error: /usr/src/linux-4.4.62-18.6/include/linux/thread_info.h:54:29: fatal error: asm/thread_info.h: No such file or directory

附录

  • 平台:Altera Cyclone V SoC,ARM cortex A9双核
  • 内核:linux Altera 3.7.0
  • 主持人:Linux openSuse 42

PS:在我的团队的项目平台中,使用内核源代码树很难使用经典的编译行:     $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

提前致谢,

2 个答案:

答案 0 :(得分:0)

你当前的问题是" asm / thread_info.h"不在您的CPATH中,也未在任何-I参数中指定。您需要在系统上找到该文件,并将其根目录放入CPATH环境变量或-I指令。

要明确这一点,如果您在/usr/local/include/linux/asm/thread_info.h找到该文件,则必须在arm-linux-gnueabihf-gcc之前加CPATH=/usr/local/include/linux,或在命令行中的某处插入-I /usr/local/include/linux,也许在arm-linux-gnueabihf-gcc之后。

可能会有其他问题,但这应该会让你进入下一步。

答案 1 :(得分:0)

您可以使用(.ko文件)构建内核模块。使文件像

创建名为“Makefile”的Makefile,然后将此代码写入其中;

obj-m += drivername.o
all:
make -c /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -c /lib/modules/$(shell uname -r)/build M=$(PWD) clean

然后打开终端并在放置驱动程序的同一目录中写入make命令。这将生成驱动程序的.o和.ko文件。

用于插入驱动程序写insmod 驱动程序将加载到您的内核。

如果我不明白它会对你有所帮助