Как тестируется ядро ​​Linux? - PullRequest
244 голосов
/ 05 июля 2010

Как разработчики ядра Linux тестируют свой код локально и после того, как они его зафиксировали? Используют ли они какое-то модульное тестирование, автоматизацию сборки? планы испытаний?

Ответы [ 12 ]

70 голосов
/ 05 июля 2010

Ядро linux уделяет большое внимание тестированию в сообществе.

Обычно любой разработчик тестирует свой собственный код перед отправкой, и довольно часто он использует версию разработки от Linus или одну издругие нестабильные деревья / деревья разработки для проекта, относящиеся к их работе.Это означает, что они часто тестируют как свои изменения, так и изменения других людей.

Как правило, формальных планов тестирования не так много, но может потребоваться дополнительное тестирование, прежде чем функции будут объединены в деревья верхнего уровня.

Как отметил Дин, есть также несколько автоматических тестов, проект тестирования linux и автотест ядра ( хороший обзор ).

Разработчики часто также пишут автоматизированные тесты, предназначенные для тестирования их изменений, но я не уверен, что есть (часто используемый) механизм для централизованного сбора этих специальных тестов.

От того, какая область зависит, во многом зависитядро, конечно, меняется - тестирование, которое вы проводите для нового сетевого драйвера, сильно отличается от тестирования, которое вы проводите при замене алгоритма планирования ядра.

65 голосов
/ 07 июня 2012

Естественно, само ядро ​​и его части тестируются перед выпуском, но эти тесты охватывают только основные функциональные возможности.Существует несколько систем тестирования, которые выполняют тестирование ядра Linux:

Проект тестирования Linux (LTP) предоставляет тестовые наборы сообществу с открытым исходным кодом, которые проверяют надежность и стабильность Linux.Набор тестов LTP содержит набор инструментов для тестирования ядра Linux и связанных с ним функций.https://github.com/linux-test-project/ltp

Автотест - платформа для полностью автоматизированного тестирования.Он предназначен в первую очередь для тестирования ядра Linux, хотя он полезен для многих других целей, таких как квалификация нового оборудования, тестирование виртуализации и другое общее тестирование программ пользовательского пространства на платформах Linux.Это проект с открытым исходным кодом под лицензией GPL, который используется и разрабатывается рядом организаций, в том числе Google, IBM, Red Hat и многими другими.http://autotest.github.io/

Также существуют системы сертификации, разработанные некоторыми крупными дистрибьюторскими компаниями GNU / Linux.Эти системы обычно проверяют полные дистрибутивы GNU / Linux на совместимость с оборудованием.Существуют системы сертификации, разработанные Novell, Red Hat, Oracle, Canonical, Google .

. Существуют также системы для динамического анализа ядра Linux:

Kmemleak - это детектор утечки памяти, включенный в ядро ​​Linux.Он обеспечивает способ обнаружения возможных утечек памяти ядра способом, подобным трассирующему сборщику мусора, с той разницей, что потерянные объекты не освобождаются, а сообщаются только через / sys / kernel / debug / kmemleak.

Kmemcheck прерывает каждое чтение и запись в память, которая была выделена динамически (то есть с помощью kmalloc ()).Если читается адрес памяти, который ранее не записывался, в журнал ядра выводится сообщение.Также входит в состав ядра Linux

Fault Injection Framework (входит в состав ядра Linux), позволяющего внедрять ошибки и исключения в логику приложения для достижения более высокого охвата и отказоустойчивости системы.

56 голосов
/ 05 июля 2010

Как разработчики ядра Linux тестируют свой код локально и после того, как они его зафиксировали?

Используют ли они какой-либо модульный тест, автоматизацию сборки?

В классическом смысле слова нет.

E.г.Ingo Molnar выполняет следующую рабочую нагрузку: 1. собрать новое ядро ​​со случайным набором параметров конфигурации 2. загрузить его 3. перейти к 1

Каждая ошибка сборки, ошибка загрузки, ошибка или ошибка во время выполнения.24/7.Умножьте на несколько полей, и можно обнаружить довольно много проблем.

планы испытаний?

Нет.

Может быть недопонимание того, чтоесть центральная испытательная база, ее нет.Каждый делает то, что хочет.

14 голосов

Встроенные инструменты

Хороший способ найти инструменты тестирования в ядре:

В v4.0 это приводит меня к:

Kernel CI

https://kernelci.org/ - это проект, цель которого сделать тестирование ядра более автоматизированным и видимым.

