萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Ubuntu 13.10 安裝 NVIDIA 顯卡驅動報錯修復方案

問題背景

在 Ubuntu 13.10(核心 3.11+) 上執行 NVIDIA-Linux-x86_64-319.60.run 安裝驅動時,編譯核心模組失敗,常見錯誤為 drm_gem_private_object_init 介面變更與 num_physpages 符號缺失。

修補步驟

  1. 解壓安裝包:
    chmod +x NVIDIA-Linux-x86_64-319.60.run
    ./NVIDIA-Linux-x86_64-319.60.run -x
  2. 進入解壓目錄,建立 patchfile.diff,內容如下:
--- NVIDIA-Linux-x86_64-319.60/kernel/nv-drm.c	2013-09-26 01:02:38.000000000 +0400
+++ NVIDIA-Linux-x86_64-319.60/kernel/nv-drm.c	2013-10-02 14:00:03.617000000 +0400
@@ -201,12 +201,7 @@
 memset(&nv_obj->base, 0, sizeof(nv_obj->base));
 nv_obj->pages = pages;
 - ret = drm_gem_private_object_init(nvl->drm, &nv_obj->base, size);
 - if (ret)
 - {
 - status = RM_ERR_OPERATING_SYSTEM;
 - goto done;
 - }
 + drm_gem_private_object_init(nvl->drm, &nv_obj->base, size);
 ret = drm_gem_handle_create(file_priv, &nv_obj->base, handle);
 if (ret)

--- NVIDIA-Linux-x86_64-319.60/kernel/nv-linux.h	2013-09-26 01:02:38.000000000 +0400
+++ NVIDIA-Linux-x86_64-319.60/kernel/nv-linux.h	2013-10-02 14:01:31.461000000 +0400
@@ -1037,7 +1037,11 @@
 #endif
 #if !defined(NV_VMWARE)
 +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0)
 #define NV_NUM_PHYSPAGES num_physpages
 +#else
 +#define NV_NUM_PHYSPAGES get_num_physpages()
 +#endif
 #define NV_GET_CURRENT_PROCESS() current->tgid
 #define NV_IN_ATOMIC() in_atomic()
  1. 套用修補:
    patch -p0 < patchfile.diff
  2. 重新執行安裝程式:
    ./NVIDIA-Linux-x86_64-319.60.run

原理解析

  • 核心 3.11 移除 drm_gem_private_object_init 回傳值,改為 void,故需移除錯誤檢查邏輯。
  • num_physpages 變數在 3.11 後改為函式 get_num_physpages(),透過版本宏判斷相容。

此修補僅針對 319.60 版驅動於核心 3.11+ 環境;新版驅動(331+)已原生支援,建議優先使用發行版倉庫提供的 nvidia-* 套件或官方最新 runfile。

copyright © 萬盛學電腦網 all rights reserved