Важен ли порядок модулей ядра NVIDIA в mkinitcpio?

Это не чушь, в Linux есть законный способ добиться этого, и ваши ожидания ошибочны.

Строки аргументов и окружения, передаваемые ядром в код запуска программы, хранятся в обычной виртуальной памяти пространства приложения, как и любые другие данные программы; и, как и любые другие переменные данных программы, их можно изменять. Программы могут изменять их совершенно законно.

(Обратите внимание, что это с точки зрения того, что ядро ​​предоставляет и обеспечивает соблюдение. То, что могут сказать стандарты для определенных языков программирования, не обязательно одно и то же. Но что касается ядра, это просто область виртуальная память пространства приложения для данных программы, которая доступна для чтения и записи.Ядро не заботится о том, на каком языке программирования вы скомпилировали свой машинный код.)

Файл / proc / $ {PID} / Environment - это просто окно в эту виртуальную память пространства приложения. Вместо того, чтобы запоминать фактические данные среды процесса, Linux просто запоминает начальный и конечный адреса области среды, с которой был запущен процесс, а файл / proc / $ {PID} / окружающая среда просто читает выкинь все, что есть в этой памяти прямо сейчас. Не следует ожидать, что этот файл содержит список строк с завершением ␀. Это ошибочное ожидание.

Не существует библиотечной функции GNU C для изменения памяти, содержащей эти строки. Но у разных программ есть свои функции для этого.

Например, рассмотрим OpenSSH. Сервер OpenSSH изменяет то, что ps показывает для своего вектора аргументов, чтобы читать такие вещи, как sshd: JdeBP [priv] .

Сервер OpenSSH содержит код, который пытается имитировать в Linux то, что он может делать с библиотекой BSD C в OpenBSD. В OpenBSD есть функция библиотеки BSD C с именем setproctitle () , которая перезаписывает вектор аргументов процесса, как сообщает команда ps . Он вызывает sysctl () для передачи нового вектора аргументов ядру, который ps может считывать с помощью sysctl () . FreeBSD имеет аналогичную функцию.

В Linux, как объяснялось, ядро ​​не запоминает фактические аргументы и среду, а только начальный и конечный адреса областей памяти, в которые оно изначально поместило их при запуске процесса.Таким образом, порт OpenSSH для Linux имеет функцию совместимости setproctitle () , которая вместо этого перезаписывает вышеупомянутую область памяти.

Эта функция совместимости вычисляет общий размер области среды и области аргументов и перезаписывает всю ее новой строкой аргументов. Это происходит потому, что в обычном случае программы, вызывающие setproctitle () , хотят записать более длинный набор данных аргументов, чем тот, который изначально имел процесс. sshd часто делает. Таким образом, он позволяет новым аргументам перезаписывать область окружения, следующую за областью аргументов, предоставляя программам больше места для более длинных наборов строк аргументов.

Важно отметить, что он также дополняет неиспользуемую часть области , которую не нужно было перезаписывать, до исходной длины общего аргумента и данных среды, с помощью ␀s.

И то, что вы видите, является точным результатом этого. Если вы обнаружите в своей системе серверный процесс OpenSSH, вы обнаружите, что он тоже имеет множество ␀ в своем / proc / $ {PID} / environmental .

Дополнительная литература

2
21.11.2017, 12:07
1 ответ

Я думаю, что ваш синтаксис неверен.

Переменная MODULESявляется массивом , поэтому присваивание ей должно выполняться с помощью(...):

MODULES=(ext4 dm_mod dm_crypt vfat nvidia nvidia_modeset nvidia_uvm nvidia_drm)
1
27.01.2020, 22:18

Теги

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