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





Наш баннер
Вы можете установить наш баннер на своем сайте или блоге, скопировав этот код:
RSS новости