Народ помогите, проблема: пишу модуль под 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"); } как это вообще может работать?
можно увидеть список инклудов вашего модуля? попробуйте также пройтись grep по /usr/src/linux/include/linux на предмет __build_read_lock
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>
похоже,что у вас проблемы со сборкой. как вы собираете модуль, какие пути к 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); }