操作系统-设备驱动和文件系统
L26 I/O和显示器
工作主要包括以下的三个步骤。
- 显卡,键盘,磁盘根据CPU的指令执行响应的操作。 out xx,al(显示器)
- 当外设执行完成后,会向CPU发送一个中断表示已经完成。
- 为了让外设的管理简单,需要一个统一的视图—文件视图。
一段操纵外设的程序如下:
不管是操作什么外设实际上都是操作文件,使用操作系统给定的统一的接口:open,read,write,close。
不同的设备对应不同的设备文件。(/dev/xxx)
L27 键盘
对于操作系统来说,键盘相当于输入,键盘有输入,操作系统就存在中断。
outb输出一个字节,inb读入一个字节。
L28 生磁盘的使用
磁盘的基本认识:磁盘包括一个中间的柱子和一些盘面,磁盘的访问单位是扇区,扇区的大小是512字节,(扇区的大小是传输时间和碎片浪费的折中)
每个盘面包括两个面,盘面数等于磁头数,磁道数等于柱面数。
从磁盘读取数据,磁生电;向磁盘写入数据,电生磁。
首先移动磁头到相应的磁道上,再旋转磁盘到相应的扇区上,然后和内存缓存进行读写。
硬盘基本知识(磁头、磁道、扇区、柱面) - js王 - 博客园 (cnblogs.com)
但是这种方法太麻烦了,因此要进行层层抽象。
- 第一层抽象,使用盘块号读写磁盘(将扇区变成盘块)。
也就是对每一个扇区进行一个编号。扇区编号为C * (H * s) + H * s + s
,这样的好处是随着磁头的旋转,位置正好对应顺序。
扇区越大,读写速度越高,但是空间利用率越低。
- 第二层抽象,多个进程通过队列使用磁盘。
多个进程同时访问磁盘时的调度算法:
- 最直观的算法:FCFS,先来先服务
- SSTF调度:最短寻找时间调度,也就是磁头移动的最少。
- 实际中使用:电梯算法
生磁盘的使用整理:
- 进程”得到盘块号”,算出扇区号。(通过文件得到盘块号,下一节的内容)
- 通过扇区号发送请求make req加入队列,用电梯算法add_request进行调度。
- 进程sleep_on,进入阻塞态。
- 磁盘中断,处理进程请求。根据盘块号计算c,h,s;通过out发出指令和内存缓存进行读写。
L29 从生磁盘到文件
本质上就是将文件的字符流映射为盘块号。
映射方法一:连续盘块存放文件。将文件存在一个对应的FCB(File Control Block)映射表中,映射表包括文件名,起始块号,块数。但是可能存在问题就是文件修改后可能和其他文件冲突。
特点:读写快,增删慢,类似于数组。
映射方法二:链式存储法。文件对应的FCB就是一个起始块,映射的实际盘块根据链表确定。
特点:读写慢,增删快,类似于链表。
映射方法三:索引结构。类似于哈希表,通过索引块可以找到文件的某一部分对应哪个块。文件对应的FCB是索引块,索引块又存放着文件的某一部分对应的是哪个块。
映射方法四:实际系统中用的是多级索引。类似于多级页表的结构。根据文件的大小划分,小文件直接存到内存中,用类似于顺序的方法映射盘块号;大文件建立索引,根据索引号进行映射。
L30 文件使用磁盘的实现
通过文件使用磁盘,通过write来实现,fd就是文件的索引号。inode是文件的原信息,比如读写权限,字节数等等。
这文件视图也是UNIX设计的伟大之处,一切皆文件的思想。
L31 目录与文件系统
文件的字符流被映射为磁盘号。将磁盘抽象为目录树结构,也就是我们真正使用磁盘的样子。目录的结构类似于树的结构。根据路径名应该能找到文件的FCB。
格式化就可以使磁盘生成初始化后的目录结构,及各个文件对应的FCB的指针号。