预览加载中,请您耐心等待几秒...
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二者设备号均为40(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(intirqvoid*dev_idstructpt_regs*regs)handle_scancode(scancode);(*key_handler[type])(keysym&0xffup_flag);k_handkey_handler[]keyboard.c键盘特殊输入的特殊处理函数数组。statick_handkey_handler[16]={do_selfdo_fndo_specdo_paddo_deaddo_consdo_curdo_shiftdo_metado_asciido_lockdo_lowercasedo_slockdo_ignoredo_ignoredo_ignore};do_cons()改变终端的最上层函数keyboard.cstaticvoiddo_cons(unsignedcharvaluecharup_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;/*Ifthisvtisinprocessmodethenweneedtohandshakewith~~~~~~~~~什么模式?在此模式下