ItПохоже, что он выполняет только тесты сборки и загрузки (TODO, как автоматически проверять работоспособность загрузки. Источник должен быть в https://github.com/kernelci/).

Linaro , кажется, является основным сопровождающим проекта, с участиеммногие крупные компании: https://kernelci.org/sponsors/

Linaro Lava

http://www.linaro.org/initiatives/lava/ выглядит как CI-система с фокусом на сборке плат разработки и ядре Linux.

ARM LISA

https://github.com/ARM-software/lisa

Не уверен, что он делает в деталях, но это ARM и Apache Licensed, так что, вероятно, стоит посмотреть,

Демонстрация: https://www.youtube.com/watch?v=yXZzzUEngiU

Шаговые отладчики

Не совсем модульное тестирование, но может помочь, если ваши тесты начнут давать сбой:

Моя собственная настройка QEMU + Buildroot + Python

Я также начал установку, сфокусированную на простоте разработки, но в итоге я добавил к ней также несколько простых возможностей тестирования: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/8217e5508782827320209644dcbaf9a6b3141724#test-this-repo

Я не проанализировал все остальные настройки очень подробно, и онискорее всего, гораздо больше, чем у меня, однако я считаю, что с моей настройкой очень легко начать быстро, потому что в ней много документации и автоматизации.

13 голосов
/ 21 июля 2010

Не очень просто автоматизировать тестирование ядра.Большинство разработчиков Linux проводят тестирование самостоятельно, очень похоже на упомянутое adobriyan.

Однако есть несколько вещей, которые помогают с отладкой ядра Linux:

  • kexec: Системный вызов, который позволяет вам поместить другое ядро ​​в память и перезагрузиться, не возвращаясь в BIOS, а в случае сбоя перезагрузить.
  • dmesg: Определенно место дляпоищите информацию о том, что произошло во время загрузки ядра и работает ли оно / не работает.
  • Инструментарий ядра: В дополнение к printk (и опции под названием CONFIG_PRINTK_TIME, которая позволяет вамчтобы увидеть (с точностью до микросекунды), когда ядро ​​выводит что), конфигурация ядра позволяет вам включить МНОГО трассировщиков, которые позволяют им отлаживать происходящее.

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

Редактировать: Вот хорошее видео , подробно описывающее процесс, который патч проходит до того, как он интегрируется в ядро.

6 голосов
/ 05 ноября 2014

В дополнение к пунктам выше / ниже, в которых больше внимания уделяется тестированию функциональности, сертификации оборудования и тестированию производительности ядра Linux.

Многое на самом деле происходит через тестирование, на самом деле скрипты, инструменты статического анализа кода, обзоры кода и т. Д., Что очень эффективно при обнаружении ошибок, которые в противном случае могли бы что-то сломать в приложении.

Разреженный - инструмент с открытым исходным кодом, предназначенный для поиска ошибок в ядре Linux.

Coccinelle - еще одна программа, которая выполняет поиск и преобразование, котороепредоставляет язык SmPL (Semantic Patch Language) для указания желаемых совпадений и преобразований в коде C.

checkpatch.pl и другие сценарии - проблемы со стилем кодирования можно найти в файле Documentation / CodingStyleв исходном дереве ядра.При чтении важно помнить не то, что этот стиль чем-то лучше любого другого стиля, а то, что он последовательный.это помогает разработчикам легко находить и исправлять проблемы со стилем кодирования, был разработан скрипт scripts / checkpatch.pl в дереве исходного кода ядра.Этот сценарий может легко указывать на проблемы, и разработчик всегда должен запускать их изменения, вместо того, чтобы рецензент тратил свое время, указывая на проблемы позже.

3 голосов
/ 13 февраля 2014

Также есть:

MMTests , который представляет собой набор тестов и сценариев для анализа результатов

https://github.com/gormanm/mmtests

Trinity , который является тестером системного вызова Linux

http://codemonkey.org.uk/projects/trinity/

Также страницы LTP в sourceforge сильно устарели, и проект перешел на GitHub. https://github.com/linux-test-project/ltp

2 голосов
/ 05 июля 2010

Я полагаю, что они используют виртуализацию для проведения быстрых тестов, например, QEMU, VirtualBox или Xen, и некоторые сценарии для выполнения конфигураций и автоматических тестов.

Автоматическое тестирование, вероятно, выполняется с помощью множества случайных конфигураций илинесколько конкретных (если они работают с определенной проблемой).В Linux есть много низкоуровневых инструментов (таких как dmesg) для мониторинга и регистрации отладочных данных из ядра, поэтому я думаю, что они также используются.

1 голос
/ 14 сентября 2017

Насколько я знаю, существует инструмент для автоматического регрессионного контроля производительности (с именем lkp / 0 day), который работает / финансируется Intel, он будет проверять каждый действительный патч, отправленный в список рассылки, и проверять оценки, измененные из разных микробенчмарков такие как hackbench, fio, unixbench, netperf и т. д., когда произойдет снижение / улучшение производительности, соответствующий отчет будет отправлен непосредственно автору исправления и сопровождающим, связанным с Cc.

0 голосов
/ 25 августа 2017

Я выполнил компиляцию ядра Linux и сделал несколько модификаций для Android (Marshmallow и Nougat), в которых я использую версию 3 Linux. Я кросс-скомпилировал ее в системе Linux, вручную отладил ошибки и затем запустил файл загрузочного образа в Android и проверь, идет ли это в лазейке или нет. Если он работает отлично, значит, он идеально скомпилирован в соответствии с требованиями системы.
Для компиляции ядра MotoG

ПРИМЕЧАНИЕ: - Ядро Linux будет изменяться в соответствии с требованиями, которые зависят от аппаратного обеспечения системы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...