smp preempt что это

Русские Блоги

Скомпилируйте и установите (PREEMPT_RT) и протестируйте ядро ​​Linux в реальном времени под Ubuntu

Скомпилируйте и установите (PREEMPT_RT) и протестируйте ядро ​​Linux в реальном времени под Ubuntu

1. Понять, что такое система реального времени?

Реальное время относится к времени отклика задачи при планировании. Windows обычно 15 мс, самая большая проблема не гарантируется. Например, среднее значение составляет 1 мс, но при изменении нагрузки системы оно иногда достигает 100 мс, что неприменимо в этой отрасли. Некоторым промышленным приложениям требуется более высокая точность времени. Например, система мониторинга питания должна выполнить задачу в течение 10 мс для контроля состояния работы двигателя. Если время неточное и программа не может быть запланирована для запуска, питание не может быть гарантировано. Своевременный ответ на неудачу.

2. Как внедрить систему реального времени?

3. Что такое PREEMPT_RT?

Смотрите домашнюю страницу проекта: https://rt.wiki.kernel.org/index.php/Main_Page

Подробнее о том, как его использовать, см. По адресу: https://wiki.linuxfoundation.org/realtime/documentation/howto/applications/preemptrt_setup, это официальное описание.

4. Скомпилируйте и установите патч PREEMPT_RT под Ubuntu

Рабочая среда:Используемая виртуальная машина VMware, 64-разрядная система Ubuntu 16.04, установленная выше.

Загрузите ядро ​​Linux и файлы патчей в реальном времени
rt патч скачатьhttps://www.kernel.org/pub/linux/kernel/projects/rt/
загрузка исходного кода ядраhttps://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/
Загруженные номера версий ядра и исправления должны строго соответствовать.

инструкции

Шаг 6 У меню menuconfig могут возникнуть проблемы, следуйте инструкциям для установки соответствующего программного обеспечения

Выберите опцию Fully Preemptible Kernel (RT), конкретный путь показан ниже. спасти.

smp preempt что это. Смотреть фото smp preempt что это. Смотреть картинку smp preempt что это. Картинка про smp preempt что это. Фото smp preempt что это

smp preempt что это. Смотреть фото smp preempt что это. Смотреть картинку smp preempt что это. Картинка про smp preempt что это. Фото smp preempt что это

smp preempt что это. Смотреть фото smp preempt что это. Смотреть картинку smp preempt что это. Картинка про smp preempt что это. Фото smp preempt что это

Просто сохраните и выйдите.

Скомпилируйте и установите ядро ​​Linux

Запустите ядро ​​в реальном времени

Когда вы запускаете Ubuntu, вы хотите войти в интерфейс выбора grub. При входе в интерфейс запуска VMware нажмите и удерживайте клавишу Shift

smp preempt что это. Смотреть фото smp preempt что это. Смотреть картинку smp preempt что это. Картинка про smp preempt что это. Фото smp preempt что это

После этого появится интерфейс grub:

smp preempt что это. Смотреть фото smp preempt что это. Смотреть картинку smp preempt что это. Картинка про smp preempt что это. Фото smp preempt что это

smp preempt что это. Смотреть фото smp preempt что это. Смотреть картинку smp preempt что это. Картинка про smp preempt что это. Фото smp preempt что это

5. Тестовый эффект

Используйте циклические инструменты тестирования в реальном времени. Для конкретной ссылки, нажмите на следующую ссылку:

Установите тестовые инструменты:

Используйте cyclictest для проверки в реальном времени:

Подробное объяснение результатов циклических испытаний:

Примеры результатов испытаний:

1. Результаты физических испытаний

2. Результаты тестирования виртуальной машины

Эффект является общим в виртуальной машине, которая слишком ограничена хостом.

3. Вы также можете запускать несколько раз и считать результаты

После 20 секунд выполнения программы на выходе отображается средняя задержка 1 мкс и максимальная задержка 15 мкс. Гистограмма показывает, что большинство из них сосредоточены в пределах 1-7 мкс.

Источник

Правда и вымысел об операционных системах Linux реального времени

В данной статье рассмотрены основные различия между операционными системами реального времени (ОСРВ) и операционными системами общего назначения (ОСОН). В частности отмечены некоторые распространенные заблуждения, касающиеся вопросов быстродействия, задержки, выбора типа системы, интерфейсов программирования API и ядра ОСРВ. В дополнение кратко рассмотрены некоторые методы адаптации ядра Linux к работе в реальном времени.

