>[оверквотинг удален]
> я конечно наугад попробывал
> 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
И вывод этих команд сюда.
В конечном итоге вам придется собрать ядро с такой же конфигурацией, как собран модуль.