课后练习
编程题
- *** 在 Linux 的字符(命令行)模式下,编写贪吃蛇小游戏应用程序。
问答题
-
- 字符设备的特点是什么?
字符(char)设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备驱动程序来实现这种特性。字符设备驱动程序通常至少要实现 open、close、read 和 write 的系统调用。
字符终端(/dev/console)和串口(/dev/ttyS0以及类似设备)就是两个字符设备,它们能很好的说明“流”这种抽象概念。
字符设备可以通过文件节点来访问,比如/dev/tty1和/dev/lp0等。这些设备文件和普通文件之间的唯一差别在于对普通文件的访问可以前后移动访问位置,而大多数字符设备是一个只能顺序访问的数据通道。然而,也存在具有数据区特性的字符设备,访问它们时可前后移动访问位置。例如framebuffer就是这样的一个设备,app可以用mmap或lseek访问抓取的整个图像。
在/dev下执行ls -l ,可以看到很多创建好的设备节点:
字符设备文件(类型为c),设备文件是没有文件大小的,取而代之的是两个号码:主设备号5 +次设备号1 。
-
- 块设备的特点是什么?
和字符设备类似,块设备也是通过/dev 目录下的文件系统节点来访问。块设备(例如磁盘)上能够容纳 filesystem。在大多数的 Unix 系统中,进行 I/O 操作时块设备每次只能传输一个或多个完整的块,而每块包含 512 字节(或 2 的更高次幂字节的数据)。
Linux 可以让 app 像字符设备一样地读写块设备,允许一次传递任意多字节的数据。因此,块设备和字符设备的区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口,而这些不同对用户来讲是透明的。在内核中,和字符驱动程序相比,块驱动程序具有完全不同的接口。
块设备文件(类型为 b):
-
- 网络设备的特点是什么?
任何网络事物都需要经过一个网络接口形成,网络接口是一个能够和其他主机交换数据的设备。接口通常是一个硬件设备,但也可能是个纯软件设备,比如回环(loopback)接口。
网络接口由内核中的网络子系统驱动,负责发送和接收数据包。许多网络连接(尤其是使用 TCP 协议的连接)是面向流的,但网络设备却围绕数据包的传送和接收而设计。网络驱动程序不需要知道各个连接的相关信息,它只要处理数据包即可。
由于不是面向流的设备,因此将网络接口映射到 filesystem 中的节点(比如/dev/tty1)比较困难。
Unix 访问网络接口的方法仍然是给它们分配一个唯一的名字( 比如 eth0 ),但这个名字在 filesystem 中不存在对应的节点。内核和网络设备驱动程序间的通信,完全不同于内核和字符以及块驱动程序之间的通信,内核调用一套和数据包相关的函数 socket,也叫套接字。
查看网络设备使用命令 ifconfig:
五种 I/O 模型
-
- 阻塞 I/O、非阻塞 I/O、多路复用 I/O、信号驱动 I/O、异步 I/O 这几种 I/O 方式的特点和区别是?
I/O 的三种传输方式
-
- IO 数据传输有哪几种?各自的特征是什么?
-
- 描述磁盘 I/O 操作时间组成。其中的瓶颈是哪部分?
(I/O 排队延迟、) 寻道时间、旋转延迟、数据传输时间 (、RPS 失败时间)
RISC-V 异常、中断详细
- ** RISC-V 中的异常,中断的区别是啥?有几类中断?每类中断有哪些具体的常见中断实例?PLIC/CLINT 的具体功能是啥?中断可否从 M 态响应委托给 S 态响应?S 态响应可否委托给 U 态响应?与中断相关的 M 态 / S 态寄存器有哪些,这些寄存器的功能是啥?外设产生一个中断后,PLIC/CPU/OS 如何协同进行响应处理的? A1-RISC-V异常、中断
IO 控制命令如何通过系统调用实现?
-
** 是否可以把设备抽象为文件?如果可以,那用户进程对设备发出 IO 控制命令,如何通过系统调用实现? 设备当然可以抽象为的文件,操作系统对文件提供统一的接口,方便上层用户使用。通常接口有 open, read, write, exec, close 等
-
** GPU 是外设吗?GPU 与 CPU 交互和数据传输的方式是什么?(需要查看一下相关 GPU 工作过程的信息)
实验练习
实验练习包括实践作业和问答作业两部分。本次难度: 中
实践作业
支持图形显示的应用
本章虽然讲述了 virtio-gpu 设备驱动,且可以直接进行图形显示,但这个设备驱动并没有加入到操作系统中,使得应用程序无法进行图形显示。lab8 的练习要求操作系统支持有彩色图形显示的应用,使得我们可以从单调的字符交互界跳入到多彩的图形界面中。
实验要求
-
实现分支:ch9-lab
-
实验目录要求不变
-
在裸机上让操作系统支持 “贪吃蛇” 游戏应用
需要在操作系统中加入 virtio-gpu 设备驱动程序;需要实现设备文件
/dev/fb0
和相关操作,用于应用访问显存。可以正确执行 “贪吃蛇” 游戏应用。
问答作业
-
通过阅读和运行试验等分析,你认为在目前的操作系统中,如果运行在用户态,可以响应哪些中断?如果运行在内核态,可以响应哪些中断?请简要描述分析经过。
-
对于串口驱动程序,在 RustSBI 中有具体的实现,请问它与本章讲的串口驱动有何异同之处?
-
对于目前操作系统中的
virtio-blk
设备驱动程序,存在哪些可以改进的地方来提升性能?
实验练习的提交报告要求
-
简单总结本次实验你编程的内容。(控制在 5 行以内,不要贴代码)
-
完成问答问题。
-
(optional) 你对本次实验设计及难度 / 工作量的看法,以及有哪些需要改进的地方,欢迎畅所欲言。