Операционные системы реального времени (ОСРВ) — это ОС, гарантирующая выполнение задачи в течение заданного интервала времени. Правильность вычислений в ОСРВ определяется не только логической корректностью результата, но и временем выполнения. Так, при выполнении операции «2+2» система должна не просто выдать «4», а успеть сделать это в течение установленного интервала времени, например 20 мкс. Иначе результат не считается верным, а в системе происходит сбой или отказ.
В качестве аналогии можно привести систему безопасности в автомобиле. В аварийной ситуации должна сработать подушка безопасности, причем в течение, скажем, 0,5 с, иначе она все равно не успеет спасти жизнь пассажиру.
Главная характеристика ОСРВ — задержка. Задержка — это промежуток времени между воздействием и реакцией на него. Существует несколько видов задержек:
1) Задержка прерывания (interrupt latency) — время, которое проходит с момента генерации прерывания до запуска соответствующей подпрограммы обработки прерывания.
2) Задержка планировщика (scheduling latency) — промежуток времени между «пробуждением» (воздействием), возвещающим о том, что событие произошло, и моментом, когда у планировщика появляется возможность запланировать выполнение соответствующего потока, который ожидает это событие. Воздействие может быть вызвано аппаратным прерыванием или другими потоками. Задержку планировщика часто называют задержкой реакции (task-response latency) или задержкой диспетчеризации (dispatch latency). Нередко при планировании происходит перераспределение приоритетов и может возникнуть инверсия приоритетов — ситуация, когда какая-либо задача вытесняется другими, изначально имеющими более низкий приоритет.
3) Задержка для худшего случая (worst-case latency) — это наибольшее время, которое может пройти до наступления ожидаемого события. Этот термин имеет отношение к случаю, когда система загружена. В системах реального времени необходимо предусмотреть не только средние параметры, но и наихудшие сценарии. Вспоминая аналогию с системой безопасности автомобиля, 0,5 с — это как раз наихудший случай. При нормальных условиях подушка срабатывает за 0,2 с. Однако в случае перегрузки системы выброс подушки должен быть произведен по крайней мере через 0,5 с.

ОСРВ делятся на жесткие и мягкие. В жестких ОСРВ выход за отведенный временной интервал приводит к неминуемому сбою или отказу. Примерами таких систем являются система безопасности автомобиля и система управления самолетом.
Системы мягкого реального времени допускают временные отклонения. Они нежелательны, но к отказу не приводят. Таким образом, они не гарантируют максимальное время выполнения задачи, поэтому их нельзя использовать на важных участках.
В отличие от мягкой ОСРВ, операционные системы общего назначения принципиально не гарантируют детерминизм. Они нацелены на обеспечение общего быстродействия, а не приоритетное выполнение выбранных приоритетных задач. При этом в среднем ОСОН могут оказаться гораздо более быстрыми по сравнению с ОСРВ. Именно в этом и кроется суть ОСРВ: она не обеспечивает высокое быстродействие как таковое, но гарантирует своевременное выполнение выделенных потоков. На практике эти понятия путают, и в большинстве случаев, когда разработчик уверен, что ему нужна ОСРВ для повышения быстродействия, то на самом деле ему нужно модернизировать старую систему, например увеличив объем памяти, заменив процессор на более быстрый и т.п.
Тем не менее, путаница возникла не на пустом месте. Действительно, качественная ОСРВ обеспечивает достаточно высокое общее быстродействие системы, однако она всегда жертвует быстродействием ради обеспечения детерминизма (предсказуемости).

Как было сказано выше, ОСРВ не всегда имеют высокое быстродействие. И не всегда выбор в сторону ОСРВ обоснован. Правильнее сказать, что в подавляющем большинстве случаев встраиваемые приложения не требуют жесткой ОСРВ. В конечном счете это зависит от наличия специфических требований и скрытых инструкций. Чтобы понять, нужна ли ОСРВ в конкретной системе, необходимо ответить на следующие вопросы:
1) Какие требуются задержки? Какова максимальная задержка, которую может выждать приложение, не вызвав сбой в системе?
2) Выполняет ли приложение жизненно важные задачи? Другими словами, должно ли приложение успеть выполнить задачу в течение определенного срока, по истечении которого эта задача потеряет смысл? Например, подушка безопасности в автомобиле должна успеть сработать в течение 0,5 с, иначе она все равно не спасет жизнь пассажиру.
3) Должна ли система обрабатывать абсолютно все поступающие данные, или же некоторые из них могут остаться необработанными?
4) Зависит ли работа приложения от внешнего устройства, которое должно ответить в течение отведенного интервала, по истечении которого произойдет сбой системы?
В таблице 1 приведены примеры использования мягких и жестких ОСРВ.

