切换虚拟终端简介(053556)_第1页
切换虚拟终端简介(053556)_第2页
切换虚拟终端简介(053556)_第3页
免费预览已结束,剩余4页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、切换虚拟终端概述linux 使用虚拟终端,这些虚拟终端对应 /dev/tty1/dev/tty8, 它们由系统初始化时翻开。 这个过程也在键盘的中断效劳程序中完成。用户用ALT+1.8 或 ALT+ 箭头来切换终端。每个虚拟终端对应一个 tty_struct 和一个 termios 结构。 Termios 结构存储输入输出及控制模式, 一些底层参数。 Tty_struct 和终端的关系如同 task_struct 和进程的关系。一个 tty 被翻开, 就对应一个tty_stract,对终端的一切处理都围绕tty_strct进行。Termios也被tty_struct的一个指针指向。当然, tt

2、y_struct 和 termios 结构相对独立, tty 被完全关闭时, tty_struct 也就不 在存在,而 termios 依然存在。另:1 与虚拟终端相对的是实终端。它对应/dev/tty0 或 /dev/console 二者设备号均为4,02 0 35系统初始时 tty 的初始化分早期和晚期。早期初始化支持实终端,晚期初始化 支持虚拟终端。此时 /dev/tty0 或 /dev/console 对应当前终端。2 伪终端正如其名, 与控制台终端除了最高层的输入输出功能类似外, 底层的实现大相 径庭。终端切换的流程:Keyboard, in terruptKey_ha ndler(

3、do_c ons)Set_c on slewant_con sole = nr; mark_bh(CONSOLE_BH);static void keyboard_ in terrupt(i nt irq, void *dev_id, struct pt_regs *regs) han dle_sca ncode(sca ncode);(*key_handlertype)(keysym & Oxff, up_flag);k_hand key_handlerkeyboard.c键盘特殊输入的特殊处理函数数组。static k_ha nd key_ha ndler16 = do_self,

4、 do_fn, do_spec, do_pad, do_dead, do_c ons, do_cur, do_shift, do_meta, do_ascii, do_lock, do_lowercase, do_slock,do_ignore, do_ignore, do_ignore ;do_cons()改变终端的最上层函数 keyboard.c static void do_cons(unsigned char value, char up_flag) if (up_flag) return;set_console(value);set_console设置 want_console 为欲

