LINUX.ORG.RU

__global_cli && __global_sti


0

0

Доброе время суток.
Такой вопрос: есть исходники некоторых драйверов, написанных под ядро 2.2.х, их нужно перетащить на 2.4.х. Практически все проходят, но в паре при загрузке вылетает
unresolved symbol __global_cli
и
unresolved symbol __global_sti
Эти функции явным образом не вызываются в модуле. Как бы от этого хозяйства избавиться? Имеется в виду как обойти эту фигню?

Возьми реализацию этих функций из arch/.../kernel/irq.c и вставь модулем, предварительно проэкспортировав.

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

hell:/tmp> cat mod.c
#define __KERNEL__
#define MODULE
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>

int init_module (void) {
    return 0;
}

void exit_module (void) {
}
hell:/tmp> grep global_cli /boot/System.map-2.4.18
c01086a0 T __global_cli
c03487c0 ? __kstrtab___global_cli
c0350dd8 ? __ksymtab___global_cli
hell:/tmp> grep global_sti /boot/System.map-2.4.18
c01087f8 T __global_sti
c03487cd ? __kstrtab___global_sti
c0350de0 ? __ksymtab___global_sti
hell:/tmp> echo "unsigned long __global_cli=0xc01086a0;">>mod.c
hell:/tmp> echo "unsigned long __global_sti=0xc01087f8;">>mod.c
hell:/tmp> gcc -c mod.c -I/lib/modules/`uname -r`/build/include
hell:/tmp> insmod ./mod.o
insmod: a module named mod already exists
hell:/tmp> rmmod mod
hell:/tmp> insmod ./mod.o
Warning: loading ./mod.o will taint the kernel: no license
hell:/tmp> grep global_sti /proc/ksyms
c895f2e4 __global_sti   [mod]
c010a2b8 __global_sti_Rsmp_da4456dd

Murr ★★
()

__global_{cli,cli} в 2.4 есть.

> Эти функции явным образом не вызываются в модуле.

См. cli()/sti()

Скорее всего, модуль компилируется с CONFIG_SMP,
а загружается в UP kernel.

Либо это 2.6, тогда:

Murr:

> Возьми реализацию этих функций из arch/.../kernel/irq.c
> и вставь модулем, предварительно проэкспортировав.

Вряд ли получится. Пришлось бы модифицировать irq_enter(),
hardirq_trylock() etc.

Лучше всего просто избавиться от cli()/sti().
Если SMP не нужно, заменить на local_irq_{disable,enable},
иначе см. spin_{,un}lock_irq().

Вообще, если код использует cli(), он, скорее всего
неправильный в SMP случае :)

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

idle:

>Скорее всего, модуль компилируется с CONFIG_SMP,
а загружается в UP kernel.

Это разве что товарищ криво пути к заголовочным файлам написал :) А-ля без "-I/lib/modules/`uname -r`/build/include".

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

Насчет вырезания символов я какой-то бред написал выше ;(. Видимо - действие разборок с ld (так можно сделать через ld script). Сами же символы надо определять после сборки модуля через ld -r --defsym my_symbol=my_symbol_address mymodule.o

По поводу модуля еще раз.
Надо все же сделать grep global_sti /proc/ksyms.

Если ывод будет пустым, то значит, что такого символа нет в ядре. Скорее всего, как заметил idle, это означает, что ты суешь SMP модуль в UP ядро. Убедись, что при компиляции ты указываешь путь к корректным исходникам, причем конфигурация которых соответствует текущему (целевому) ядру, убедись, что ты нигде не переопределяешь CONFIG_* (вообще, дурной тон).

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