Источник

Наперегонки со временем: уменьшаем время отклика приложений в Linux

Содержание статьи

В зависимости от частоты процессора, объема свободной оперативной памяти и скорости работы видеоподсистемы стандартное ядро Linux имеет время отклика в диапазоне от 10 до 100 мс (ядра серии 2.2.* даже до 150 мс), чего вполне достаточно для обычного использования. Но существуют задачи, для которых такая латентность считается невероятно большой. Например, обработка звука требует задержки не более 5 мс суммарно для всей системы, включая реакцию периферийных устройств. Давай разбираться, как можно уменьшить это значение в пингвине.

О чем это мы?

Используем подручные средства

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

Для того чтобы культурно распределить ресурсы и никого при этом не обделить, в любой системе имеется своя подсистема управления процессами, работающая по принципу «каждому по способностям, каждому по труду». Процесс может работать в двух режимах: в режиме ядра (kernel mode) и в пользовательском режиме (user mode), где он выполняет простые инструкции, не требующие особых «системных» данных. Но когда такие услуги понадобятся, процесс перейдет в режим ядра, хотя инструкции по-прежнему будут выполняться от имени процесса. Все это сделано специально, чтобы защитить рабочее пространство ядра от пользовательского процесса. Остальные процессы либо готовятся к
запуску, ожидая, когда планировщик их выберет, либо находятся в режиме сна (asleep), дожидаясь недоступного на данный момент времени ресурса. С последним все просто. Когда поступает сигнал с подконтрольного устройства, процесс объявляет себя TASK_RUNNING и становится в очередь готовности к запуску. Если он имеет высший приоритет, то ядро переключается на его выполнение.

Чтобы изменить относительный приоритет процесса, следует использовать идентификатор процесса, а не название:

Кстати, уменьшить время отклика можно, отказавшись от использования утилиты hdparm для дисковых устройств (исключение составляют случаи, когда предвидятся интенсивные операции ввода/вывода, например, обработка аудио- или видеоданных). Так мы получим выигрыш в районе 2 мс.

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

Все эти тонкости использовались в различных патчах реализации lowlatency для ядра 2.4. Заменялись не только алгоритмы пересчета текущего приоритета, но и все возможные константы (например, предел nice увеличивали до 256), кроме того, устанавливался таймер с частотой вплоть до 1000 HZ. Пример такого решения найдешь на странице www.zip.com.au/

Выгружаемое ядро

Основной проблемой real-time является возможность захвата ресурсов у низкоприоритетного процесса, особенно если он выполняется в режиме ядра. Ведь даже на переключение контекста тратится некоторое время. Сотни разработчиков по всему миру пытались применить милиарды технологий: от возможности прерывания во время исполнения в ядерном режиме (preemptible kernel, выгружаемое ядро) до временного наследования (inherit) приоритета реального времени низкоприоритетным приложением, чтобы он мог поскорее закончить критический раздел кода и отдать управление.

В интернете, если хорошенько поискать, можно найти достаточное количество разнообразных патчей, позволяющих реализовать режим реального времени в Linux, но, как правило, большая часть проектов уже устарела и предлагает изменения к ядру 2.4. Например, KURT-Linux (www.ittc.ku.edu/kurt) и RT-Linux (www.rtlinux.org). Обе Линукса используют похожие технологии, и субъективно отличий в их работе не заметно, но в интернете хвалят все кому не лень именно RT-Linux. Найти компьютеры под ее управлением можно на генераторах «Токамак», в больницах Перу, на
спутниках NASA
и в симуляторах F111-C. Кстати, если в Ubuntu ввести sudo apt-cache search real-time, то ты обнаружишь наличие пакета со старой 3.1pre3-3 версией RT-Linux.

Патчим ядро

Для тестирования задержек следует использовать специальные утилиты. В Сети можно найти несколько решений. Например, latencytest, которая разрабатывалась как раз для измерения общих задержек при обработке мультимедийных данных во время различных потрясений, которые могут возникнуть на обычном десктопе (загрузка процессора сложными вычислениями; трудоемкие операции ввода/вывода: запись, копирование, считывание файла размером 350 Мб; вывод большого количества графики; доступ к системе процессов /proc с обновлением через 0,01 с). Эта утилита считается уже устаревшей, зато вся информация выводится с помощью
наглядных графиков, что очень удобно при сравнении результатов. К современным бенчмаркам можно отнести rt-test и pi_tests.