5、切换到的终端。设置 console 的 bottom half 标志。kbd_kern.hextern inline void set_console(int nr) want_console = nr; mark_bh(CONSOLE_BH);console_bh ()console.cstatic void console_bh(void)是否要切换 consoleif (want_console >= 0) if (want_console != fg_console) change_console(want_console);/* we only changed when the

6、 console had already been allocated - a new console is not created in an interrupt routine */want_console = -1;if (do_poke_blanked_console) /* do not unblank for a LED change */ do_poke_blanked_console = 0;poke_blanked_console();change_console ()tty_io.c 切换终端的实际动作。 void change_console(unsigned int n

7、ew_console) if (new_console = fg_console) | (vt_dont_switch)return;if (!vc_cons_allocated(new_console)return;/*If this vt is in process mode, then we need to handshake with什么模式? 在此模式下,不能直接切换,要等待!* that process before switching. Essentially, we store where that* vt wants to switch to and wait for it

8、to tell us when it's done* (via VT_RELDISP ioctl).* We also check to see if the controlling process still exists.控制进程* If it doesn't, we reset this vt to auto mode and continue.AAAAAAAAAA什么模式?* This is a cheap way to track process control. The worst thing* that can happen is: we send a signa

9、l to a process, it dies, and* the switch gets "lost" waiting for a response; hopefully, the* user will try again, we'll detect the process is gone (unless* the user waits just the right amount of time :-) and revert the* vt to auto control.*/VT_PROCESS 模式的处理。在此模式下,不能直接切换,要等待!if (vt_con

10、sfg_console->vt_mode.mode = VT_PROCESS)/* Send the signal as privileged - kill_proc() will* tell us if the process has gone or something else* is awry */ if (kill_proc(vt_consfg_console->vt_pid, vt_consfg_console->vt_mode.relsig, 1) = 0)/* It worked. Mark the vt to switch to and* return. Th

11、e process needs to send us a* VT_RELDISP ioctl to complete the switch.*/ vt_consfg_console->vt_newvt = new_console; return;/* The controlling process has died, so we revert back to* normal operation. In this case, we'll also change back* to KD_TEXT mode. I'm not sure if this is strictly c

12、orrect* but it saves the agony when the X server dies and the screen* remains blanked due to KD_GRAPHICS! It would be nice to do* this outside of VT_PROCESS but there is no single process* to account for and tracking tty count may be undesirable.*/reset_vc(fg_console);/* Fall through to normal (VT_A

13、UTO) handling of the switch.*/在 KD_GRAPHICS+VT_AUTO 模式下忽略所有终端切换。if (vt_consfg_console->vc_mode = KD_GRAPHICS)return;complete_change_console(new_console);相关函数与变量判断新的虚拟终端是否存在。int vc_cons_allocated(unsigned int i)/console.creturn (i < MAX_NR_CONSOLES && vc_consi.d);重设新的虚拟终端的 vc_date 结构。vo

14、id reset_vc(unsigned int new_console)/tty_io.c vt_consnew_console->vc_mode = KD_TEXT; kbd_tablenew_console.kbdmode = VC_XLATE; vt_consnew_console->vt_mode.mode = VT_AUTO; vt_consnew_console->vt_mode.waitv = 0; vt_consnew_console->vt_mode.relsig = 0; vt_consnew_console->vt_mode.acqsig

15、= 0; vt_consnew_console->vt_mode.frsig = 0; vt_consnew_console->vt_pid = -1; vt_consnew_console->vt_newvt = -1; reset_palette (new_console) ;complete_change_console ()切换终端的实际动作。tty_io.cvoid complete_change_console(unsigned int new_console)unsigned char old_vc_mode;if (new_console = fg_conso

16、le) | (vt_dont_switch) return;if (!vc_cons_allocated(new_console)return;l ast_console = fg_console;/* If we're switching, we could be going from KD_GRAPHICS to* KD_TEXT mode or vice versa, which means we need to blank or* unblank the screen later.*/old_vc_mode = vt_consfg_console->vc_mode;根据

17、new_console 重设显示器。update_screen(new_console);/* If this new console is under process control, send it a signal* telling it that it has acquired. Also check if it has died and* clean up (similar to logic employed in change_console()*/if (vt_consnew_console->vt_mode.mode = VT_PROCESS)/* Send the si

18、gnal as privileged - kill_proc() will* tell us if the process has gone or something else* is awry*/if (kill_proc(vt_consnew_console->vt_pid,vt_consnew_console->vt_mode.acqsig,1) != 0)/* The controlling process has died, so we revert back to* normal operation. In this case, we'll also chang

19、e back* to KD_TEXT mode. I'm not sure if this is strictly correct* but it saves the agony when the X server dies and the screen* remains blanked due to KD_GRAPHICS! It would be nice to do* this outside of VT_PROCESS but there is no single process* to account for and tracking tty count may be und

20、esirable.*/reset_vc(new_console);/* We do this here because the controlling process above may have* gone, and so there is now a new vc_mode*/if (old_vc_mode != vt_consnew_console->vc_mode)if (vt_consnew_console->vc_mode = KD_TEXT)文本模式do_unblank_screen();else图形模式do_blank_screen(1);/* Set the co

21、lour palette for this VT */if (vt_consnew_console->vc_mode = KD_TEXT)set_palette() ;/* Wake anyone waiting for their VT to activate*/ vt_wake_waitactive(); return; 相关函数与变量 #define vt_wake_waitactive() wake_up(&vt_activate_queue)update_screen ()console.c 重设屏幕。void update_screen(int new_console)static int lock = 0; lock 保证该函数不会被重入。if (new_console = fg_console | lock) return;if (!vc_cons_allocated(new_console) /* strange . */printk("update_screen: tty %d not alloca

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论