URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9814
[ Назад ]

Исходное сообщение
"rk30xxnand"

Отправлено pavel_simple , 19-Янв-14 11:10 
исходники модуля rk30xxnand отсутствуют.

при загрузке в force режиме ругается на
"rk30xxnand_ko: version magic '3.0.36+ SMP preempt mod_unload ARMv7 ' should be '3.0.36+ SMP mod_unload ARMv7 '"

я конечно наугад попробывал
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, кито ещё ядерщики?


Содержание

Сообщения в этом обсуждении
"rk30xxnand"
Отправлено skb7 , 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


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


"rk30xxnand"
Отправлено pavel_simple , 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
>

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

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


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

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

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

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


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

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


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

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


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

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


"rk30xxnand"
Отправлено pavlinux , 21-Янв-14 03:52 
> я правильно понимаю что это не вылечить никак кроме как

Дарю :) https://github.com/aloksinha2001/Linux3188/blob/master/drive...

Тут ещо много полезного http://www.linux-rockchip.info/


"rk30xxnand"
Отправлено pavel_simple , 21-Янв-14 07:19 
>> я правильно понимаю что это не вылечить никак кроме как
> Дарю :) https://github.com/aloksinha2001/Linux3188/blob/master/drive...

эта не тот драйвер, хотя из этого репо не тестил -- посмотрю.

> Тут ещо много полезного http://www.linux-rockchip.info/

был, да. ещё ~ 15 репо на github облазил.


"rk30xxnand"
Отправлено pavlinux , 21-Янв-14 15:35 
>>> я правильно понимаю что это не вылечить никак кроме как
>> Дарю :) https://github.com/aloksinha2001/Linux3188/blob/master/drive...
> эта не тот драйвер, хотя из этого репо не тестил -- посмотрю.

# modinfo ./rk30xxnand.ko покаж?
Там в комменте 29 API должно быть.

---


modinfo ./rk30xxnand.ko
filename:       ./rk30xxnand.ko
description:    FTL layer for SLC and MlC nand flash on RK29xx SDK boards
author:         ZYF <zyf@rock-chips.com>
license:        
alias:          rk29xxnand
depends:        
vermagic:       3.0.8+ SMP preempt mod_unload ARMv7

Дривер, что по ссылке - GPL_ный, так что, вполне могли чего-нить и урезать.  


"rk30xxnand"
Отправлено pavel_simple , 21-Янв-14 16:44 
>[оверквотинг удален]
> description:    FTL layer for SLC and MlC nand flash
> on RK29xx SDK boards
> author:         ZYF <zyf@rock-chips.com>
> license:
> alias:          rk29xxnand
> depends:
> vermagic:       3.0.8+ SMP preempt mod_unload ARMv7
>
> Дривер, что по ссылке - GPL_ный, так что, вполне могли чего-нить и
> урезать.

filename:       /lib/modules/3.0.36+/misc/rk30xxnand-3.0.36.ko
description:    FTL layer for SLC and MlC nand flash on RK29xx SDK boards
author:         ZYF <zyf@rock-chips.com>
license:        
alias:          rk29xxnand
depends:        
vermagic:       3.0.36+ SMP preempt mod_unload ARMv7


я проверю palinux, спасибо.

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

[164114.870117] gp_rknand_info = : 0xf0d86000
[164114.870344] request IRQ_NANDC irq , ret=0.........
[164114.870475] FlashCopyProgBuf1=0xc190c000
[164114.870505] ATime: 40 ns AHB: 148 timming: 1081
[164114.870521] No.1 FLASH INFO:45 d7 84 93 72
[164114.871031] ATime: 32 ns AHB: 148 timming: 1061
[164114.871274] ATime: 32 ns AHB: 148 timming: 1061
[164114.871285] randomizer = 1 , EccBits = 28 pSpec->pReadRetrial = bf161b78
[164114.994411] FTL INFO:Version = 438,Date = 20121229
[164114.994422] totalLogicBlkRaw  = 874
[164114.994460] gBootMedia = 0 gSdmmcFwPartOffset =0!
[164114.994469] rknand_buffer.c version: 4.38 20121130!
[164114.994643] add_rknand_device:
[164114.994669] 5 cmdlinepart partitions found on MTD device rk29xxnand
[164114.994700] num_partitions = 5
[164114.994709] Creating 5 MTD partitions on "rk29xxnand":
[164114.994721] 0x000000000000-0x000000400000 : "parameter"
[164114.998907] mtd: Giving out device 0 to parameter
[164115.001478] 0x000000400000-0x000000800000 : "misc"
[164115.003730] MTD_open
[164115.005618] mtd: Giving out device 1 to misc
[164115.007016] 0x000000800000-0x000001000000 : "kernel"
[164115.008003] mtd: Giving out device 2 to kernel
[164115.011433] 0x000001000000-0x000002000000 : "boot"
[164115.012181] mtd: Giving out device 3 to boot
[164115.017071] 0x000002000000-0x0000da800000 : "recovery"
[164115.021303] MTD_open
[164115.021758] mtd: Giving out device 4 to recovery
[164115.025625] MTD_open
[164115.027715] MTD_open
[164115.027748] MTD_open
[164115.028343] [<c0bb4ef0>] (unwind_backtrace+0x0/0xe0) from [<bf166884>] (GetRemap+0x174/0x1e4 [rk30xxnand_ko])
[164115.028447] [<bf166884>] (GetRemap+0x174/0x1e4 [rk30xxnand_ko]) from [<bf166b50>] (FtlSetSysProtAddr+0x28/0x2f4 [rk30xxnand_ko])
[164115.028538] [<bf166b50>] (FtlSetSysProtAddr+0x28/0x2f4 [rk30xxnand_ko]) from [<bf16c928>] (rk29nand_probe+0x194/0x210 [rk30xxnand_ko])
[164115.028598] [<bf16c928>] (rk29nand_probe+0x194/0x210 [rk30xxnand_ko]) from [<c0ba9604>] (do_one_initcall+0x90/0x160)
[164115.028623] [<c0ba9604>] (do_one_initcall+0x90/0x160) from [<c0c06d04>] (sys_init_module+0x15b8/0x171c)
[164115.028644] [<c0c06d04>] (sys_init_module+0x15b8/0x171c) from [<c0baeac0>] (ret_fast_syscall+0x0/0x30)
[164115.028705] [<c0bb4ef0>] (unwind_backtrace+0x0/0xe0) from [<bf166884>] (GetRemap+0x174/0x1e4 [rk30xxnand_ko])
[164115.028788] [<bf166884>] (GetRemap+0x174/0x1e4 [rk30xxnand_ko]) from [<bf166b80>] (FtlSetSysProtAddr+0x58/0x2f4 [rk30xxnand_ko])
[164115.028870] [<bf166b80>] (FtlSetSysProtAddr+0x58/0x2f4 [rk30xxnand_ko]) from [<bf16c928>] (rk29nand_probe+0x194/0x210 [rk30xxnand_ko])
[164115.028932] [<bf16c928>] (rk29nand_probe+0x194/0x210 [rk30xxnand_ko]) from [<c0ba9604>] (do_one_initcall+0x90/0x160)
[164115.028954] [<c0ba9604>] (do_one_initcall+0x90/0x160) from [<c0c06d04>] (sys_init_module+0x15b8/0x171c)
[164115.028977] [<c0c06d04>] (sys_init_module+0x15b8/0x171c) from [<c0baeac0>] (ret_fast_syscall+0x0/0x30)
[164115.028996] startBlk = 1  sysProtAddr = 0
[164115.030583] MTD_ioctl
[164115.030998] MTD_close
[164115.031345] MTD_ioctl
[164115.031841] MTD_ioctl
[164115.032326] MTD_close
[164115.032953] MTD_close
[164115.033683] MTD_ioctl
[164115.035316] MTD_ioctl
[164115.035728] MTD_close
[164115.035947] MTD_close

даже чего-то читает, причём судя по всему правильно
# cat /dev/mtdblock0 | md5sum
498f8d852d8371d8ed9e833cc6e147b5  -
# cat /dev/mtdblock0 | md5sum
498f8d852d8371d8ed9e833cc6e147b5  -