$ sudo apt-get install linux-lowlatency

Перезагружаемся и запускаем rt-test еще раз.

Стартовое значение латентности теперь равно 0,073 мс, а максимальное – 2,907 мс. Уже лучше. Хотя Criteria по-прежнему FAIL, но музычка в Amarok’е при приличной загрузке системы больше не прерывается.

Из всех решений по реализации системы реального времени до сегодняшнего дня дошло только одно, предлагаемое Инго Молнаром. Ходили слухи о том, что выпускаемые им патчи (www.kernel.org/pub/linux/kernel/projects/rt) будут включены в ядро 2.6.22, но пока этого не случилось. Для установки rt поклонникам Fedora достаточно ввести yum install kernel-rt, остальным придется немного покомпилировать. Качаем и применяем патч к своему ядру:

После перезагрузки системы, введя dmesg, можно увидеть, что ядро стало PREEMPT RT, таймер часов работает нестабильно («Clocksource tsc unstable»), а ps aux показывает наличие большого числа новых процессов. Но нас больше интересует результат работы rt-test. Так вот все наши ухищрения привели к тому, что максимальное значение латентности теперь не превышает 0,07 мс. Вуаля, тест пройден!

smp preempt что это. Смотреть фото smp preempt что это. Смотреть картинку smp preempt что это. Картинка про smp preempt что это. Фото smp preempt что это
Полную версию статьи
читай в ноябрьском номере Хакера!

Источник

Работаем с модулями ядра в Linux

smp preempt что это. Смотреть фото smp preempt что это. Смотреть картинку smp preempt что это. Картинка про smp preempt что это. Фото smp preempt что это
Ядро — это та часть операционной системы, работа которой полностью скрыта от пользователя, т. к. пользователь с ним не работает напрямую: пользователь работает с программами. Но, тем не менее, без ядра невозможна работа ни одной программы, т.е. они без ядра бесполезны. Этот механизм чем-то напоминает отношения официанта и клиента: работа хорошего официанта должна быть практически незаметна для клиента, но без официанта клиент не сможет передать заказ повару, и этот заказ не будет доставлен.
В Linux ядро монолитное, т.е. все его драйвера и подсистемы работают в своем адресном пространстве, отделенном от пользовательского. Сам термин «монолит» говорит о том, что в ядре сконцентрировано всё, и, по логике, ничего не может в него добавляться или удаляться. В случае с ядром Linux — это правда лишь отчасти: ядро Linux может работать в таком режиме, однако, в подавляющем большинстве сборок возможна модификация части кода ядра без его перекомпиляции, и даже без его выгрузки. Это достигается путем загрузки и выгрузки некоторых частей ядра, которые называются модулями. Чаще всего в процессе работы необходимо подключать модули драйверов устройств, поддержки криптографических алгоритмов, сетевых средств, и, чтобы уметь это правильно делать, нужно разбираться в строении ядра и уметь правильно работать с его модулями. Об этом и пойдет речь в этой статье.

В современных ядрах при подключении оборудования модули подключаются автоматически, а это событие обрабатывается демоном udev, который создает соответствующий файл устройства в каталоге «/dev». Все это выполняется в том случае, если соответствующий модуль корректно установлен в дерево модулей. В случае с файловыми системами ситуация та же: при попытке монтирования файловой системы ядро подгружает необходимый модуль автоматически, и выполняет монтирование.
Если необходимость в модуле не на столько очевидна, ядро его не загружает самостоятельно. Например, для поддержки функции шифрования на loop устройстве нужно вручную подгрузить модуль «cryptoloop», а для непосредственного шифрования — модуль алгоритма шифрования, например «blowfish».

Поиск необходимого модуля

Модули хранятся в каталоге «/lib/modules/ » в виде файлов с расширением «ko». Для получения списка всех модулей из дерева можно выполнить команду поиска всех файлов с расширением «ko» в каталоге с модулями текущего ядра:

filename: /lib/modules/2.6.38-gentoo-r1/kernel/drivers/net/wireless/rt2x00/rt73usb.ko
license: GPL
firmware: rt73.bin
description: Ralink RT73 USB Wireless LAN driver.
version: 2.3.0
author: rt2x00.serialmonkey.com
depends: rt2x00lib,rt2x00usb,crc-itu-t
vermagic: 2.6.38-gentoo-r1 SMP preempt mod_unload modversions CORE2
parm: nohwcrypt:Disable hardware encryption. (bool)

