Нестандартні сценарії використання модулів ядра частина 41

Слідкуйте за виходом нових статей цієї серії.

Цей контент є частиною серії: Нестандартні сценарії використання модулів ядра

Слідкуйте за виходом нових статей цієї серії.

Здійснення системних викликів

В якості першого варіанту застосування знайдених символів ядра можна запропонувати використання різноманітних функцій обробників системних викликів Linux безпосередньо з коду ядра. Для ілюстрації описуваних технічних прийомів ми розглянемо виконання виклику printf () з коду модуля ядра, як самого наочного і найбільш відомого виклику. Повний код прикладу, наведеного в лістингу 1, можна знайти в архіві new_sys.tgz. розташованому в розділі "Матеріали для скачування".

Лістинг 1. Виведення рядка на термінал виконанням системного виклику.

Цей приклад породжує ще ряд цікавих питань, як, наприклад, чи спрацює такий виклик тільки для виведення в графічний термінал (X11) або і в текстову консоль ()? Так, спрацює, але перевірку цього твердження я залишаю читачеві.

Інше питання полягає в тому, навіщо в якості рядка виводу використовувалася російськомовна рядок, хоча це і не вітається в програмуванні ядра? Так як в повному тракті проходження повідомлень від ядра задіяно занадто багато послідовних шарів і компонентів (реалізація printk (). Демон журналу, файл журналу, термінальна система UNIX, термінал, визуализатор dmesg. І т.д.), то висновок такого рядка може стати хорошою перевіркою для узгодженості роботи всіх цих компонентів. Попередньо слід перевірити установки системи:

Встановимо рівень діагностики нижче порога виведення (але тільки з терміналу root. А не за допомогою sudo), інакше запускати модуль з консолі просто безглуздо, і повторимо установку нашого модуля:

Ми побачимо в консолі досить дивну картину:

Виходить, що реалізація виклику printk () в ядрі:

  1. виводить діагностику дати не через системний журнал, а паралельно демона журналирования;
  2. намагається інтерпретувати потік UNICODE символів і перетворювати їх побайтно в ASCII;
  3. в результаті символи UNICODE отримують «незворотні» пошкодження і рядок виводиться в такому дивному вигляді.

В результаті проведених експериментів ми можемо заявити, що програмісту модулів ядра, крім інструментів програмування, присутніх в ядрі, доступний і набір всіх системних викликів POSIX API простору користувача. Природно, тлумачення результатів деяких з таких системних викликів в контексті ядра може бути вельми двозначним, а іноді навіть і безглуздим. Але тим не менше, самі виклики можна виконувати і використовувати для вирішення окремих завдань!

висновок

До цього моменту ми переконалися, що все безліч системних викликів, які використовуються при програмуванні з робочих просторів, доступно (після деяких допоміжних дій) і в коді модуля ядра. Також можна стверджувати, що арсенал можливостей (інструментів, функцій, механізмів), доступних для використання програмісту модуля ядра, перевершує можливості, відкриті для програмістів, які працюють в просторі користувача! Але, як ми дізнаємося з наступних статей, список можливостей, які можна використовувати з коду модуля ядра, далеко не обмежується вже розглянутими нами.

Ресурси для скачування

Схожі теми