Модули / здание / макияж / тестирование / poc / rehearmal / notes / destfermer / license / books / links
Санчанка модуля ядра Linux (LKM) представляет собой набор различных модулей для изучения, обнаружения и экспериментов с разработкой модулей ядра Linux. Цель этого хранилища также состоит в том, чтобы практиковать развитие в ядре Linux и изучение разных концепций, прежде чем перейти к отправке самого первого патча в ядро.
Большинство модулей иллюстрируют одну концепцию и показывают, как использовать API ядра. Некоторые из модулей объединяют более одной концепции, чтобы представить, как работают концепции вместе. Например, модуль lkm_device доступ к устройству символов и хранит свое основное число в /proc. Или модуль LKM_MEM обнажает информацию о памяти /свопа с помощью файлов в /proc.
Я надеюсь, что это может быть ценным для других разработчиков, которые пытаются приблизиться к ядру Linux.
| Нет. | Модуль | Источник | Описание |
|---|---|---|---|
| 1 | LKM Debugfs | lkm_debugfs.c | Модуль, показывающий, как использовать отладку отладки файловых систем |
| 2 | Устройство LKM | lkm_device.c | Модуль, показывающий, как работать с устройствами символов и хранение информации об устройстве в /proc |
| 3 | Номера устройств LKM | lkm_device_numbers.c | Иллюстрация статически и динамически распределенных номеров устройств |
| 3 | LKM память | lkm_mem.c | Модуль обнажает память и информацию об обмене /proc |
| 4 | Устройство на основе памяти LKM | lkm_mev.c | Драйвер для устройства для символов, основанного на памяти, основанного в некоторой степени на Scull, разработанный в книге драйверов устройств Linux, Глава 3 |
| 5 | Параметры LKM | lkm_parameters.c | Модуль для передачи параметров от пользователя в ядро. |
| 6 | LKM Pretty Printk | lkm_pp.c | Модуль для тестирования интеграции Pretty Printk |
| 7 | LKM Proc | lkm_proc.c | Модуль доступа к файлам файлов с использованием последовательного ввода /вывода |
| 8 | LKM процесс | lkm_process.c | Доступ к текущей информации о текущем процессе |
| 9 | LKM Песочница | lkm_sandbox.c | Модуль песочницы для различных экспериментов |
| 10 | LKM Skeleton | lkm_skeleton.c | Скелетный модуль для более быстрых каркасов новых модулей |
При клонировании впервые, пожалуйста, клон также подмодули с --recurse-submodules чтобы стать довольно Printk.
git clone --recurse-submodules [email protected]:tpiekarski/lkm-sandbox.gitmake clean && make
Для запуска всех доступных тестов, включая базовую загрузку/разгрузку и все дополнительные концептуальные тесты.
make testТестирование путем загрузки, разгрузки и вывода буфера кольца ядра (SUDO запросит корневые разрешения).
make test-module name= < module-name > Дополнительные тесты для устройства Sandbox, включая модуль загрузки, сборы основного номера устройства от /proc, создание устройства и сравнение окончательного сообщения либо запустите цель Makefile с помощью make test-device , либо запустите следующие команды.
Для создания устройства символов необходимо основное число и может быть получено путем котирования файла /proc /lkm_device_major. Это основное число записывается и в буфер кольца ядра. Можно предоставить это основное число, используя параметр модуля param_major_num и загрузить этот модуль, например sudo insmod lkm_device.ko param_major_num=241 (в этот момент это статическое распределение, кажется, не работает надежной. Регистрация устройства песочницы иногда не выполняется. Неизвестно, что это не так.
sudo insmod lkm_device.ko
dmesg | grep " Registered sandbox device "
sudo mknod /dev/lkm_device c $( cat /proc/lkm_device_major ) 0
test -c /dev/lkm_device && cat /dev/lkm_device || echo " Device /dev/lkm_device " not found. "
sudo rmmod lkm_device Дополнительные тесты для доступа к песочнице к /proc, включая модуль загрузки, тестирование, существует ли файл внутри /proc, и вывод этого файла. Либо запустите целевой тестовый программу Makefile с помощью make test-proc или следующие несколько команд:
sudo insmod lkm_proc.ko
test -f /proc/lkm_proc && cat /proc/lkm_proc || echo " File /proc/lkm_proc not found. "
sudo rmmod lkm_proc Для получения дополнительных тестов для передачи параметров модулям LKM_PARAMETERS запустите целевой параметр MAKEFILE с помощью make test-parameters . Это загрузит/разгрузит модуль и сравнит номер параметров и сообщение, передаваемое при загрузке модуля со значениями, считываемыми в файловой системе/sys (/sys/module/lkm_parameters/parameters/*). Или запустите следующие команды.
sudo insmod lkm_parameters.ko number=33 message= " Some message... "
cat /sys/module/lkm_parameters/parameters/number
cat /sys/module/lkm_parameters/parameters/message
sudo rmmod lkm_parametersДелясь, отлаживаясь и работая с ошибками и проблемами, это может пригодиться, чтобы экспериментировать с некоторым кодом и написать POC, чтобы доказать некоторые заявления или ответить на вопрос. Ниже приведены набор таких POC, который следит за лидером, чтобы доказать заявления, идеи и вопросы, с которыми я недавно сталкивался.
| Файл | Описание | Мотивация |
|---|---|---|
| Сравнение-iopl-ioperm.c | Сравнение разрешений ввода/вывода, предоставленных iopl и ioperm | Ошибка 205317 - IOP (2) - Уровень привилегий устанавливается для для процесса или для для нагрузки? |
| Разрешения-завистуры | Как разрешения ввода/вывода предоставляются при использовании клона, вилки, execve или pthread? | Ошибка 205317 - IOP (2) - Уровень привилегий устанавливается для для процесса или для для нагрузки? |
Для лучшего понимания концепций в сфере ядра необходимо пересмотреть и репетировать фундаментальные основы C и стандартной библиотеки. Рядом с возможностью улучшить понимание, можно сравнить подходы. Большинство из этих оснований низкоуровневые, начиная с ввода/вывода файла и могут рассматриваться как источник компаньона. Никогда не бывает плохо репетировать, но иногда немного неловко признать необходимость репетировать такие вещи :)
| Файл | Концепция |
|---|---|
| клон | Процессы клонирования с клоном () |
| execve.c | Выполнение другого процесса с помощью execve () |
| Вик | Создание детского процесса с помощью Fork () |
| io_ports.c | Низкоуровневые операции ввода-вывода с низким уровнем |
| читать.c | Чтение файлов в ванили c |
| simple_circular_buffer.c | Простой и прямой круглый буфер |
| write.c | Написание/приложение к файлам в ванили c |
Чтобы создать эти файлы, просто запустите make clean && make In ./rehearsals/ , и все исполняемые файлы будут размещены в каталоге сборки.
«Модуль ядра Linux - это часть скомпилированного двоичного кода, который вставляется непосредственно в ядро Linux, работающее на кольце 0, самого низкого и наименее защищенного кольца выполнения в процессе x86–64».
«Традиционные парадигмы разработки приложений могут быть в значительной степени отброшены. Помимо загрузки и разгрузки вашего модуля, вы будете писать код, который реагирует на системные события, а не работают в последовательном шаблоне».
«С разработкой ядра вы пишете API, а не сами приложения».
Этот репозиторий будет просить у вас разрешение на корне, потому что некоторые операции, такие как модули загрузки/разгрузки и доступ к файлам в системе Linux/GNU, зависят от привилегий корней. Makefile будет заранее заявить о том, что будут использоваться эти разрешения.
Вы можете просмотреть все эти операции, выполнив поиск в этом репозитории для Sudo, и убедитесь, что это никоим образом не используется. Я знаю, что это может быть проблемой безопасности, но я пытаюсь сделать этот процесс максимально прозрачным. Но также осознайте, что эти модули приходят без каких -либо гарантий. Паника ядра и потеря данных может произойти, пожалуйста, используйте их в виртуальной машине.
Далее приведена таблица со всеми местами, где используется SUDO (кроме readme.md).
grep -n -r " sudo " *| Файл: строка | Использование SUDO |
|---|---|
| Makefile: 118 | |
| Makefile: 119 | $ (eval number_file_content = sudo cat $(number_file) ) |
| Makefile: 122 | |
| Makefile: 123 | |
| Makefile: 126 | @sudo rmmod $ (module_filename) |
| Makefile: 140 | @sudo mknod $ (device_filename) c cat $(proc_filename) 0 |
| Makefile: 143 | @sudo rm $ (device_filename) |
| Makefile: 144 | @sudo rmmod $ (module_filename) |
| Makefile: 162 | @sudo rmmod $ (module_filename) |
| Makefile: 175 | @sudo mknod |
| Makefile: 176 | @echo "тестирование" | sudo tee $ (device_file) |
| Makefile: 178 | @sudo rm -fv $ (device_file) |
| Makefile: 179 | @sudo rmmod $ (модуль) |
| Makefile: 190 | @sudo insmod |
| Makefile: 193 | @sudo rmmod $ (модуль) |
| Makefile: 207 | @sudo rmmod $ {module} |
| Makefile: 219 | @sudo insmod $ (модуль) .ko |
| Makefile: 222 | @sudo rmmod $ (модуль) |
| tests.mk:31 | @lsmod | awk '{print $$ 1}' | grep -qe "^$ (1) $$" && (sudo rmmod |
| tests.mk:75 | @sudo dmesg -clear |
| tests.mk:78 | @sudo rmmod $ (1) |
LKM Sandbox - это бесплатное программное обеспечение: вы можете перераспределить его и/или изменить его в соответствии с условиями общей публичной лицензии GNU, опубликованных Фондом Free Software, либо версией 2 лицензии, либо (по варианту) любой более поздней версии.
Sandbox LKM распространяется в надежде, что она будет полезна, но без какой -либо гарантии; даже без подразумеваемой гарантии торговой точки зрения или пригодности для определенной цели. Смотрите общую публичную лицензию GNU для получения более подробной информации.
Вы должны были получить копию общей публичной лицензии GNU вместе с Sandbox LKM. Если нет, см. Https://www.gnu.org/licenses/.