Получение версии ядра из модуля ядра Linux во время выполнения - PullRequest
6 голосов
/ 07 ноября 2011

как я могу получить информацию о времени выполнения, какая версия ядра запускается из кода модуля ядра Linux (режим ядра)?

Ответы [ 3 ]

18 голосов
/ 07 ноября 2011

По соглашению, механизм загрузки модулей ядра Linux не позволяет загружать модули, которые не были скомпилированы с работающим ядром, поэтому «работающее ядро», на которое вы ссылаетесь, скорее всего, уже известно во время компиляции модулей ядра.

Для получения строковой константы версии, более старые версии требуют, чтобы вы включили <linux/version.h>, другие <linux/utsrelease.h> и более новые <generated/utsrelease.h>.Если вы действительно хотите получить больше информации во время выполнения, тогда функция utsname() из linux/utsname.h является наиболее стандартным интерфейсом времени выполнения.

Реализация виртуального узла /proc/version procfs использует utsname()->release.

Если вы хотите обработать код на основе версии ядра во время компиляции, вы можете использовать блок препроцессора, такой как:

#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
...
#else
...
#endif

Это позволяет сравнивать мажор / минор.версии.

3 голосов
/ 07 ноября 2011

Вы можете безопасно собрать модуль только для одной версии ядра за раз. Это означает, что запрос от модуля во время выполнения является излишним.

Вы можете выяснить это во время сборки, посмотрев значение UTS_RELEASE в последних ядрах, которое находится в <generated/utsrelease.h> среди других способов сделать это.

0 голосов

Почему я не могу собрать модуль ядра для любой версии?

Поскольку API модуля ядра нестабилен по конструкции, как описано в дереве ядра по адресу: Documentation/stable_api_nonsense.txt. Резюме гласит:

Executive Summary
-----------------
You think you want a stable kernel interface, but you really do not, and
you don't even know it.  What you want is a stable running driver, and
you get that only if your driver is in the main kernel tree.  You also
get lots of other good benefits if your driver is in the main kernel
tree, all of which has made Linux into such a strong, stable, and mature
operating system which is the reason you are using it in the first
place.

См. Также: Как собрать модуль ядра Linux, чтобы он был совместим со всеми выпусками ядра?

Как это сделать во время компиляции спросили: Есть ли определение макроса для проверки версии ядра Linux?

...