Слідкуйте за виходом нових статей цієї серії.
Цей контент є частиною серії: Нестандартні сценарії використання модулів ядра
Слідкуйте за виходом нових статей цієї серії.
Здійснення системних викликів
В якості першого варіанту застосування знайдених символів ядра можна запропонувати використання різноманітних функцій обробників системних викликів Linux безпосередньо з коду ядра. Для ілюстрації описуваних технічних прийомів ми розглянемо виконання виклику printf () з коду модуля ядра, як самого наочного і найбільш відомого виклику. Повний код прикладу, наведеного в лістингу 1, можна знайти в архіві new_sys.tgz. розташованому в розділі "Матеріали для скачування".
Лістинг 1. Виведення рядка на термінал виконанням системного виклику.
Цей приклад породжує ще ряд цікавих питань, як, наприклад, чи спрацює такий виклик тільки для виведення в графічний термінал (X11) або і в текстову консоль (
Інше питання полягає в тому, навіщо в якості рядка виводу використовувалася російськомовна рядок, хоча це і не вітається в програмуванні ядра? Так як в повному тракті проходження повідомлень від ядра задіяно занадто багато послідовних шарів і компонентів (реалізація printk (). Демон журналу, файл журналу, термінальна система UNIX, термінал, визуализатор dmesg. І т.д.), то висновок такого рядка може стати хорошою перевіркою для узгодженості роботи всіх цих компонентів. Попередньо слід перевірити установки системи:
Встановимо рівень діагностики нижче порога виведення (але тільки з терміналу root. А не за допомогою sudo), інакше запускати модуль з консолі просто безглуздо, і повторимо установку нашого модуля:
Ми побачимо в консолі досить дивну картину:
Виходить, що реалізація виклику printk () в ядрі:
- виводить діагностику дати не через системний журнал, а паралельно демона журналирования;
- намагається інтерпретувати потік UNICODE символів і перетворювати їх побайтно в ASCII;
- в результаті символи UNICODE отримують «незворотні» пошкодження і рядок виводиться в такому дивному вигляді.
В результаті проведених експериментів ми можемо заявити, що програмісту модулів ядра, крім інструментів програмування, присутніх в ядрі, доступний і набір всіх системних викликів POSIX API простору користувача. Природно, тлумачення результатів деяких з таких системних викликів в контексті ядра може бути вельми двозначним, а іноді навіть і безглуздим. Але тим не менше, самі виклики можна виконувати і використовувати для вирішення окремих завдань!
висновок
До цього моменту ми переконалися, що все безліч системних викликів, які використовуються при програмуванні з робочих просторів, доступно (після деяких допоміжних дій) і в коді модуля ядра. Також можна стверджувати, що арсенал можливостей (інструментів, функцій, механізмів), доступних для використання програмісту модуля ядра, перевершує можливості, відкриті для програмістів, які працюють в просторі користувача! Але, як ми дізнаємося з наступних статей, список можливостей, які можна використовувати з коду модуля ядра, далеко не обмежується вже розглянутими нами.