第二十六讲 I/O与显示器
CPU向外设的控制器发送指令,这些控制器中有寄存器,具有计算功能;然后外设在控制器的作用下工作,完成工作后,向CPU发出中断请求,CPU进行中断处理
要想进行外设的驱动,最核心的是out向外设的控制器的寄存器发出指令;为了让out做得统一,让用户使用的方便,需要有一个统一的文件接口,形成文件视图;做好外设的中断处理;
这样不同形式的 printf 就对应了不同的文件视图格式,也就对应了不同的设备控制命令,最终是对不同的外设的控制器进行下达命令;比如printf 是向显示器输出,而fprintf是向磁盘进行输出
printf 是库函数的调用,展开后是现在内存中格式化输出了内容,再调用write这个系统调用函数,将内容输出到对应的外设,这里是显示器,然后是out 这个核心的内核函数包裹信息,输出到对应的控制器;
第二十七讲 键盘
显示器是输出,outb,键盘是输入,inb
键盘作为输入,有自己的初始化的中断类型
键盘中断获得端口的扫描码,进而获得键盘按下的ASCII码
第二十八讲 生磁盘(Raw Disks)的使用
磁盘的结构:
磁盘读取一个字节的过程:首先磁盘将磁头移动到对应的磁道上,然后磁道开始旋转,转到该字节所在的扇区,然后磁生电,将该扇区的该字节读取到内存缓存;同样要在该字节处写入新的内容时,就从内存中将内容通过电生磁,写到该字节处
柱面,磁头、扇区参数确定磁盘上的具体的位置,缓存位置确定和磁盘交互的内存位置
上述的动作基本上已经实现了对磁盘的使用,但每次使用需要确定太多信息,操作麻烦,操作系统在这里要进行第一层的抽象,既只需知道一个盘号就行;这里操作系统要实现对磁盘的使用的简单和高效;为了实现高效的访问连续的块,那么就需要对块的编号进行合适的编排:从外层的上层的盘面的某块开始作为0,按旋转方向,在相同的磁道上的邻接位置作为下一个编号的块,直到该磁道全部编排结束,则把该盘面的下一个盘面的对应位置作为下一个编号的块,直到最下层的盘面,然后向内移动一个柱面,到径向方向的下一个位置作为编号,如此重复;
从扇区到盘号的转变,是一次空间换时间的应用
这里使用的是Linux0.11,此时左移一位,相当于盘块的大小为两个扇区
多个进程访问磁盘的时候通过队列实现
对于多个进程的请求的块组成的队列,要有合适的调度算法来实现对磁盘的访问;
这里同样从简单的FCFS开始
改进后的使用SSTF算法,这种可能造成饥饿问题,既可能在处理某个块的时候,又来了新的附近的块,这样就造成远处的块长时间得不到响应
为了解决饥饿问题,就提出了SCAN算法:
为了更加公平的访问队列中的元素,在运行到一段结束后,立刻折回,重新从开头的位置进行访问,这也是实际中使用的算法
第二十九讲 从生磁盘到文件
这里的关键是最终能够从文件得到盘块号,反过来说,就是从生磁盘如何抽象到文件;
文件是更高层次一层抽象,问了更方便统一的对磁盘进行操作
文件的核心是字符流
磁盘上的信息是通过盘块组织的
用户对文件的使用,通过操作系统映射到具体的盘块号,进行具体的操作;
操作系统建立文件到磁盘块的映射,并维护该映射;
通过文件找到盘块号:通过文件建立FCB的表,文件按顺序存放到磁盘上,形成这样的表,这样对文件中的第多少个字符进行操作,就可以通过一定的换算,得到其对应的盘块号,从而建立文件到盘块号的映射;
该种连续结构实现的映射比较适合读写,但不适合动态增长的文件,因为文件的增长会造成覆盖或者整体复制的时间浪费等;
链式结构的实现:数据结构中的链表在磁盘上的实现;这种结构导致存取数据比较慢,应为每次都要从开始的地方就进行读取,不能进行随机访问,但是利于动态增长;
索引结构的实现:既适用于动态增长,访存的过程也不慢
实际运行中的多级索引结构:即可以表示很大的文件,也能实现很小文件的高效访问,同时对中等大小的文件的访问速度也不慢;
总而言之,是要能够实现从字符流中的字符位置计算出盘块号;
第三十讲 文件使用磁盘的实现
要写出去的字符的在字符流中的位置是通过file获得,要写出去的字符的数量通过count获得,这样就获得了要写出的字符流中的字符段,字符在内存中的位置通过buf获得,而要映射到的磁盘上的位置,通过inode获得,这样就获得了整个写出过程;
如何通过file获得具体的字符位置:pos获得字符的起始位置;根据起始位置找到具体的盘块号,通过block获得;通过bread函数向磁盘发出请求;
如何算出盘块号:
为了提供统一的文件视图信息,设备同样以文件的形式进行组织:
现在讲的是有了fd这个文件指针后,如何根据文件指针找到磁盘中对应字符流中的某个位置的字符段的磁盘上的磁盘号;
但还要讲如何通过文件名找到fd;
从文件名或者路径名找到inode,根据inode找到盘块号,根据盘块号放入到电梯队列中,根据电梯队列中的盘块号算出CHS,根据out发到磁盘控制器上,磁盘控制器驱动马达,电生磁,磁生电来生成数据;
第三十一讲 目录与文件系统
文件系统,抽象整个磁盘;底层结构是对上层结构的实现,上层结构是对底层结构的抽象,用户看到的是这棵文件树;
文件是一个文件映射磁盘块集合,文件系统是一堆文件映射整个磁盘 ;
文件系统的发展:
给出一个路径名,这个路径名体现了的一个树状的文件结构,并能够通过这个路径名得到FCB,既inode;
my目录下应该存放一些可以帮助找到data文件的信息,既my目录下存放所有直接文件的FCB或其指针;
根目录的位置是固定的;
超级块通过存储i 节点位图和盘块位图,来计算根目录的位置