繁体   English   中英

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

[英]how to Build external kernel module without kernel source tree

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

为了清楚arm-linux-gnueabihf-gcc ,如果将文件放在/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将驱动程序加载到您的内核。

如果我不明白错误会为您提供帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM