- rk30xxnand, skb7, 18:15 , 19-Янв-14 (1) +1
>[оверквотинг удален] > я конечно наугад попробывал > 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, 18:55 , 19-Янв-14 (2)
>[оверквотинг удален] >> |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, 12:51 , 20-Янв-14 (3)
>[оверквотинг удален] >> или можно в каталоге исходников ядра (после сборки): >> >> $ grep CONFIG_PREEMPT .config >> $ grep CONFIG_SMP .config >> $ grep _raw_spin_unlock_irq System.map >> >> И вывод этих команд сюда. >> В конечном итоге вам придется собрать ядро с такой же конфигурацией, как >> собран модуль. > спасибо за столь развёрнутый ответ. ядро я уже водрузил модуль грузиться, робит. а ещё... а ещё можно было создать пустой модуль экспортирующий эти символы. P.S. что-то до меня туговато стало доходить - старею однака.
- rk30xxnand, pavlinux, 03:45 , 21-Янв-14 (4)
> 2. Спинлоки, насколько я знаю, работают только когда preemption включен, а когда > выключен -- они вырождаются в пустой код. Ну это они там придумывают, на многозадачных системах совсем без спинлоков низя.
- rk30xxnand, skb7, 00:29 , 22-Янв-14 (12)
>> 2. Спинлоки, насколько я знаю, работают только когда preemption включен, а когда >> выключен -- они вырождаются в пустой код. > Ну это они там придумывают, на многозадачных системах совсем без спинлоков низя. Да, я не полностью написал. Это если SMP выключено и preemtion тоже выключен, тогда спинлоки не используются. Если 2+ проца и конфигурация SMP, но вытеснения отключено, спинлоки всё равно нужны.
- rk30xxnand, pavlinux, 00:53 , 22-Янв-14 (14)
>>> 2. Спинлоки, насколько я знаю, работают только когда preemption включен, а когда >>> выключен -- они вырождаются в пустой код. >> Ну это они там придумывают, на многозадачных системах совсем без спинлоков низя. > Да, я не полностью написал. Это если SMP выключено и preemtion тоже > выключен, тогда спинлоки не используются. Если 2+ проца и конфигурация SMP, > но вытеснения отключено, спинлоки всё равно нужны.Почти все блокировки имеющие суффикс *_irq, без SMP, без PREEMPT превращаются в irq_diasble()/irq_enable()
- rk30xxnand, pavlinux, 03:52 , 21-Янв-14 (5)
- rk30xxnand, pavel_simple, 07:19 , 21-Янв-14 (6)
- rk30xxnand, pavlinux, 15:35 , 21-Янв-14 (7)
>>> я правильно понимаю что это не вылечить никак кроме как >> Дарю :) 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, 16:44 , 21-Янв-14 (8)
>[оверквотинг удален] > 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, 17:10 , 21-Янв-14 (9)
> а вообще драйвером таким конечно страшно пользоваться -- ниже 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, 17:19 , 21-Янв-14 (10)
> Похоже у тя отладочная инфа включенаА.... вон глядь, в начале дривера #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, 00:27 , 22-Янв-14 (11)
А почему не использовать 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, 00:50 , 22-Янв-14 (13)
> А почему не использовать Github такой большой, форкай всех и исправляй!
- rk30xxnand, skb7, 01:29 , 22-Янв-14 (15)
>> А почему не использовать > форкай всехКакой искрометный юмор! Долго придумывали? :)
- rk30xxnand, pavel_simple, 07:21 , 22-Янв-14 (16)
>>> А почему не использовать >> форкай всех > Какой искрометный юмор! Долго придумывали? :) Парни, прошу не портить друг-другу настроение и не пить кровь. Я только начал было радоваться что хоть кто-то на отупнете начал понимать ядерную физику окромя сетевой части.
- rk30xxnand, pavlinux, 14:36 , 22-Янв-14 (17)
>>>> А почему не использовать >>> форкай всех >> Какой искрометный юмор! Долго придумывали? :) > Парни, прошу не портить друг-другу настроение и не пить кровь. Я только > начал было радоваться что хоть кто-то на отупнете начал понимать ядерную > физику окромя сетевой части.Спокуха, мы любя.
- rk30xxnand, skb7, 17:05 , 22-Янв-14 (18)
>>>> А почему не использовать >>> форкай всех >> Какой искрометный юмор! Долго придумывали? :) > Парни, прошу не портить друг-другу настроение и не пить кровь. Я только > начал было радоваться что хоть кто-то на отупнете начал понимать ядерную > физику окромя сетевой части.Да мы прикалываемся, не принимайте близко к сердцу ;)
|