C-如何在没有内核源树的情况下构建外部内核模块



我有一个第三方SW软件包,可以编译内核模块和用户空间应用程序。不幸的是,这个第三方非常复杂,并且不使用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

预先感谢

您的直接问题是" 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之后。

可能还有其他问题,但这应该使您进入下一步。

您可以使用(.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驾驶员将加载到您的内核。

如果我不了解错误,这对您有帮助

最新更新