Поле «firmware» указывает на то, что этот модуль сам по себе не работает, ему нужна бинарная микропрограмма устройства в специальном файле «rt73.bin». Необходимость в файле микропрограммы появилась в связи с тем, что интерфейс взаимодействия с устройством закрыт, и эти функции возложены на файл прошивки (firmware). Взять firmware можно с сайта разработчика, установочного диска, поставляемого вместе с устройством, или где-нибудь в репозиториях дистрибутива, затем нужно его скопировать в каталог «/lib/firmware», при чем имя файла должно совпадать с тем, что указано в модуле.
Следующее поле, на которое нужно обратить внимание — это поле «depends». Здесь перечислены модули, от которых зависит данный. Логично предположить, что модули друг от друга зависят, например модуль поддержки USB накопителей зависит от модуля поддержки USB контроллера. Эти зависимости просчитываются автоматически, и будут описаны ниже.
Последнее важное поле — «param». Здесь описаны все параметры, которые может принимать модуль при загрузке, и их описания. В данном случае возможен только один: «nohwcrypt», который, судя по описанию, отключает аппаратное шифрование. В скобках указан тип значения параметра.
Более подробную информацию о модуле можно прочитать в документации к исходным кодам ядра (каталог Documentation) в дереве исходных кодов. Например, найти код нужного видеорежима драйвера «vesafb» можно в файле документации «Documentation/fb/vesafb.txt» относительно корня дерева исходных кодов.

Загрузка и выгрузка модулей

Загрузить модуль в ядро можно при помощи двух команд: «insmod» и «modprobe», отличающихся друг от друга возможностью просчета и удовлетворения зависимостей. Команда «insmod» загружает конкретный файл с расширением «ko», при этом, если модуль зависит от других модулей, еще не загруженных в ядро, команда выдаст ошибку, и не загрузит модуль. Команда «modprobe» работает только с деревом модулей, и возможна загрузка только оттуда по имени модуля, а не по имени файла. Отсюда следует область применения этих команд: при помощи «insmod» подгружается файл модуля из произвольного места файловой системы (например, пользователь скомпилировал модули и перед переносом в дерево ядра решил проверить его работоспособность), а «modprobe» — для подгрузки уже готовых модулей, включенных в дерево модулей текущей версии ядра. Например, для загрузки модуля ядра «rt73usb» из дерева ядра, включая все зависимости, и отключив аппаратное шифрование, нужно выполнить команду:

# modprobe rt73usb nohwcrypt=0

Загрузка этого модуля командой «insmod» произойдет следующим образом:

# insmod /lib/modules/2.6.38-gentoo-r1/kernel/drivers/net/wireless/rt2x00/rt73usb.ko nohwcrypt=0

Но нужно помнить, что при использовании «insmod» все зависимости придется подгружать вручную. Поэтому эта команда постепенно вытесняется командой «modprobe».

После загрузки модуля можно проверить его наличие в списке загруженных в ядро модулей при помощи команды «lsmod»:

# lsmod | grep rt73usb

ModuleSizeUsed by
rt73usb173050
crc_itu_t9991rt73usb
rt2x00usb57491rt73usb
rt2x00lib194842rt73usb,rt2x00usb


Из вывода команды ясно, что модуль подгружен, а так же в своей работе использует другие модули.
Чтобы его выгрузить, можно воспользоваться командой «rmmod» или той же командой «modprobe» с ключем «-r». В качестве параметра обоим командам нужно передать только имя модуля. Если модуль не используется, то он будет выгружен, а если используется — будет выдана ошибка, и придется выгружать все модули, которые от него зависят:

# rmmod rt2x00usb
ERROR: Module rt2x00usb is in use by rt73usb

# rmmod rt73usb
# rmmod rt2x00usb

После выгрузки модуля все возможности, которые он предоставлял, будут удалены из таблицы ядра.

Для автоматической загрузки модулей в разных дистрибутивах предусмотрены разные механизмы. Я не буду вдаваться здесь в подробности, они для каждого дистрибутива свои, но один метод загрузки всегда действенен и удобен: при помощи стартовых скриптов. В тех же RedHat системах можно записать команды загрузки модуля прямо в «/etc/rc.d/rc.local» со всеми опциями.
Файлы конфигурация модулей находится в каталоге «/etc/modprobe.d/» и имеют расширение «conf». В этих файлах преимущественно перечисляются альтернативные имена модулей, их параметры, применяемые при их загрузке, а так же черные списки, запрещенные для загрузки. Например, чтобы вышеупомянутый модуль сразу загружался с опцией «nohwcrypt=1» нужно создать файл, в котором записать строку:

