你管这破玩意儿叫操作系统源码(九)

本文为学习操作系统源码 (低并发编程)所作笔记,仅供学习参考,不做任何商业用途,若有侵权,请联系删除。

第五部分 | 从一个命令的执行看操作系统各模块的运作

第四十回 | 用键盘输入一条命令

第42回 | 用键盘输入一条命令 (qq.com)

我们成功将键盘中断绑定在了 keyboard_interrupt 这个中断处理函数上,也就是说当我们按下键盘 'c' 时,CPU 的中断机制将会被触发,最终执行到这个 keyboard_interrupt 函数中。

我们来到 keyboard_interrupt 函数一探究竟。

1
2
3
4
5
6
7
8
9
10
11
12
13
// keyboard.s
keyboard_interrupt:
...
// 读取键盘扫描码
inb $0x60,%al
...
// 调用对应按键的处理函数
call *key_table(,%eax,4)
...
// 0 作为参数,调用 do_tty_interrupt
pushl $0
call do_tty_interrupt
...

很简单,首先通过 IO 端口操作,从键盘中读取了刚刚产生的键盘扫描码,就是刚刚按下 'c' 的时候产生的键盘扫描码。

随后,在 key_table 中寻找不同按键对应的不同处理函数,比如普通的一个字母对应的字符 'c' 的处理函数为 do_self,该函数会将扫描码转换为 ASCII 字符码,并将自己放入一个队列里,我们稍后再说这部分的细节。

核心点就是三个队列 read_qsecondary 以及 write_q

其中 read_q 是键盘按下按键后,进入到键盘中断处理程序 keyboard_interrupt 里,最终通过 put_queue 函数字符放入 read_q 这个队列。

secondary 是 read_q 队列里的未处理字符,通过 copy_to_cooked 函数,经过一定的 termios 规范处理后,将处理过后的字符放入 secondary。(处理过后的字符就是成"熟"的字符,所以叫 cooked,是不是很形象?)

然后,进程通过 tty_read 从 secondary 里读字符,通过 tty_write 将字符写入 write_q,最终 write_q 中的字符可以通过 con_write 这个控制台写函数,将字符打印在显示器上。

第四十一回 | shell程序读取你的命令

第43回 | shell 程序读取你的命令 (qq.com)

第四十二回 | 进程的阻塞与唤醒

第44回 | 进程的阻塞与唤醒 (qq.com)

第四十三回 | 解析并执行shell命令

第45回 | 解析并执行 shell 命令 (qq.com)

第四十四回 | 读硬盘数据全流程

第46回 | 读硬盘数据全流程 (qq.com)

第四十五回 | 读取硬盘数据的细节

第47回 | 读取硬盘数据的细节 (qq.com)

第四十八回 | 信号

第48回 | 信号 (qq.com)

操作系统大完结

操作系统大完结! (qq.com)


你管这破玩意儿叫操作系统源码(九)
https://www.spacezxy.top/2023/04/08/OperatingSystem/Operating-system-source-code-10/
作者
Xavier ZXY
发布于
2023年4月8日
许可协议