Маркировка загружаемого модуля ядра как in-tree
этот вопрос касается ядра linux 4.10.
загрузка LKM вне дерева заставляет ядро печатать предупреждение:
module: loading out-of-tree module taints kernel.
это поднимает от этой регистрации модуль.c:
if (!get_modinfo(info, "intree")) {
чтение get_modinfo
это швы, что "intree" -это просто волшебная строка livnig внутри .
под управлением readelf
на случайном LKM, который я нашел в своей системе, показывает это:
readelf -a imon.ko | grep intree
161: 00000000000006c0 9 OBJECT LOCAL DEFAULT 13 __UNIQUE_ID_intree1
во время поиска intree
в простой пользовательский ЛКМ она не возвращает никаких результатов.
это действительно так?
как некоторые модули помечены как находящиеся в дереве? Это делается путем добавления макроса в модуль (например, MODULE_LICENCE) или путем создания модуля определенным образом или что-то еще?
1 ответов
короче говоря, система сборки ухитряется добавить строку MODULE_INFO(intree, "Y");
на "модуль.ультрасовременный.с" файлом, если, и только если модуль строится intree.
есть очевидный способ обмануть систему, добавив эту строку в один из обычных модуля ".c-файлы, но я не уверен, зачем вам это нужно.
более длинная версия....
внешние модули обычно строятся с помощью команды, подобной этой:
$ make M=`pwd` modules
или старый синтаксис:
$ make SUBDIRS=`pwd` modules
наличие непустого M
или SUBDIRS
заставляет верхний уровень ядра "Makefile" установить KBUILD_EXTMOD
переменной. Он не будет установлен для обычной сборки ядра.
для этапа 2 построения модуля (когда выводится сообщение "Building modules, stage 2") Выполните запуск "scripts/Makefile.modpost" в Makefile. Это работает scripts/mod/modpost
с различными вариантами, когда KBUILD_EXTMOD
установлен. В частности,-I
опция используется, когда KBUILD_EXTMOD
is набор.
глядя на источник modpost
в " Скрипты / mod / modpost.с"external_module
переменная имеет начальное значение 0, а -I
опция устанавливает его в 1. Функция add_intree_flag()
вызывается со вторым параметром is_intree
значение !external_module
. The