Как я создаю 4.15.7 ядер с LLVM/clang и драйвером Nvidia 390.25 x86_64 на Ubuntu 17.10 x86_64?

Это о моем успешном опыте в переводе в рабочее состояние Ubuntu 17.10 x86_64 на созданном из лязга Linux 4.15.7 kernel(последняя конюшня на данный момент) и собственный Nvidia 390.25(последний на данный момент) драйвер для моей видеокарты Nvidia GTX GeForce 860M.


Проблема

Ядро Linux 4.15.7 было создано с помощью clang как хост и целевой компилятор и установленный наряду с модулями на основе конфигурации ядра по умолчанию. Я должен был отключить exofs модуль, поскольку это имело нестандартный "VLAs, встроенный в структурах" это clang не поддерживает. Затем я также скомпилировал Nvidia 390.25 источник драйвера после извлечения его из его примирительного установщика - я должен был проигнорировать несоответствие версии компилятора, psuedo-предупреждающее, поскольку заголовки ядрa включали модель потока и также информацию о платформе, в то время как проверка сценария драйвера Nvidia привела только к версии.

После установки таким образом созданных модулей драйвера Nvidia, я перезагрузил свою систему, начальная загрузка Ubuntu 17.10 не завершалась - она застряла в Loading ... 4.15.7.

Далее изолировать проблемы совместимости (если таковые имеются) ядра с gcc/clang по сравнению с драйвером Nvidia с gcc/clang, Скомпилированное ядро Linux 4.15.7 с gcc и драйвер Nvidia 390.25 с clang, и наоборот. Для первого, процесс начальной загрузки, переданный Loading ... 4.15.7 фаза и перешедший на некоторых systemd сервис, но застрял там. Для второго, снова, это застряло в Loading ... 4.15.7 поэтапно осуществите снова. Система journalctl/ журналы не помог многому.

0
задан 10 April 2018 в 01:09

1 ответ

Этап 1: работая с Qemu/Kvm ранее, я хотел овладеть фактической провальной точкой в переводе в рабочее состояние созданного из лязга ядра. Так, я пытался поднять созданное из лязга ядро Linux 4.15.7 изображений с помощью x86_64 конфигурации по умолчанию для начала и также созданный из лязга busybox x86_64 для корневой файловой системы (initrd), на Qemu/kvm x86_64. Это работало. Я получил оболочку и busybox утилиты работали и так далее.

На хосте Ubuntu 17.10 x86_64:

$ strings -a defconfig-linux-4.15.7/linux-4.15.7/vmlinux | grep "clang version" | head -1
Linux version 4.15.7 (exp@exp) (clang version 5.0.0-3 (tags/RELEASE_500/final)) #1 SMP Fri Mar 2 21:15:24 PST 2018

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 17.10
Release:    17.10
Codename:   artful

