预览加载中,请您耐心等待几秒...
1/9
2/9
3/9
4/9
5/9
6/9
7/9
8/9
9/9

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

切换虚拟终端概述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的一个指针指向。当然,tty_struct和termios结构相对独立,tty被完全关闭时,tty_struct也就不在存在,而termios依然存在。另:1与虚拟终端相对的是实终端。它对应/dev/tty0或/dev/console二者设备号均为4,0(2.0.35)系统初始时tty的初始化分早期和晚期。早期初始化支持实终端,晚期初始化支持虚拟终端。此时/dev/tty0或/dev/console对应当前终端。2伪终端正如其名,与控制台终端除了最高层的输入输出功能类似外,底层的实现大相径庭。终端切换的流程:Keyboard_interruptKey_handler(do_cons)Set_conslewant_console=nr;mark_bh(CONSOLE_BH);Console_bhChange_consolecomplete_change_consoleUpdate_screenstaticvoidkeyboard_interrupt(intirq,void*dev_id,structpt_regs*regs)handle_scancode(scancode);(*key_handler[type])(keysym&0xff,up_flag);k_handkey_handler[]keyboard.c键盘特殊输入的特殊处理函数数组。statick_handkey_handler[16]={do_self,do_fn,do_spec,do_pad,do_dead,do_cons,do_cur,do_shift,do_meta,do_ascii,do_lock,do_lowercase,do_slock,do_ignore,do_ignore,do_ignore};do_cons()改变终端的最上层函数keyboard.cstaticvoiddo_cons(unsignedcharvalue,charup_flag){if(up_flag)return;set_console(value);}set_console()设置want_console为欲切换到的终端。设置console的bottomhalf标志。kbd_kern.hexterninlinevoidset_console(intnr){want_console=nr;mark_bh(CONSOLE_BH);}console_bh()console.cstaticvoidconsole_bh(void){是否要切换consoleif(want_console>=0){if(want_console!=fg_console){change_console(want_console);/*weonlychangedwhentheconsolehadalreadybeenallocated-anewconsoleisnotcreatedinaninterruptroutine*/}want_console=-1;}if(do_poke_blanked_console){/*donotunblankforaLEDchange*/do_poke_blanked_console=0;poke_blanked_console();}}change_console()tty_io.c切换终端的实际动作。voidchange_console(unsignedintnew_console){if((new_console==fg_console)||(vt_dont_switch))return;if(!vc_cons_allocated(new_console))return;/*Ifthisvtisinprocessmode,thenweneedtohandshakewith~~~~~~~~~什么模式?在此模式下,不能直接切换,要等待!*thatprocessbeforeswitching.Essentially,westorewherethat*vtwantstoswitchtoandwaitforittotelluswhenit'sdone*(vi