Доброго всем времени суток!
Коллеги, помогите решить следующую проблему. Есть старое ядро 2.4.хх, есть железяка работающая на arm926ejs под управлением этого ядра. С железякой общаюсь по СОМ-порту. Пишу модуль ядра для этой железяки, в коде модуля есть такие строчки:
if( sock->ops && sock->ops->ioctl ) { old_fs = get_fs(); printk( KERN_ALERT "aaa\n" ); set_fs( KERNEL_DS ); printk( KERN_ALERT "bbb\n" ); retval = sock->ops->ioctl( ... ); set_fs( old_fs ); ... }
Ошибка происходит в вызове set_fs( KERNEL_DS ) железка «умирает» молча, ни kernel_panic, ни error какой-то, ничего... я вижу в гипертерминале "ааа", но не вижу "bbb", железяка ни на что не отвечает, пока ей не передернуть питание.
Посмотрел на переключение доменов в uaccess.h, по-моему все осмысленно (установка лимита и отключение контроля доступа в домене ядра). Единственное смущает, что KERNEL_DS (то есть по сути - лимит ) задефайнен как 0х00000000, а комментарий рядом гласит, что здесь подразумевается 0x100000000. Поэтому в ходе экспериментов пробовал значения лимитов 0xFFFFFFFF, 0xFFFFF000 и 0xFFFF0000 (естественно смотрел, чтобы был DOMAIN_MANAGER) - не помогло. Пробовал local_irq_disable()/local_irq_enable() вокруг set_fs() - тоже. Одним словом, коллеги, кто сталкивался с такой проблемой посоветуйте, что делать.
P.S. Этот же модуль на железяках с х86 работает прекрасно.
|