LINUX.ORG.RU

Экспорт ядровых функций в модуль


0

0

Может кто рассказать или навести на актуальный в данные момент материал в котором описывается как в современных ядрах происходит механизм экспорта функций ядра в модуль. Я не о том что нужно в модулей написать чтобы вызвать функцию ядра, я о самом механизме ядра/компилятора с помощью которого в скомпилином модулей оказываются толи ядреса функция в ядре толи они туда статиком в гоняются.

и что такое modpost ?

Заранее спасибо.



Последнее исправление: Cupper (всего исправлений: 1)

а что произойдет если например под телом функции pintk убрать строчку

EXPORT_SYMBOL(printk)
при компиляции в модуле уже не будет происходить связка с этой функций ? А если сделать отдельный хедер, в котором определить свою функцию printk , сделать там же
EXPORT_SYMBOL(printk)
и подключить в модуле при компиляции этот хедер тогда в модуле будет происходить вызов не ядерной printk а «моей из моего хедера». Ядро собирается без этого хедера.

Или же получиться какая ошибка ?

Экспортируемые функции разбросаны по всему ядру, экспорт их производится сразу под телом функции, а при написании модуля указываются только хередеры. Вопрос: все экспортируемые ядром функции собраны в неком одном хедеры или также размазаны по всем ?

Cupper
() автор топика
Ответ на: комментарий от Cupper

Поверь - имея такой маленький скилл тебе нет смысла все это изучать. Даже если ты найдешь ответы на конкреные вопросы - это не сделает тебя специалистом, ты обречен искать ответы на конкретные вопросы, специалист их знает даже не вникая в подробности. Ты не с того края подходишь к изучению ОС.

anonymous
()
Ответ на: комментарий от LamerOk

Я видел его посты про юникс и многоколец. Он банально не понимает основ построения ОС и вообще основ. Хочешь дискуссии - я готов поговорить об этом. Скажи, является ли наличие аппаратного контроллера приоритетов прерываний обязательным условием для портирования ОС linux ?

anonymous
()
Ответ на: комментарий от anonymous

Что же ты буксуешь мой юный тупой друк ? :)

anonymous
()
Ответ на: комментарий от anonymous

Ты хорошо поёшь, но плохо слушаешь.

я о самом механизме ядра/компилятора с помощью которого в скомпилином модулей оказываются толи ядреса функция в ядре толи они туда статиком в гоняются.


Вопрос исключительно о процессе компиляции. Речь не идёт о _работе_ или _устройстве_ ядра.

А чё он там писал до и будет писать после - дело тридесятое.

LamerOk ★★★★★
()
Ответ на: комментарий от anonymous

Будь я специалистом в этой области я б наверно и не стал досаждать здешним умам. Но я не специалист, я учусь, изучаю, задаю глупые вопросы, ведь это и есть процесс познания. Будьте любезны если есть чем помочь помогайте, если нет, не надо заниматься осуждением, он как правило ничего никому не дает полезного.

PS. ну не надо мне говорить чтоб я бросил это дело, ну пожалуйста, все равно дело нужно довести до конца.

Cupper
() автор топика
Ответ на: комментарий от anonymous

>аппаратного контроллера приоритетов прерываний

А это вообще что за контроллер? Отдельный контроллер для приоритетов???
Или целиком IOAPIC?

ttnl ★★★★★
()
Ответ на: комментарий от anonymous

хочеться ругатся, вы осуждаете меня за незнания и сами же ни чего не объясняете. Может вам лень расписывать банальные для вас вещи, но тогда почему вам не лень писать всякую оскорбительную хрень !!!

Cupper
() автор топика
Ответ на: комментарий от Cupper

Ну может кто нить поможет разобраться в вопросе ? Повторю еще раз, более сжато: что произойдет если у экспортируемых функций в ядре удрать строку EXPORT_SYMBOL(bla) и в модуле подключить хедер в котором реализованы функции с точно таки ми же имена как у экспортируемых функций (ядро само собой собирается без этого файла). Произойдет подмена функций или будет ошибка ?

Cupper
() автор топика
Ответ на: комментарий от Cupper

что вы как маленький ?
посмотреть в include/linux/module.h чтобы найти
#define __EXPORT_SYMBOL(sym, sec) \
extern typeof(sym) sym; \
__CRC_SYMBOL(sym, sec) \
static const char __kstrtab_##sym[] \
__attribute__((section(«__ksymtab_strings»), aligned(1))) \
= MODULE_SYMBOL_PREFIX #sym; \
static const struct kernel_symbol __ksymtab_##sym \
__used \
__attribute__((section(«__ksymtab» sec), unused)) \
= { (unsigned long)&sym, __kstrtab_##sym }

#define EXPORT_SYMBOL(sym) \
__EXPORT_SYMBOL(sym, "")

дело 10ти секунд. сразу видно что каждый символ имеет соответствующую
структуру в секции __ksymtab. после можно кинуть взгляд в module.c
и увидеть что ядро для каждого внешнего elf символа модуля пытается найти символ в таблице __ksymtab. Если функция будет определена внутри
модуля, то никаких внешних символов не будет и соответственно будет
использоваться внутренняя функция.

anonymous
()
Ответ на: комментарий от Cupper

> а вторая часть вопроса ?

а спасибо неизвестному герою, который не поленился
сделать ваше домашнее задание?

серьезно, вы накидали в форум массу «детских» вопросов
с которыми легче разобраться вам самому, нежели расписать
подробное обьяснение ;) оно и полезнее будет, если вы сами
попользуетесь grep'ом.

idle ★★★★★
()

>механизм экспорта функций ядра в модуль
никакого экспорта нет.
просто некоторые .o линкуются в бинарник ядра, а некоторые - в бинарники соответствующих модулей.

помощью которого в скомпилином модулей оказываются толи ядреса функция в ядре толи они туда статиком в гоняются.

ничего такого нет. модули подключаются динамически.
функции из исходника, скомпилированного как модуль, не попадают в бинарник самого ядра.

xydo ★★
()
Ответ на: комментарий от xydo

> ничего такого нет ... функции из исходника, ..., не попадают в бинарник самого ядра

Он спрашивал про прямо противоположное. Как код модуля находит адреса экспортированных функций ядра.

LamerOk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.