Linux 内核驱动程序构建 (NVidia) 的未定义符号

Posted

技术标签:

【中文标题】Linux 内核驱动程序构建 (NVidia) 的未定义符号【英文标题】:Undefined symbols with Linux kernel driver build (NVidia) 【发布时间】:2014-03-01 04:55:38 【问题描述】:

我的内核驱动程序构建有问题。我正在构建一个自定义(尽管非常基本)NVidia RDMA 驱动程序,并且在生成文件期间收到构建警告。具体来说,它正在寻找两个 NVidia API 调用 nvidia_p2p_put_pages 和 nvidia_p2p_get_pages。使用“nm”可以看到这些入口点位于 NVidia 驱动程序模块 (nvidia.ko) 中。但是,我对 Linux 驱动程序 make 文件系统的内部结构不够熟悉,无法在构建时定位这些入口点。

RDMA 工具包文档引用了一个提取脚本“./NVIDIA-Linux-x86_64-.run”和一个构建目录。但是,在提取最新的驱动程序源后,我无法找到任何构建文件。

如您所知,我对此很陌生。任何帮助将不胜感激。 谢谢

【问题讨论】:

根据documentation,这些符号可以在nv-p2p.h头文件中找到。你包括那个头文件吗?听起来您想知道要链接哪些库,但是如果您提供您看到的 实际错误输出,这个问题的清晰度可能会得到改善。您还可以提及您使用的驱动程序版本以及安装程序(.run 文件)的位置。 下载nvidia驱动运行文件安装程序,如319.72。使用sh NVIDIA-L... --advanced-options 获取命令行选项使用sh NVIDIA-L... -x 运行仅提取作业然后切换到创建的目录。你会看到一堆 nvidia 库。然后切换到kernel目录,可以看到nv-p2p.h等头文件。您还会发现一个整体的makefile 和一个Makefile.nvidia,它显示了如何构建内核模块。 这就是我要找的。警告似乎是链接问题的移动:警告:“nvidia_p2p_put_pages”[//kernel_module/gpudirect_rdma.ko] 未定义!警告:“nvidia_p2p_get_pages”[//kernel_module/gpudirect_rdma.ko] 未定义!你的第二套指令似乎是我需要的。我很快就会试一试。谢谢。 成功了,罗伯特。谢谢! 【参考方案1】:

基本的 GPUDirect RDMA 文档是 here。 如section 4.3所示,构建nvidia驱动linux内核模块需要各种驱动头文件和makefile。

可以通过以下方式访问这些文件:

    获取适当的 NVIDIA linux 驱动程序安装程序(.run 文件),例如 319.72 here

    所有 nvidia linux 驱动程序安装程序都有命令行开关选项。基本选项可以通过将--help附加到驱动安装程序命令字符串中找到,例如:

    sh NVIDIA-Linux-x86_64-319.72.run --help
    

    可以通过以下方式访问更多高级选项:

    sh NVIDIA-Linux-x86_64-319.72.run --advanced-options
    

    其中一个高级选项是-x,它只会提取驱动程序文件,不会“安装”任何文件:

    sh NVIDIA-Linux-x86_64-319.72.run -x
    

    这将创建一个文件可用的目录。在此目录中,kernel 目录包含必要的头文件和示例内核模块makefile,可用于学习要链接的适当库:

    cd NVIDIA-Linux-x86_64-319.72/kernel
    

【讨论】:

以上是关于Linux 内核驱动程序构建 (NVidia) 的未定义符号的主要内容,如果未能解决你的问题,请参考以下文章

无法加载内核模块“nvidia.ko”

活久见!NVIDIA正式开源其Linux GPU内核模块

linux 安装NVIDIA闭源驱动

对 nvidia GPU 上的计算单元和预期内核的混淆

配置 Nvidia GPU 主机的运行环境

fedora 下 安装 nvidia驱动,总是出错,最后的错误是 unable to load the kernel module 'nvidia.ko'