这篇文章以sh进程为例介绍操作系统中进程和设备交互的过程,涉及traps的流程处理,硬件驱动,进程的阻塞、唤醒和调度等部分的相关知识技能点。
1、在xv6中,设备以一种特殊的文件类型(FD_DEVICE)存在,文件结构体的描述见[2],其中major成员变量记录设备文件的主设备号,用于区分不同设备。参考[3]以sh程序为例介绍了进程和uart硬件交互的过程。从上述过程的分析来看,硬件中断既可以在用户态触发,也可以在内核态触发。
2、从用户态触发的usertrap和内核态触发的kerneltrap都会调用devintr 函数中进行中断处理实现,具体函数的注释见[6]
3、uart设备是遵循串口协议的双工通信的设备,能实现信息的收发,在xv6系统中uart可以模拟输入的键盘和输出的终端(屏幕)设备。以用户进程等待接收字符串为例,可以参考[3]中的具体的示例的流程处理分析。
问题:在sh这样的程序中[4],console接收用户键盘输入的字符(进程本身处于阻塞挂起状态[5]),同时也要反馈到显示终端,当用户输入回车时才唤醒进程处于ready等待调度,反馈到终端的过程具体时怎样的?
回答:consoleintr函数里将接收的字符放入接收缓冲区,同时通过consputc函数将字符发送到终端,uartintr驱动响应函数既能够处理接收缓冲区(如某一个进程等待用户输入),也能够处理发送缓冲区(如另外一个进程程序输出内容到终端)。
References
- [1]、硬件设备简介: Interrupts and device drivers
- [2]、设备类型的文件描述符: https://gitee.com/kindlytree/riscv-xv6/issues/IBDA3S#note_36918003_link
- [3]、以sh程序为例介绍了进程和硬件交互的过程:https://gitee.com/kindlytree/riscv-xv6/issues/IBJY9G#note_36918880_link
- [4]、sh中读取用户输入的代码:https://gitee.com/kindlytree/xv6-labs-2024/blob/cow/user/sh.c#L139
- [5]、读取字符输入通过read系统调用实现:https://gitee.com/kindlytree/xv6-labs-2024/blob/riscv/user/ulib.c#L73
- [6]、硬件中断处理函数(devintr)的实现分析:https://gitee.com/kindlytree/riscv-xv6/issues/IBBZFM#note_36919308_link
Leave a Reply