Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Экспорт ядровых функций в модуль 
:(
    Опции темы
cupper
Дата 1.4.2010, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата(MAKCim @ 1.4.2010,  08:53)
может, натолкнет на мысль, есть стандартный макрос MODULE, который определен при компиляции исходного кода модуля
т. е. ядерную функцию оберни в #ifndef MODULE...#endif а свою реализацию в #if defined MODULE && defined CONFIG_FUCK_FUCK...#endif

Да да да. Точно. Было такое дело, раньше модули в модулей требовалось в ручную определять этот макрос
Код

#define MODULE
#include <Linux/module.h>

int init_module(void)
{
 printk("<1>Hello World\n");
 return 0;
}

void cleanup_module(void)
{
 printk("<1>Bye, Bye");
}

В "наше" время его можно опустить он вроде сам автоматом определяется внутри кода модуля. Тогда можно сделать упрошенный вариант
Код

#ifdef MODULE
        kzalloc() // для модулей
#else
        kzalloc() // for only kernel
#endif

Правда это нужно проверять, а то мало ли как они его еще используют. Спасибо за наводку smile
PM MAIL   Вверх
cupper
Дата 10.4.2010, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Возникла следующая проблема. Вот например хочу я написать функцию подмену для printk
kernel/printk.c

Код

#ifdef MODULE
    static inline int printk(...){
        // моя функция
    }
#else
    asmlinkage int printk(...){
        // ядровая функци
    }
#endif

Все прекрасно собралось. Отлаживаю вызов ядровой printk, вызывается нужная. Отлажимаю вызов модульной printk, вызывается опять ядрова. Не долго думаю понимаю что я не менял Makefile и у меня printk.o не цепляется к модулю поэтому он и незнает о существовании моей функции. 
Думаю, надо пихнуть реализацию в какойнить хедер чтобы не менять Makefile. Решил пихнуть в 
include/linux/module.h
Код

#ifdef MODULE
//#include <mm/physaddr.c>
#include <linux/jiffies.h>
    static inline int printk(const char *fmt, ...)
{
    // ...
}
#endif

делаю правку в printk.c
Код

#ifndef MODULE
asmlinkage int printk(const char *fmt, ...)
{
    va_list args;
    int r;

    va_start(args, fmt);
    r = vprintk(fmt, args);
    va_end(args);

    return r;
}
#endif

Но на этапе компиляции получаю
Код

In file included from include/linux/crypto.h:21,
                 from include/crypto/aes.h:9,
                 from arch/x86/crypto/aes_glue.c:6:
include/linux/module.h:731: error: conflicting types for 'printk'
include/linux/kernel.h:240: note: previous declaration of 'printk' was here
make[2]: *** [arch/x86/crypto/aes_glue.o] Error 1
make[1]: *** [arch/x86/crypto] Error 2
make: *** [arch/x86] Error 2


вроде ничего в логике особого не поменялось за исключением что я разорвал #ifdef #else #endif на два #ifdef #endif и ifndef #endif.
Но получилось не то что я ожидал. Вероятно я чего совсем очевидного не улавливаю :(

PS. Вероятней правильнее былобы сделать реализацию не в module.h а в include/linux/kernel.h Но что из той кучи странных определний printk является его действительным определением ?

Это сообщение отредактировал(а) cupper - 10.4.2010, 20:40
PM MAIL   Вверх
Friackazoid
Дата 10.4.2010, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 23.2.2006

Репутация: 1
Всего: 3



Смотри внимательнее, ты сделал обертку #ifndef MODULE #endif только в printk.c а ругается оно на файл kernel.h там есть заголовок функции printk его тоже нужно обернуть как и ядреную реализацию.
--------------------
Даже если тебя съели, то все равно есть два выхода.42Team блог
PM MAIL WWW ICQ GTalk   Вверх
cupper
Дата 10.4.2010, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



методом несложной дидукции было понято что определение pirntk в файле kernel.h это то определение которой находится на 240 строчке. Кэп покинул меня ((
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0695 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.