The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

rk30xxnand, pavel_simple (ok), 19-Янв-14, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


1. "rk30xxnand"  +1 +/
Сообщение от skb7 (ok), 19-Янв-14, 18:15 
>[оверквотинг удален]
> я конечно наугад попробывал
> cat ./rk30xxnand-3.0.36.ko | sed 's|vermagic=3.0.36+ SMP preempt mod_unload
> ARMv7 |vermagic=3.0.36+ SMP mod_unload ARMv7 \x00      
>  |g'>rk30xxnand-3.0.36+.ko
> теперь оно даже пытается грузиться, НО
> 'rk30xxnand_ko: Unknown symbol _raw_spin_unlock_irq (err 0)'
> собственно вопрос :
> я правильно понимаю что это не вылечить никак кроме как пересобрать ядро
> под "нужды" модуля
> особенно приветствуются коменты от pavinux'а и skb7, кито ещё ядерщики?

Мне кажется вот что происходит:

1. Модуль собран для ядра с включенным preemption, а ваше ядро собрано без preemption. Включается это через CONFIG_PREEMPT.

2. Спинлоки, насколько я знаю, работают только когда preemption включен, а когда выключен -- они вырождаются в пустой код. Подробнее тут http://landley.net/kdocs/htmldocs/kernel-locking.html:


For kernels compiled without CONFIG_SMP, and without CONFIG_PREEMPT spinlocks do not exist at all.


3. Таким образом, в вашем ядре не экспортируется символ (функция) _raw_spin_unlock_irq, а модуль требует, чтобы такая функция присутствовала в таблице символов ядра. Поэтому при попытке загрузить модуль (даже с обманом типа "modprobe --force") происходит ошибка линковки и модуль не может быть загружен.


Так что да, вариантов тут только два: пересобирать модуль под ваше ядро или пересобирать ядро под модуль. И поскольку исходников модуля нет, остается один вариант. Оцените все прелести проприетарных драйверов, как говорится.

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


$ grep CONFIG_PREEMPT /boot/config-3.12-1-amd64
$ grep CONFIG_SMP /boot/config-3.12-1-amd64
$ grep _raw_spin_unlock_irq /proc/kallsyms


или можно в каталоге исходников ядра (после сборки):


$ grep CONFIG_PREEMPT .config
$ grep CONFIG_SMP .config
$ grep _raw_spin_unlock_irq System.map


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

Ответить | Правка | Наверх | Cообщить модератору

2. "rk30xxnand"  +/
Сообщение от pavel_simple (ok), 19-Янв-14, 18:55 
>[оверквотинг удален]
>>  |g'>rk30xxnand-3.0.36+.ko
>> теперь оно даже пытается грузиться, НО
>> 'rk30xxnand_ko: Unknown symbol _raw_spin_unlock_irq (err 0)'
>> собственно вопрос :
>> я правильно понимаю что это не вылечить никак кроме как пересобрать ядро
>> под "нужды" модуля
>> особенно приветствуются коменты от pavinux'а и skb7, кито ещё ядерщики?
> Мне кажется вот что происходит:
> 1. Модуль собран для ядра с включенным preemption, а ваше ядро собрано
> без preemption. Включается это через CONFIG_PREEMPT.

совершенно верно
> 2. Спинлоки, насколько я знаю, работают только когда preemption включен, а когда
> выключен -- они вырождаются в пустой код. Подробнее тут http://landley.net/kdocs/htmldocs/kernel-locking.html:
>

 
> For kernels compiled without CONFIG_SMP, and without CONFIG_PREEMPT spinlocks do not exist
> at all.
>

вот собственно сам ответ которого мой гугл мне не показал, а конкретно что символ вообще отсутствует как клас вне CONFIG_PREEMPT.

> 3. Таким образом, в вашем ядре не экспортируется символ (функция) _raw_spin_unlock_irq,
> а модуль требует, чтобы такая функция присутствовала в таблице символов ядра.
> Поэтому при попытке загрузить модуль (даже с обманом типа "modprobe --force")
> происходит ошибка линковки и модуль не может быть загружен.

я надеялся было что этот символ может быть добавлен отдельно модулем.

>[оверквотинг удален]
>
> или можно в каталоге исходников ядра (после сборки):
>

 
> $ grep CONFIG_PREEMPT .config
> $ grep CONFIG_SMP .config
> $ grep _raw_spin_unlock_irq System.map
>

> И вывод этих команд сюда.
> В конечном итоге вам придется собрать ядро с такой же конфигурацией, как
> собран модуль.

спасибо за столь развёрнутый ответ. ядро я уже водрузил модуль грузиться, робит.

Ответить | Правка | Наверх | Cообщить модератору

3. "rk30xxnand"  +/
Сообщение от pavel_simple (ok), 20-Янв-14, 12:51 
>[оверквотинг удален]
>> или можно в каталоге исходников ядра (после сборки):
>>
 
>> $ grep CONFIG_PREEMPT .config
>> $ grep CONFIG_SMP .config
>> $ grep _raw_spin_unlock_irq System.map
>>

>> И вывод этих команд сюда.
>> В конечном итоге вам придется собрать ядро с такой же конфигурацией, как
>> собран модуль.
> спасибо за столь развёрнутый ответ. ядро я уже водрузил модуль грузиться, робит.

а ещё... а ещё можно было создать пустой модуль экспортирующий эти символы.

P.S.
что-то до меня туговато стало доходить - старею однака.

Ответить | Правка | Наверх | Cообщить модератору

4. "rk30xxnand"  +/
Сообщение от pavlinux (ok), 21-Янв-14, 03:45 
> 2. Спинлоки, насколько я знаю, работают только когда preemption включен, а когда
> выключен -- они вырождаются в пустой код.

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

Ответить | Правка | К родителю #1 | Наверх | Cообщить модератору

12. "rk30xxnand"  +/
Сообщение от skb7 (ok), 22-Янв-14, 00:29 
>> 2. Спинлоки, насколько я знаю, работают только когда preemption включен, а когда
>> выключен -- они вырождаются в пустой код.
> Ну это они там придумывают, на многозадачных системах совсем без спинлоков низя.

Да, я не полностью написал. Это если SMP выключено и preemtion тоже выключен, тогда спинлоки не используются. Если 2+ проца и конфигурация SMP, но вытеснения отключено, спинлоки всё равно нужны.

Ответить | Правка | Наверх | Cообщить модератору

14. "rk30xxnand"  +/
Сообщение от pavlinux (ok), 22-Янв-14, 00:53 
>>> 2. Спинлоки, насколько я знаю, работают только когда preemption включен, а когда
>>> выключен -- они вырождаются в пустой код.
>> Ну это они там придумывают, на многозадачных системах совсем без спинлоков низя.
> Да, я не полностью написал. Это если SMP выключено и preemtion тоже
> выключен, тогда спинлоки не используются. Если 2+ проца и конфигурация SMP,
> но вытеснения отключено, спинлоки всё равно нужны.

Почти все блокировки имеющие суффикс *_irq, без SMP, без PREEMPT превращаются в irq_diasble()/irq_enable()  

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру