在 Ubuntu 13.10(核心 3.11+) 上執行 NVIDIA-Linux-x86_64-319.60.run 安裝驅動時,編譯核心模組失敗,常見錯誤為 drm_gem_private_object_init 介面變更與 num_physpages 符號缺失。
chmod +x NVIDIA-Linux-x86_64-319.60.run./NVIDIA-Linux-x86_64-319.60.run -xpatchfile.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()
patch -p0 < patchfile.diff./NVIDIA-Linux-x86_64-319.60.rundrm_gem_private_object_init 回傳值,改為 void,故需移除錯誤檢查邏輯。num_physpages 變數在 3.11 後改為函式 get_num_physpages(),透過版本宏判斷相容。此修補僅針對 319.60 版驅動於核心 3.11+ 環境;新版驅動(331+)已原生支援,建議優先使用發行版倉庫提供的
nvidia-*套件或官方最新 runfile。