接下来我们再看一下
I/O设备的一个接口分析
首先我们看一下
I/O设备接口的一个大致位置
它在我们整个文件系统的
靠底下这一部分
它呢首先向上和我们VFS有一个接口
使得它也能够被我们VFS统一管理
同时呢 它也和我们
具体文件系统有一个接口
使得具体文件系统向它
可以发出读 写 控制等请求
向下呢它还进一步
和我们的驱动有一个接口
使得和不同的外设
比如我们的硬盘 我们的串口
我们的屏幕等等进行对接
完成最底层的数据的访问
这是I/O接口这一块大致的一个功能
这里面很关键一个结构
就是device这么一个结构
可以看出来它和我们前面
inode的定义相似之处
它也是一系列函数指针
和一些成员变量组成
特别是open close I/O
还有I/O control
那么open close和我们前面讲的
Inode 的open close是一个意思
就是打开设备 关闭设备
I/O呢它用一个这个来表示读或者写
I/O control是用来表示什么
表示一些 通常读写
不太方便表示的一些操作
比如说我要完成对某个设备的控制
它不是读也不是写
那么就需要有一个 特殊的一个
函数的指针来完成
它怎么和我们VFS进行对接呢
在这里面它还有一个成员变量
是对接着这里面的FS 可以看出来
一个device是属于一个特殊的
device VFS这么一个结构
而device VFS呢 会挂到一个
VFS一个总体框架之下
从而完成了在VFS这个层面
对device的一个有效的管理
那我们可以再结合
整个device的初始化过程
来了解怎么来实现
对device的一个访问
当然这个访问是通过VFS来实现的
这里面并没有拿我们SFS
所直接对接的disk来做一个介绍
而是以另外两个设备
就是stdin或者stdout
stdout是往串口和显示器
输出这么一个设备
而stdin呢是接收键盘输入一个设备
那么我们希望大家通过
对这两个设备的了解
来进一步自己去分析
对于disk这么一个device
怎么进行初始化的
可以看出来 这是我们最早的那个
uCore开始启动的时候
做初始化的总控函数
在这里面会增加一部分
这一部分是fs_init
这是lab8的一个增加的一部分内容
在fs_init里面呢
会进一步调device的init
OK 这里面又会进一步
调好几个不同类型的
device的一个初始化
先拿stdout来举例
stdout呢会创建一个inode
这个inode是专门针对device的inode
这就把我们的device和inode
建立了一个联系
同时还有一个stdout_device_init
那么这个呢 是完成了
对它的函数的一个对接
还有一个vfs_add_dev
从而使这个device可以加入到
这个VFS整个的管理之中来
进一步可以看看这个
device_init做什么事情
它把刚才device所针对那些函数指针呢
跟我们具体函数进行了对接
包括了open close还有I/O
这个I/O就是读 写的什么操作
大家想一想
这是stdout 那是一个写操作
还有是一个control
表明一些特殊操作 用control来表示
这就是stdout一个device的初始化过程
在这个初始化过程中我们可以看到
它创建了inode 和VFS进行了对接
把自己的一些特定的函数
以device里面的虚函数指针进行了对接
那么完成这些工作之后
我们在VFS层面呢
就可以有效地访问这个device了
同理我们看一下stdin 这是输入
相对是read操作
那么跟前面不同在哪呢
就在一个地方dev_init_stdin
同时也一样有一个stdin一个device_init
它和前面操作是类似的
它也建立它自己一套函数体系
和device函数指针进行对接
其它两部分是一样的
创建一个inode 和绑定VFS
但这个对接有点不太一样
它的I/O这个操作是对应stdin的I/O
那这个是什么呢 是一个读操作
因为它是需要从键盘读入数据
还有一个不同在哪 在这儿
它增加了一个等待队列的设置
为什么会增加这么一个设置 大家想一想
其实有可能 当它想去发出读请求之后
不能马上得到回应
在这个时候 由于资源得不到满足
它需要去睡眠
从而可以把CPU让出来
这是我们前面讲同步互斥的时候
涉及到的一些概念
可以看出来在file system里面
整个大的框架里面呢
会涉及到进程 同步互斥
内存管理等多方面内容
是对我们前面一系列实验的
进一步补充完善和使用