"rk30xxnand"
Отправлено pavlinux , 21-Янв-14 17:10 
> а вообще драйвером таким конечно страшно пользоваться -- ниже dmesg при загрузке
> оного.

Похоже у тя отладочная инфа включена, да и CONFIG_PRINTK_TIME можно выкинуть, quiet прописать.

---
> даже чего-то читает, причём судя по всему правильно

Вот они, 5 разделов

[164114.994669] 5 cmdlinepart partitions found on MTD device rk29xxnand
[164114.994700] num_partitions = 5
[164114.994709] Creating 5 MTD partitions on "rk29xxnand":
[164114.994721] 0x000000000000-0x000000400000 : "parameter"
[164114.998907] mtd: Giving out device 0 to parameter
[164115.001478] 0x000000400000-0x000000800000 : "misc"
[164115.003730] MTD_open
[164115.005618] mtd: Giving out device 1 to misc
[164115.007016] 0x000000800000-0x000001000000 : "kernel"
[164115.008003] mtd: Giving out device 2 to kernel
[164115.011433] 0x000001000000-0x000002000000 : "boot"
[164115.012181] mtd: Giving out device 3 to boot
[164115.017071] 0x000002000000-0x0000da800000 : "recovery"


"rk30xxnand"
Отправлено pavlinux , 21-Янв-14 17:19 
> Похоже у тя отладочная инфа включена

А.... вон глядь, в начале дривера


#if 1
   #define FLASH_DEBUG(x...) do { printk(x); } while(0)
#else
   #define FLASH_DEBUG(s,x...)
#endif

Собственно заменяется на

#if 0

или что-нить феншуйное:

#ifdef CONFIG_DEBUG_KERNEL

А еще круче в drivers/mtd/nand/Kconfig прописать после раздела "config MTD_NAND_RK29"


config MTD_NAND_RK29_DEBUG
        bool "Debugging NAND Flash RK29XX"
        depends on MTD_NAND_RK29
        help
          This enables the printk info from the RK29XX NAND

А в дривер вписать


#ifdef CONFIG_MTD_NAND_RK29_DEBUG
   #define FLASH_DEBUG(x...) do { printk(x); } while(0)
#else
   #define FLASH_DEBUG(s,x...)
#endif


"rk30xxnand"
Отправлено skb7 , 22-Янв-14 00:27 
А почему не использовать dev_dbg()/pr_debug(), а потом включать нужный отладочный функционал через debugfs? Как это работает описано тут: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.g...

На этапе разработки удобно в таком случае просто сделать в самом верху драйвера:


#define DEBUG


и все dev_dbg()/pr_debug() будут работать как printk(). А когда драйвер уже работает -- удаляем эту строчку и пользователь сможет сам включать через debugfs, что ему нужно.


"rk30xxnand"
Отправлено pavlinux , 22-Янв-14 00:50 
> А почему не использовать

Github такой большой, форкай всех и исправляй!


"rk30xxnand"
Отправлено skb7 , 22-Янв-14 01:29 
>> А почему не использовать
> форкай всех

Какой искрометный юмор! Долго придумывали? :)


"rk30xxnand"
Отправлено pavel_simple , 22-Янв-14 07:21 
>>> А почему не использовать
>> форкай всех
> Какой искрометный юмор! Долго придумывали? :)

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


"rk30xxnand"
Отправлено pavlinux , 22-Янв-14 14:36 
>>>> А почему не использовать
>>> форкай всех
>> Какой искрометный юмор! Долго придумывали? :)
> Парни, прошу не портить друг-другу настроение и не пить кровь. Я только
> начал было радоваться что хоть кто-то на отупнете начал понимать ядерную
> физику окромя сетевой части.

Спокуха, мы любя.


"rk30xxnand"
Отправлено skb7 , 22-Янв-14 17:05 
>>>> А почему не использовать
>>> форкай всех
>> Какой искрометный юмор! Долго придумывали? :)
> Парни, прошу не портить друг-другу настроение и не пить кровь. Я только
> начал было радоваться что хоть кто-то на отупнете начал понимать ядерную
> физику окромя сетевой части.

Да мы прикалываемся, не принимайте близко к сердцу ;)