Как разработчики ядра Linux тестируют свой код локально и после его совершения? Используют ли они какое-то модульное тестирование, автоматизацию сборки? планы испытаний?
Как тестируется ядро Linux?
Ответ 1
В ядре Linux большое внимание уделяется тестированию сообщества.
Как правило, любой разработчик будет тестировать свой собственный код перед отправкой, и нередко они будут использовать версию разработки ядра из Linus или одно из других нестабильных/деревьев разработки для проекта, имеющего отношение к их работе. Это означает, что они часто проверяют как свои изменения, так и изменения других людей.
Как правило, не так много формальных планов тестирования, но может потребоваться дополнительное тестирование, прежде чем функции будут объединены в восходящие деревья.
Как отметил Дин, есть также автоматическое тестирование, проект тестирования linux и автотест ядра (хороший обзор).
Разработчики часто также пишут автоматические тесты, нацеленные на тестирование их изменений, но я не уверен, что есть (часто используемый) механизм для централизованного сбора этих тестов adhoc.
Это зависит от того, в какой области ядра меняются, конечно, - тестирование, которое вы делаете для нового сетевого драйвера, сильно отличается от тестирования, которое вы будете делать при замене алгоритма планирования ядра.
Ответ 2
Естественно, что само ядро и его части тестируются до выпуска, но эти тесты охватывают только базовые функции. Существуют некоторые системы тестирования, которые выполняют тестирование ядра 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) позволяет вводить ошибки и исключения в логику приложения для обеспечения более высокого охвата и отказоустойчивости системы.
Ответ 3
Как разработчики ядра Linux тестируют свой код локально и после его совершения?
Используют ли они какое-то модульное тестирование, автоматизацию сборки?
В классическом смысле слова нет.
Е. г. Ingo Molnar выполняет следующую рабочую нагрузку: 1. создать новое ядро со случайным набором параметров конфигурации 2. Загрузите в него 3. goto 1
Сбой сборки, неудача загрузки, ошибка BUG или время выполнения. 24/7. Умножьте на несколько ящиков, и можно выявить немало проблем.
планы тестирования?
Нет.
Возможно, существует недоразумение, что есть центральный центр тестирования, и нет. Каждый делает то, что хочет.
Ответ 4
Внутренние инструменты
Хороший способ найти инструменты тестирования в ядре:
-
make help
и прочитать все цели - смотреть под инструменты/тестирование
В v4.0 это приводит меня к:
-
kselftest под инструменты/тестирование/самотестирование. Запустите с
make kselftest
. Должно быть уже запущено встроенное ядро. Смотрите также: Документация /kselftest.txt, https://kselftest.wiki.kernel.org/ -
ktest под инструменты/тестирование /ktest. Смотрите также: http://elinux.org/Ktest, http://www.slideshare.net/satorutakeuchi18/kernel-auto-testbyktest
-
Раздел статических анализаторов
make help
, который содержит цели, такие как:-
checkstack
: Perl: что делает checkstack.pl в источнике linux? -
coccicheck
для Coccinelle (упомянутый Askb)
-
Ядро CI
https://kernelci.org/ - это проект, цель которого сделать тестирование ядра более автоматизированным и наглядным.
Кажется, он выполняет только тесты сборки и загрузки (чтобы узнать, как автоматически проверить, что загрузка работала, источник должен быть на https://github.com/kernelci/).
Похоже, что Линаро является основным спонсором проекта с участием многих крупных компаний: https://kernelci.org/sponsors/
Линаро Лава
http://www.linaro.org/initiatives/lava/ выглядит как система CI с акцентом на сборку доски разработки и ядра Linux.
АРМ ЛИЗА
https://github.com/ARM-software/lisa
Не уверен, что он делает в деталях, но это ARM и Apache Licensed, так что, вероятно, стоит посмотреть.
Демонстрация: https://www.youtube.com/watch?v=yXZzzUEngiU
Шаговые отладчики
Не совсем модульное тестирование, но может помочь, когда ваши тесты начнут давать сбой:
- QEMU + GDB: fooobar.com/questions/31617/...
- KGDB: fooobar.com/questions/31617/...
Моя собственная настройка QEMU + Buildroot + Python
Я также начал установку, сфокусированную на простоте разработки, но в итоге я добавил к ней также несколько простых возможностей тестирования: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/8217e5508782827320209644dcbaf9a6b3141724#test-this -repo
Я не анализировал все остальные настройки очень подробно, и они, вероятно, делают намного больше, чем мои, однако я считаю, что с моей настройкой очень легко начать быстро, потому что она имеет много документации и автоматизации.
Ответ 5
Нелегко автоматизировать тестирование ядра. Большинство разработчиков Linux проводят тестирование самостоятельно, как упоминалось в адобрияне.
Однако есть несколько вещей, которые помогают отлаживать ядро Linux:
- kexec: Системный вызов, который позволяет помещать другое ядро в память и перезагружаться, не возвращаясь к BIOS, и если он не работает, перезагрузитесь.
- dmesg: Определенно место для поиска информации о том, что произошло во время загрузки ядра, и работает ли оно/не работает.
- Инструмент ядра: В дополнение к printk (и опция "CONFIG_PRINTK_TIME", которая позволяет вам видеть (с точностью до микросекунды), когда ядро выводит то, что), конфигурация ядра позволяет включить LOT трассировщиков, которые позволяют им отлаживать то, что происходит.
Затем разработчики обычно проверяют свои исправления другими. Как только исправления проверяются локально и не мешают чему-либо еще, и исправления тестируются для работы с последним ядром от Linus, не нарушая ничего, патчи выталкиваются вверх по течению.
Изменить: Вот хорошее видео, в котором подробно описывается процесс патча, прежде чем он будет интегрирован в ядро.
Ответ 6
В дополнение к выше/ниже точки, в которых больше внимания уделяется тестированию функциональности, тестированию аппаратного тестирования и тестированию производительности ядра Linux.
Многое тестирование фактически происходит через, на самом деле скрипты, статические инструменты анализа кода, обзоры кода и т.д., которые очень эффективны в обнаружении ошибок, которые в противном случае нарушали бы что-то в приложении.
Sparse - инструмент с открытым исходным кодом, предназначенный для обнаружения ошибок в ядре Linux.
Coccinelle - это еще одна программа, выполняющая механизм сопоставления и преобразования, который предоставляет язык SmPL (Semantic Patch Language) для указания желаемых совпадений и преобразований в C.
checkpatch.pl и другие скрипты - проблемы стиля кодирования можно найти в файле Documentation/CodingStyle в исходном дереве ядра. Важная вещь, которую следует помнить при чтении, заключается не в том, что этот стиль как-то лучше, чем любой другой стиль, просто он последователен. это помогает разработчикам легко находить и исправлять проблемы стиля кодирования, был разработан script scripts/checkpatch.pl в исходном дереве ядра. Этот script может легко указывать на проблемы и всегда должен запускаться разработчиком при их изменениях, вместо того, чтобы рецензент тратил свое время, указывая на проблемы позже.
Ответ 7
Также есть:
MMTests, который представляет собой набор эталонных тестов и сценариев для анализа результатов
https://github.com/gormanm/mmtests
Trinity, который является системным вызовом Fuzz для Linux
http://codemonkey.org.uk/projects/trinity/
Также страницы LTP в sourceforge довольно устарели, и проект переместился в GitHub https://github.com/linux-test-project/ltp
Ответ 8
Я бы предположил, что они используют виртуализацию для проведения быстрых тестов, таких как QEMU, VirtualBox или Xen, а также некоторые скрипты для выполнения конфигураций и автоматических тестов.
Автоматическое тестирование, вероятно, выполняется с помощью множества случайных конфигураций или нескольких конкретных (если они работают с определенной проблемой). В Linux есть много инструментов низкого уровня (например, dmesg) для мониторинга и регистрации отладочных данных из ядра, поэтому я полагаю, что это также используется.
Ответ 9
Насколько я знаю, на Intel работает инструмент проверки регрессии производительности (названный lkp/0 day), который будет протекать/финансироваться Intel, он будет проверять каждый действительный патч, отправленный в список рассылки, и проверять оценки, измененные с разных микрообъектов таких как hackbench, fio, unixbench, netperf и т.д., после того, как будет регрессия/улучшение производительности, соответствующий отчет будет отправлен непосредственно автору патча и сопровождающим Cc.
Ответ 10
LTP и Memtests обычно являются предпочтительными инструментами.
Ответ 11
adobriyan упомянул цикл Ingo произвольного тестирования конфигурации конфигурации. Это в значительной степени теперь покрывается 0-дневным тестовым ботом (aka kbuild test bot). Здесь представлена хорошая статья об инфраструктуре: Проверка сборки/загрузки ядра
Идея этой настройки заключается в том, чтобы уведомить разработчиков как можно скорее, чтобы они могли исправить ошибки достаточно скоро. (до того, как патчи превращаются в дерево Linus в некоторых случаях, поскольку инфраструктура kbuild также проверяет деревья подсистемы поддержки)
Ответ 12
Я сделал компиляцию ядра Linux и сделал некоторые модификации для android (Marshmallow и Nougat), в которых я использую версию linux 3. Я перекрестно скомпилировал ее в Linux-системе, отлаживал ошибки вручную, а затем запускал свой файл загрузочного образа в Android и проверить, идет ли он в петле или нет. Если он работает отлично, значит, он скомпилирован в соответствии с требованиями системы.
Для компиляции ядра MotoG
ПРИМЕЧАНИЕ: - Ядро Linux будет меняться в соответствии с требованиями, которые зависят от системного оборудования
Ответ 13
В дополнение к вышеупомянутому TI имеет структуру LTP-DDT,