Єдина Країна! Единая Страна!

Розробка для ядра Linux — 2. Ще трохи простих, але важливих речей

Червень 21st, 2010

Цей допис є продовженням і доповненням першого (Розробка для ядра Linux — 1. printk(“Привіт, світе!\n”)). Тут я розгляну такі базові, але дуже важливі речі, як залежність версій і таблиця символів ядра.

Залежність версій

Наше життя далеке від ідеалу, тому розробники ядра не особливо ретельно піклуються про зворотню сумісність API між різними версіями ядра. Тому нам інколи доводитиметься прив’язувати наш код до конкретних версій ядра. Дізнатись версію ядра можна за допомогою макросів UTS_RELEASE, LINUX_VERSION_CODE та LINUX_VERSION:

  • UTS_RELEASE. Цей макрос розкривається у рядок, який вказує на версію ядра. Наприклад, “2.6.10”.
  • LINUX_VERSION_CODE. Цей макрос розкривається у бінарну репрезентацію версії ядра, по-одному байту для кожної частини номеру версію. Наприклад, кодом для версії 2.6.10 буде 132618 (0x02060a).
  • KERNEL_VERSION(major,minor,release). Цей макрос використовується для побудови цифрового (int) коду версії ядра з трьох індивідуальних чисел. Наприклад, KERNEL_VERSION(2,6,10) розкривається у 132618. Цей макрос дуже корисний у випадку, якщо вам потрібно порівняти поточну версію ядра з відомою контрольною версією.

Ось і невеличкий приклад їхнього використання:

1
2
3
4
5
6
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)
static inline struct proc_dir_entry *PDE(const struct inode *inode)
{
        return inode->u.generic_ip;
}
#endif

Таблиця символів ядра

Ми вже бачили, як insmod розв’язує неозначені символу врозріз із таблицею публічних символів ядра. Таблиця містить адресу глобального об’єкту ядра — функцій та змінних, які потрібні для того, щоб реалізувати модульні драйвери. Після, як модуль завантажено, будь який символ експортований модулем, стає частиною таблиці символів ядра. Нові модулі можуть використовувати символі експортовані вашим модулем, і ви можете створювати нові модулі поверх інших модулів.

Штабелювання (stacking) модулів є корисним у комплексних проектах. Якщо нова абстракція реалізується у вигляді драйвера пристрою, вона могла б, наприклад, запропонувати інтерфейс для конкретної апаратної реалізації. Якщо ваш модуль повинен експортувати символи іншим моделям, скористайтесь наступними макросами:

1
2
EXPORT_SYMBOL(name);
EXPORT_SYMBOL_GPL(name);

Коментарі

коментарі

Powered by Facebook Comments

Leave a Reply