Приложение 2. Некоторые детали модификаций
Имеющееся в ОС Linux понятие виртуальной консоли обеспечивает существование нескольких виртуальных терминалов, из которых только один является активным (к нему в данный момент подключены реальные монитор и клавиатура). При запуске X-сервера он ищет первый свободный виртуальный терминал, делает его активным и подключается к нему. Смена текущего терминала приводит к приостановке работы X-сервера и переключению в текстовой режим. Такова классическая схема работы, которая неприменима для <<Горыныча>>.
В этом случае в системе создается два виртуальных терминала, при попытке переключения на которые ничего не происходит, а инициировавшему переключение процессу сообщается об успешном завершении запроса. При этом все три X-сервера считают, что они владеют активными терминалами, но последние два из них никогда не получат сигнала о смене активного терминала. Для того чтобы пользователи не могли изменить активный терминал, при загрузке системы выполняется системный вызов (ioctl), запрещающий процессам переключение виртуальных терминалов.
Решение о жесткой связи клавиатур и виртуальных терминалов, при котором
одной PS/2 и двум USB клавиатурам ставятся в соответствие устройства
/dev/tty1
, /dev/tty2
и /dev/tty3
, было принято в связи с
постоянными модификациями как ядра Linux, так и X-серверов. Любое более
правильное решение проблемы доставки событий от клавиатур к нужному
виртуальному терминалу потребовало бы внесения изменений в каждую из вновь
появляющихся версий.
В ядре должен быть модифицирован файл include/linux/kbd_ll.h и
файлы в директории drivers: char/keyboard.c, char/vt.c,
usb/hid.c и input/keybdev.c.
Вот patch для одного из них:
10=slice/ZmeyGorynich-1.2.0.patch.sh
10head -88 programms/ZmeyGorynich-1.2.0.patch | tail -35 > slice/ZmeyGorynich-1.2.0.patch.35-88
10
diff -u -b --recursive linux/drivers/char/vt.c linux-2.4.x-zg/drivers/char/vt.c --- linux/drivers/char/vt.c Fri Feb 16 17:11:57 2001 +++ linux-2.4.x-zg/drivers/char/vt.c Wed Feb 14 20:28:47 2001 @@ -772,10 +772,18 @@ return -EPERM; if (arg == 0 || arg > MAX_NR_CONSOLES) return -ENXIO; + + if(arg==2 || arg==3){ + //printk("ZG: attemp to switch to %d\n",arg); + //Basil Evseenko: hack for framebuffer X + return 0; + } + arg--; i = vc_allocate(arg); if (i) return i; + set_console(arg); return 0; @@ -787,8 +795,11 @@ return -EPERM; if (arg == 0 || arg > MAX_NR_CONSOLES) return -ENXIO; + if (arg == 2 || arg == 3 ) { + //printk("ZG: VT_WAITACTIVE %d\n",arg); + return 2; + } return vt_waitactive(arg-1); - /* * If a vt is under process control, the kernel will not switch to it * immediately, but postpone the operation until the process calls this
Patch для X-сервера является достаточно большим и здесь не приводится. Его полный текст и все остальные исходные тексты, необходимые для модификации стандартных кодов ядра, размещены на сайте ЦКТ МГИУ.