$ clang -v
clang version 5.0.0-3 (tags/RELEASE_500/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

В госте Qemu/kvm, ядро Linux 4.15.7 (x86_64 defconfig)/Busybox 64-разрядный:

/ # cat /proc/version 
Linux version 4.15.7 (exp@exp) (clang version 5.0.0-3 (tags/RELEASE_500/final)) #1 SMP Fri Mar 2 21:15:24 PST 2018
/ # 

/ # uname -arv
Linux (none) 4.15.7 #1 SMP Fri Mar 2 21:15:24 PST 2018 x86_64 GNU/Linux
/ # 
/ # 
/ # strings -a bin/busybox | grep "clang version"
clang version 5.0.0-3 (tags/RELEASE_500/final)
/ # 
/ # 
/ # dmesg | grep QEMU
[    0.000000] DMI: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.9.3-0-ge2fc41e-prebuilt.qemu-project.org 04/01/2014
[    0.024000] smpboot: CPU0: Intel QEMU Virtual CPU version 2.5+ (family: 0x6, model: 0x6, stepping: 0x3)
[    0.337415] ata2.00: ATAPI: QEMU DVD-ROM, 2.5+, max UDMA/100
[    0.339072] scsi 1:0:0:0: CD-ROM            QEMU     QEMU DVD-ROM     2.5+ PQ: 0 ANSI: 5
/ # 
/ # 

Этап 2: С вышеупомянутым начальным успехом с defconfig ядром я взял хост конфигурация ядра Ubuntu 17.10 и восстановил ядро Linux 4.15.7 изображений. С этим я сохранил отдых busybox тем же и попытался поднять их на Qemu/kvm как ранее - это не работало. Приведший к general protection faults и kernel oops - kernel panic. Я изучил дамп стопки ядра.

Я заметил, что первый выпуск был в kernel irq work tick логика. Затем следующий выпуск был с kernel live instruction update логика. Я работал над ними обоими. Восстановленный ядро. Попробованный еще раз с Qemu/kvm - получил оболочку, никакая паника на этот раз. Следующий шаг должен был установить модули ядра и модули драйвера Nvidia также. Я сделал это, но на этот раз, со всеми модулями ядра Ubuntu и модулем драйвера Nvidia, Qemu/kvm показал некоторые цветные пиксели и застрял - главным образом должный различие между аппаратными средствами хоста и виртуализированными аппаратными средствами гостя. Так, я хотел попробовать только драйвером Nvidia, поскольку он вызвал главное беспокойство, поскольку это - то, которое я использую на своем хосте к графике. Так, я включал (не устанавливал), модули драйвера Nvidia в busybox rootfs и попробованный для перевода в рабочее состояние Qemu/kvm, как обычно - на этот раз, была некоторая паника ядра из-за rootfs-not-found, хотя был rootfs.

Так, я пытался сжать все модули драйвера Nvidia на zip и включать ее в rootfs. Но, когда я пытался извлечь zip с гостем Qemu/kvm, было no space left on device. Так, я пытался создать 10G виртуальный qemu диск и установить rootfs в том диске для обращения к беспокойству пространства - но, через некоторое время я отозвал это, когда я больше интересовался получением созданного из лязга драйвера Nvidia на реальном оборудовании системы, чем на эмулированной среде Qemu/kvm (я знаю, что это не имеет реальную видеокарту Nvidia в наличии через передачу GPU так, чтобы это могло протестировать созданный из лязга драйвер Nvidia 390.25 на нем, прежде чем я мог попробовать это на реальном оборудовании системы хоста / видеокарта, но дал ему выстрел так или иначе только, чтобы видеть, показывает ли созданный из лязга драйвер Nvidia какие-либо проблемы в Qemu/kvm при загрузке).

В госте Qemu/kvm, ядро Linux 4.15.7 (размещают конфигурацию Ubuntu 17.10 x86_64),/Busybox64-bit:

/ # cat /proc/version 
Linux version 4.15.7 (exp@exp) (clang version 5.0.0-3 (tags/RELEASE_500/final)) #20 SMP Sat Mar 3 20:46:15 PST 2018
/ # 
/ # 
/ # uname -arv
Linux (none) 4.15.7 #20 SMP Sat Mar 3 20:46:15 PST 2018 x86_64 GNU/Linux
/ # 
/ # 
/ # 
/ # dmesg | grep QEMU
[    0.000000] DMI: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.9.3-0-ge2fc41e-prebuilt.qemu-project.org 04/01/2014
[    0.024000] smpboot: CPU0: Intel QEMU Virtual CPU version 2.5+ (family: 0x6, model: 0x6, stepping: 0x3)
[    0.340776] ata2.00: ATAPI: QEMU DVD-ROM, 2.5+, max UDMA/100
[    0.343135] scsi 1:0:0:0: CD-ROM            QEMU     QEMU DVD-ROM     2.5+ PQ: 0 ANSI: 5
/ # 
/ # strings -a bin/busybox | grep "clang version"
clang version 5.0.0-3 (tags/RELEASE_500/final)
/ # 

Этап 3 и Успех: Поскольку моя основная и фактическая цель была моим хостом (Ubuntu 17.10), я установил это созданное из лязга ядро (с вышеупомянутыми проблемами, работавшими на) и драйверы Nvidia 390.25 в моей хост-системе непосредственно. Перезагруженный моя система. Обман! Я разбудил свою Ubuntu 17.10 x86_64 и работающий с созданным из лязга 4.15.7 ядер и созданный из лязга драйвер Nvidia 390.25 без любых проблем.

На хосте Ubuntu 17.10 x86_64 с созданным из лязга ядром Linux 4.15.7 и созданным из лязга Nvidia 390.25 GeForce GTX 860M собственный драйвер - мое успешное исследование и опыт:

$ dmesg | grep clang
[    0.000000] Linux version 4.15.7 (exp@exp) (clang version 5.0.0-3 (tags/RELEASE_500/final)) #20 SMP Sat Mar 3 20:46:15 PST 2018

$ cat /proc/version 
Linux version 4.15.7 (exp@exp) (clang version 5.0.0-3 (tags/RELEASE_500/final)) #20 SMP Sat Mar 3 20:46:15 PST 2018

$ uname -arv
Linux exp 4.15.7 #20 SMP Sat Mar 3 20:46:15 PST 2018 x86_64 x86_64 x86_64 GNU/Linux

$ nvidia-smi
Sun Mar  4 18:15:39 2018       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.25                 Driver Version: 390.25                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 860M    Off  | 00000000:01:00.0 Off |                  N/A |
| N/A   54C    P0    N/A /  N/A |    370MiB /  4046MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

exp@exp:~$ dmesg | grep NVIDIA | grep 390.25
[   17.643496] NVRM: loading NVIDIA UNIX x86_64 Kernel Module  390.25  Wed Jan 24 20:02:43 PST 2018 (using threaded interrupts)
[   17.689835] nvidia-modeset: Loading NVIDIA Kernel Mode Setting Driver for UNIX platforms  390.25  Wed Jan 24 19:29:37 PST 2018

$ lsmod | grep nvidia
nvidia_uvm            815104  0 
nvidia_drm             24576  2 
nvidia_modeset       1097728  5 nvidia_drm
nvidia              14352384  334 nvidia_uvm,nvidia_modeset
ipmi_msghandler        61440  2 nvidia,ipmi_devintf
drm                   454656  6 nvidia_drm,i915,drm_kms_helper

# clang-built Linux kernel 4.15.7 image and Nvidia 390.25 driver modules having clang compiler specific
# metadata within them.
#

$ eclang /lib/modules/4.15.7/build/vmlinux | grep "Linux"
++ strings -a /lib/modules/4.15.7/build/vmlinux
++ grep clang
Linux version 4.15.7 (exp@exp) (clang version 5.0.0-3 (tags/RELEASE_500/final)) #20 SMP Sat Mar 3 20:46:15 PST 2018
exp@exp:~$ eclang /lib/modules/4.15.7/kernel/drivers/video/nvidia.ko | head -1
++ strings -a /lib/modules/4.15.7/kernel/drivers/video/nvidia.ko
++ grep clang
clang version 5.0.0-3 (tags/RELEASE_500/final)

$ eclang /lib/modules/4.15.7/kernel/drivers/video/nvidia-drm.ko | head -1
++ strings -a /lib/modules/4.15.7/kernel/drivers/video/nvidia-drm.ko
++ grep clang
clang version 5.0.0-3 (tags/RELEASE_500/final)

$ eclang /lib/modules/4.15.7/kernel/drivers/video/nvidia-uvm.ko | head -1
++ strings -a /lib/modules/4.15.7/kernel/drivers/video/nvidia-uvm.ko
++ grep clang
clang version 5.0.0-3 (tags/RELEASE_500/final)

$ eclang /lib/modules/4.15.7/kernel/drivers/video/nvidia-modeset.ko | head -1
++ strings -a /lib/modules/4.15.7/kernel/drivers/video/nvidia-modeset.ko
++ grep clang
clang version 5.0.0-3 (tags/RELEASE_500/final)

# DMI specific hardware information - verifies and confirms the physical hardware used
# instead of QEMU or any other virtual platform for running clang-built kernel and
# Nvidia 390.25 driver.
#

$ sudo dmidecode -t bios | grep Vendor
    Vendor: LENOVO

$ sudo dmidecode -t system | grep "Manufacturer:\|Version"
    Manufacturer: LENOVO
    Version: Lenovo Y50-70 Touch

$ sudo dmidecode -t processor | grep Version
    Version: Intel(R) Core(TM) i7-4710HQ CPU @ 2.50GHz

ПРИМЕЧАНИЕ 1: Для всех подробных журналов (от каждого этапа), можно прочитать мой ответ для вопроса о ядре LLVM-Clang/Linux здесь: Создание ядра Linux с LLVM/clang.

ПРИМЕЧАНИЕ 2: предупреждение лязга более педантично, чем gcc, как я видел. Но, в настоящее время, для подъема драйвера ядра/Nvidia и выполнения я проигнорировал их, чтобы видеть, не ли они серьезны (до сих пор, они не).


ОБНОВЛЕНИЕ 1: Ради универсальности я повторил вышеупомянутое с последующими версиями ядра (4.15.10 и 4.15.11 который является последним по состоянию на середину марта 2018), и последний драйвер v390.42 GTX GeForce графики Nvidia, который является последним по состоянию на середину марта 2018 - они оба создали использование clang как ранее после обновления ядра 4.15.11 кодов в работе IRQ отмечают логику, и живая инструкция обновляют логику, как я сделал выше для 4.15.7 и наконец установил их обоих на своем оборудовании системы непосредственно (никакие эксперименты Qemu/kvm на этот раз, когда более ранние 4.15.7 ядер подошли успешно после работы на логику галочки работы IRQ, и живая инструкция обновляют логику). С этим, снова, Ubuntu 17.10 x86_64 успешно подошла на моем оборудовании системы на созданном из лязга ядре 4.15.11 и созданном из лязга последнем драйвере v390.42 Nvidia, как это сделало в более раннем случае ядра 4.15.7 и драйвера v390.25 Nvidia.

Ниже детали для Ubuntu 17.10 x86_64, работающей на созданном из лязга последнем v4.15.11 ядре и созданном из лязга последнем сценарии драйвера v390.42 Nvidia:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 17.10
Release:    17.10
Codename:   artful

$ cat /proc/version 
Linux version 4.15.11 (exp@exp) (clang version 5.0.0-3 (tags/RELEASE_500/final)) #2 SMP Tue Mar 20 05:37:06 PDT 2018

$ eclang /lib/modules/4.15.11/build/vmlinux | grep Linux
++ strings -a /lib/modules/4.15.11/build/vmlinux
++ grep clang
Linux version 4.15.11 (exp@exp) (clang version 5.0.0-3 (tags/RELEASE_500/final)) #2 SMP Tue Mar 20 05:37:06 PDT 2018

$ sudo dmidecode -t system | grep "Manufacturer:\|Version"
    Manufacturer: LENOVO
    Version: Lenovo Y50-70 Touch

$ dmesg | grep NVIDIA
[   19.491452] nvidia: module license 'NVIDIA' taints kernel.
[   19.499360] NVRM: loading NVIDIA UNIX x86_64 Kernel Module  390.42  Sat Mar  3 04:10:22 PST 2018 (using threaded interrupts)
[   19.542830] nvidia-modeset: Loading NVIDIA Kernel Mode Setting Driver for UNIX platforms  390.42  Sat Mar  3 03:30:48 PST 2018

$ nvidia-smi
Tue Mar 20 22:15:00 2018       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.42                 Driver Version: 390.42                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 860M    Off  | 00000000:01:00.0 Off |                  N/A |
| N/A   52C    P8    N/A /  N/A |    451MiB /  4046MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

$ glxinfo | grep NVIDIA
server glx vendor string: NVIDIA Corporation
client glx vendor string: NVIDIA Corporation
OpenGL vendor string: NVIDIA Corporation
OpenGL core profile version string: 4.5.0 NVIDIA 390.42
OpenGL core profile shading language version string: 4.50 NVIDIA
OpenGL version string: 4.6.0 NVIDIA 390.42
OpenGL shading language version string: 4.60 NVIDIA
OpenGL ES profile version string: OpenGL ES 3.2 NVIDIA 390.42

$ lsmod | grep nv
nvidia_uvm            815104  0 
nvidia_drm             24576  2 
nvidia_modeset       1105920  5 nvidia_drm
nvidia              14368768  334 nvidia_uvm,nvidia_modeset
ipmi_msghandler        61440  2 nvidia,ipmi_devintf
drm                   454656  6 nvidia_drm,i915,drm_kms_helper

$ ~/nvidia-driver-compiler.sh 
++ head -1
+++ uname -r
++ eclang /lib/modules/4.15.11/kernel/drivers/video/nvidia.ko
+++ strings -a /lib/modules/4.15.11/kernel/drivers/video/nvidia.ko
+++ grep clang
clang version 5.0.0-3 (tags/RELEASE_500/final)
++ head -1
+++ uname -r
++ eclang /lib/modules/4.15.11/kernel/drivers/video/nvidia-drm.ko
+++ strings -a /lib/modules/4.15.11/kernel/drivers/video/nvidia-drm.ko
+++ grep clang
clang version 5.0.0-3 (tags/RELEASE_500/final)
+++ uname -r
++ head -1
++ eclang /lib/modules/4.15.11/kernel/drivers/video/nvidia-modeset.ko
+++ strings -a /lib/modules/4.15.11/kernel/drivers/video/nvidia-modeset.ko
+++ grep clang
clang version 5.0.0-3 (tags/RELEASE_500/final)
+++ uname -r
++ head -1
++ eclang /lib/modules/4.15.11/kernel/drivers/video/nvidia-uvm.ko
+++ strings -a /lib/modules/4.15.11/kernel/drivers/video/nvidia-uvm.ko
+++ grep clang
clang version 5.0.0-3 (tags/RELEASE_500/final)

$ ~/nvidia_driver_modules_version.sh 
++ grep '^version='
+++ uname -r
++ strings -a /lib/modules/4.15.11/kernel/drivers/video/nvidia.ko
version=390.42
++ grep '^version='
+++ uname -r
++ strings -a /lib/modules/4.15.11/kernel/drivers/video/nvidia-drm.ko
version=390.42
++ grep '^version='
+++ uname -r
++ strings -a /lib/modules/4.15.11/kernel/drivers/video/nvidia-uvm.ko
+++ uname -r
++ grep '^version='
++ strings -a /lib/modules/4.15.11/kernel/drivers/video/nvidia-modeset.ko
version=390.42
0
ответ дан 30 October 2019 в 08:04

Другие вопросы по тегам:

Похожие вопросы: