Имеющееся в ОС 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-сервера является достаточно большим и здесь не приводится. Его полный текст и все остальные исходные тексты, необходимые для модификации стандартных кодов ядра, размещены на сайте ЦКТ МГИУ.