LINUX.ORG.RU

kernel module & libc


0

1

приветствую!

ребята, ответьте плиз на такой вопрос: мне нужно создать модуль ядра, который бы по некоторому «тяжеловесному»(в плане процессорного времени) алгоритму парсил декодировал mpeg поток. почему я решил его сделать именно модулем - потому как ресурсов требуется много на парсинг потока и, соответственно, т.к. модуль ядра будет иметь больший приоритет, чем просто программа, запущенная в пользовательском режиме. я написал простой модуль, где в функции init я просто буду вызывать главную функцию из другого объектника(т.е. эта функция была ф-й main, когда я ее использовал как обычную программу, она в свою очередь тянет еще несколько объектников, а те тянут библиотечки из libc).

проблема в том, что модуль то я нормально собрал, а с запуском проблема(судя потому, что компоновщик не скомпоновал объектный код алгоритма раскодировки с самим модулем)

Как мне поступить? Как вообще в модуле подцеплять функции,например, из своих же пользовательских библиотек, или же из /lib или /usr/lib?

так же пробовал в модуле просто подменить контескт выполнения ф-й execl, которой я передовал заранее статически откомпилированную программу - результат плох, даже не собралось

спасибо



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

Ответ на: комментарий от madgnu

embedded platforms ограничены в ресурсач, к сожалению, вот и приходиться извращаться с повышениями приоритета одних процессов. nice() к сожалению тоже принципиально не дал практически никакого выигрыша

perlovik
() автор топика

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

модуль ядра будет иметь больший приоритет, чем просто программа

феерический ламеризм.

дальше даже не читал...

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

>не спасут
тогда тебя не спасет выполнение в модуле.
affinity и realtime scheduler дадут такую же эффективность.

xydo ★★
()

А ты знаешь, что в ядре есть вытеснение и твои функции в модуле будут точно также иметь приоритет? Причем банально приоритет процесса, который их вызвал. Или каким образом у тебя модуль работает?

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

>Или каким образом у тебя модуль работает?
сферически в вакууме, видимо, он у него работает :D)))

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

Как вообще в модуле подцеплять функции,например, из своих же пользовательских библиотек, или же из /lib или /usr/lib?

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

пояснить можете или только один флуд

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

т.е. банально я даже не смогу воспользоваться memset? что тогда доступно из модуля и какие библиотеки?

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

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

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

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

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

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

ага, спасибо

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

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

где подробнее почитать что и чем я могу воспользоваться в модуле?

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

>т.е. максимум что я смогу - переписать свои функции без использования каких либо либ?! тогда такой вариант точно не подойдет

максимум, что ты можешь - скомпилить либы, которые ты используешь, статически и изолированно от других либ (в т.ч. и glibc :) ), заменив всё что им требуется соответствующими заглушками (если получится, в противном случае - рабочеспособными аналогами, приспособлеными под внутреннее API ядра).
но, опять-таки, этот геморрой не стоит результата и за это отрывают всякие конечности. и не факт, что это заработает.


где подробнее почитать что и чем я могу воспользоваться в модуле?


всем, что есть внутри директории с исходниками ядра :))
и всем, что напишешь в этой директории сам.
почитать - 3 стандартных магических фолианта: Linux Kernel Development, Linux Device Drivers, Understanding the Linux Kernel.

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

При чём тут приоритеты? Если у тебя железка не тянет, не выдаёт столько флопсов сколько нужно для задачи, хоть до небес взвинти приоритеты, железка быстрее работать не будет.

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

Я ветку прочитал всю - тебе уже отвелили. Такую задачу в ядре смысла решать нет. Если юзерспейс не тянет - ядрёный режим не поможет. Максимум что ты можешь сделать - написать этакий DOS однозадачный на котором твоя кодер/декодер будет работать один. И никто ему мешать не будет. Но это если железка не очень крутая и не нужна многозадачность.

Что там хоть за железка?

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

Я вообще-то ожидал увидеть: Процессор такой-то, памяти столько-то. spi, i2c, rs232 и всё такое. А ты мне «гибкие ф-ии аудио/видео», «Dolby 5.1 через electrical S/P-DIF», «ВЧ выход», «ИК порт». Очень информативно, спасибо.

Это типа анектод: компьютер с мышкой и клавиатурой чёрного цвета. Вопрос: doom3 потянет?

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

Там на картинке нарисован «Video decoder VC-1 (ST21 core)». Подозреваю, что вот его и надо нагружать декодированием видео.

tim239 ★★
()

> так же пробовал в модуле просто подменить контескт выполнения ф-й execl, которой я передовал заранее статически откомпилированную программу - результат плох, даже не собралось

Контекст процесса и линковка/загрузка модуля - разные вещи.

Как мне поступить? Как вообще в модуле подцеплять функции,например, из своих же пользовательских библиотек, или же из /lib или /usr/lib?

Простой ответ: никак, кроме создания юзер-левела «компаньона».

Не простой ответ: как ни поступай, но не понимая, что, где, как и почему происходит - ты ничего вменяемого не получишь (кроме как случайно или после переобора большинства вариантов).

Итак:

почему я решил его сделать именно модулем - потому как ресурсов требуется много на парсинг потока и, соответственно, т.к. модуль ядра будет иметь больший приоритет, чем просто программа, запущенная в пользовательском режиме

Это - бред. Процессор быстрее не станет от запуска кода в ядре. Перед подобной «оптимизацией» вы должны найти слабые места. Только потом думать, как их устранить.

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

>не спасут

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

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

сойдёт.

Меня опять опередили. там на схеме квадратик есть «Video decoder VC-1...» вот тебе его надо использовать. А 266 МГц для декодинга видео маловато будет (это если софтверно реализовать). Что бы этот квадратик заюзать тебе нежна его поддержка со стороны ядра. Если у вас там этого ещё нету - вот тебе для этого квадратика дрова и надо написать. Ну а как это делать читай в ldd3. Короче, копай в сторону этого квадратика. Без него никак.

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

всем спасиб

ребят, я хоть могу использовать в модуле свои собственно написанные функции, например, функции из swap.c swap.h, которые не тянут за собой ничего?

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

да. но обычно ф-ии в модуле static объявляют, что бы пространство имён не засорять. они по имени тогда только в одном файле доступны. посмотри какой-нибудь драйвер в исходниках.

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

а как же тогда? если все static объявляется

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