options rt73usb nohwcrypt=1

Черный список модулей хранится преимущественно в файле «/etc/modules.d/blacklist.conf» в формате «blacklist ». Используется эта функция для запрета загрузки глючных или конфликтных модулей.

Сборка модуля и добавление его в дерево

Иногда нужного драйвера в ядре нет, поэтому приходится его компилировать вручную. Это так же тот случай, если дополнительное ПО требует добавление своего модуля в ядро, типа vmware, virtualbox или пакет поддержки карт Nvidia. Сам процесс компиляции не отличается от процесса сборки программы, но определенные требования все же есть.
Во первых, нужен компилятор. Обычно установка «gcc» устанавливает все, что нужно для сборки модуля. Если чего-то не хватает — программа сборки об этом скажет, и нужно будет доустановить недостающие пакеты.
Во вторых, нужны заголовочные файлы ядра. Дело в том, что модули ядра всегда собираются вместе с ядром, используя его заголовочные файлы, т.к. любое отклонение и несоответствие версий модуля и загруженного ядра ведет к невозможности загрузить этот модуль в ядро.
Если система работает на базе ядра дистрибутива, то нужно установить пакеты с заголовочными файлами ядра. В большинстве дистрибутивов это пакеты «kernel-headers» и/или «kernel-devel». Для сборки модулей этого будет достаточно. Если ядро собиралось вручную, то эти пакеты не нужны: достаточно сделать символическую ссылку «/usr/src/linux», ссылающуюся на дерево сконфигурированных исходных кодов текущего ядра.
После компиляции модуля на выходе будет получен один или несколько файлов с расширением «ko». Можно попробовать их загрузить при помощи команды «insmod» и протестировать их работу.
Если модули загрузились и работают (или лень вручную подгружать зависимости), нужно их скопировать в дерево модулей текущего ядра, после чего обязательно обновить зависимости модулей командой «depmod». Она пройдется рекурсивно по дереву модулей и запишет все зависимости в файл «modules.dep», который, в последствие, будет анализироваться командой «modprobe». Теперь модули готовы к загрузке командой modprobe и могут загружаться по имени со всеми зависимостями.
Стоит отметить, что при обновлении ядра этот модуль работать не будет. Нужны будут новые заголовочные файлы и потребуется заново пересобрать модуль.

«Слушаем» что говорит ядро

При появлении малейших неполадок с модулем, нужно смотреть сообщения ядра. Они выводятся по команде «dmesg» и, в зависимости от настроек syslog, в файл «/var/log/messages». Сообщения ядра могут быть информативными или отладочными, что поможет определить проблему в процессе работы модуля, а могут сообщать об ошибке работы с модулем, например недостаточности символов и зависимостей, некорректных переданных параметрах. Например, выше рассмотренный модуль «rt73usb» требует параметр типа bool, что говорит о том, что параметр может принимать либо «0», либо «1». Если попробовать передать «2», то система выдаст ошибку:

# modprobe rt73usb nohwcrypt=2
FATAL: Error inserting rt73usb (/lib/modules/2.6.38-gentoo-r1/kernel/drivers/net/wireless/rt2x00/rt73usb.ko): Invalid argument

Ошибка «Invalid argument» может говорить о чем угодно, саму ошибку ядро на консоль написать не может, только при помощи функции «printk» записать в системный лог. Посмотрев логи можно уже узнать в чем ошибка:

В этом примере выведена только последняя строка с ошибкой, чтобы не загромаждать статью. Модуль может написать и несколько строк, поэтому лучше выводить полный лог, или хотя бы последние строк десять.
Ошибку уже легко найти: значение «2» неприемлемо для параметра «nohwcrypt». После исправления, модуль корректно загрузится в ядро.

Из всего сказанного можно сделать один вывод: ядро Linux играет по своим правилам и занимается серьезными вещами. Тем не менее — это всего лишь программа, оно, по сути, не сильно отличается от других обычных программ. Понимание того, что ядро не так уж страшно, как кажется, может стать первым шагом к пониманию внутреннего устройства системы и, как результат, поможет быстро и эффективно решать задачи, с которыми сталкивается любой администратор Linux в повседневной работе.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *