泰安专业的网站建设,如何做网络营销直播,个人网站首页布局设计,动漫设计专业的学校【README】
1.本文内容总结自 B站 《操作系统-哈工大李治军老师》#xff0c;内容非常棒#xff0c;墙裂推荐#xff1b;
2.键盘 是输出型外设#xff1b; 【1】外设工作原理 【图解】外设工作原理#xff1a;
步骤1#xff1a;Cpu向外设控制器发出指令#xff08;如…【README】
1.本文内容总结自 B站 《操作系统-哈工大李治军老师》内容非常棒墙裂推荐
2.键盘 是输出型外设 【1】外设工作原理 【图解】外设工作原理
步骤1Cpu向外设控制器发出指令如写命令向外设控制器中的寄存器或存储器读写数据如显卡控制器步骤2写入完成后外设控制器发出中断请求通知cpu写入完成步骤3cpu处理外设中断
补充外设驱动主要做3件事情外设就包括了显示器键盘鼠标等
事情1 cpu向外设控制器的寄存器或端口发出读写指令out指令最核心的部分前提是cpu需要知道硬件端口数据格式等细节而这些细节非常麻烦事情2 操作系统为了隐藏细节做了一个统一的文件视图把外设抽象为文件文件inode结构体就封装了外设端口数据格式等细节事情3cpu处理外设中断外设控制器在完成相应操作后会向cpu发出中断
补充2 其他外设工作原理类似同上述外设驱动的3件事情 【2】键盘驱动代码实现
1键盘中断初始化 【图解】 10x21号中断是键盘中断键盘中断处理程序为 keyboard_interrupt 2 _keyboard_interrupe 代码
_keyboard_interrupt:// 把0x60端口里的数据读入到al寄存器 inb $0x60, %al // 调用 key_table eax*4 call key_table(, %eax, 4)
3处理扫描码 key_table eax*4 【图解】 调用 do_self 函数找到键盘按键对应的ASCII码
3从 key_map 取出 ASCII 码 【图解】
说明1key_map: .byte 0, 27 .ascii “1234567890-” ...说明2shift_map: .byte 0, 27 .ascii “!#$%^*()_” ... // 按住shift键说明3Movb(%ebx, %eax), %al // 把找到键盘按键的ASCII 送入al寄存器说明4 call put_queue 把ASCII 送入缓冲区或队列
4put_queue 把 ASCII 放入缓冲区 con.read_q 【图解】 con.read_ q 中 con 指的是 console 控制器 Read_q 指的是 读缓冲区
补充回显可显示字符才会回显 // 字符回显打出在显示器
void copy_to_cooked(struct tty_struct* tty)
{GETCH(tty_read_q,c);// 判断是否需要回显 if (L_ECHO(tty)) {PUTCH(c, tty-write_q);// 立刻显示在屏幕上 tty-write(tty); }PUTCH(c, tty-secondary); ...
} 【3】键盘处理总结
【3.1】键盘工作步骤 【图解】键盘工作步骤
步骤1操作系统启动时初始化键盘中断步骤2敲下键盘发出键盘中断cpu响应中断执行键盘中断处理程序 keyboard_interrupt 步骤3keyboard_interrupt 程序从键盘控制器端口读取数据到al寄存器步骤4调用 do_self 函数找到键盘按键对应的ASCII码步骤5把 ASCII 放入缓冲区 con.read_q步骤6判断字符是否需要回显若需要则回显到屏幕上 【3.2】操作系统输入输出外设工作原理
把键盘处理流程与显示器处理流程合并在一起如下图。 因为键盘是输出型外设显示器是输入型外设 【图解】 1外设对外暴露的都是文件接口 2Tty设备读函数是 tty_readtty设备写函数是 tty_write ; 分别操作 read_q 队列write_q队列队列可以理解为缓冲区