read_lock

Тема в разделе "WASM.UNIX", создана пользователем kamatoz, 11 июл 2006.

  1. kamatoz

    kamatoz New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2004
    Сообщения:
    31
    Адрес:
    Russia
    Народ помогите, проблема:
    пишу модуль под Linux 2.4.20-8, если в код помещаю вызов read_lock, read_unlock то модуль нормально билдится, но при загрузке insmod выдает ошибку что не найден символ __read_lock_failed, в экспорте символов ядра его действительно нет(ksyms -a). Но данные вызовы присутствуют в исходниках, и писанных книгах, что делать не пойму. Также в файле инклудов /asm/spinlock.h нашел такую беду

    extern inline void read_lock(rwlock_t *rw)
    {
    #if SPINLOCK_DEBUG
    if (rw->magic != RWLOCK_MAGIC)
    out_of_line_bug();
    #endif
    __build_read_lock(rw, "__read_lock_failed");
    }
    как это вообще может работать?
     
  2. int_0dh

    int_0dh New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    21
    Адрес:
    Russia
    можно увидеть список инклудов вашего модуля?

    попробуйте также пройтись grep по /usr/src/linux/include/linux на предмет __build_read_lock
     
  3. kamatoz

    kamatoz New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2004
    Сообщения:
    31
    Адрес:
    Russia
    grep:
    #define __build_read_lock_ptr(rw, helper) \
    asm volatile(LOCK "subl $1,(%0)\n\t" \
    "js 2f\n" \
    "1:\n" \
    LOCK_SECTION_START("") \
    "2:\tcall " helper "\n\t" \
    "jmp 1b\n" \
    LOCK_SECTION_END \
    ::"a" (rw) : "memory")

    #define __build_read_lock_const(rw, helper) \
    asm volatile(LOCK "subl $1,%0\n\t" \
    "js 2f\n" \
    "1:\n" \
    LOCK_SECTION_START("") \
    "2:\tpushl %%eax\n\t" \
    "leal %0,%%eax\n\t" \
    "call " helper "\n\t" \
    "popl %%eax\n\t" \
    "jmp 1b\n" \
    LOCK_SECTION_END \
    :"=m" (*(volatile int *)rw) : : "memory")

    #define __build_read_lock(rw, helper) do { \
    if (__builtin_constant_p(rw)) \
    __build_read_lock_const(rw, helper); \
    else \
    __build_read_lock_ptr(rw, helper); \
    } while (0)
    а вот константа __builtin_constant_p что то не находиться
    список инклудов
    #include <linux/kernel.h>
    #include <linux/module.h>
    #include <linux/netdevice.h>
    #include <linux/spinlock.h>
     
  4. int_0dh

    int_0dh New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    21
    Адрес:
    Russia
    похоже,что у вас проблемы со сборкой. как вы собираете модуль, какие пути к includам прописываете?
    возможно так же имеет смысл переустановить исходники ядра

    у меня на 2.4.29 подобный модуль собирается и без проблем вставляется/удаляется из ядра

    #define __KERNEL__
    #define MODULE

    #include <linux/kernel.h>
    #include <linux/module.h>
    #include <linux/spinlock.h>

    rwlock_t testlock = RW_LOCK_UNLOCKED;

    int init_module() {
    read_lock(&testlock);
    printk("%s: testlock locked\n", __FUNCTION__);
    return 0;
    }
    void cleanup_module() {
    read_unlock(&testlock);
    }
     
  5. kamatoz

    kamatoz New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2004
    Сообщения:
    31
    Адрес:
    Russia
    Пересобрал ядро
    действительно помогло
    Int_0dh спасиб:)