首页 理论教育 设备打开操作及操作系统实现之路

设备打开操作及操作系统实现之路

时间:2023-10-21 理论教育 版权反馈
【摘要】:在Hello China当前版本的实现中,设备的打开操作是通过调用CreateFile函数实现的。如果遍历完整个链表,没有查找到目标设备对象,则说明对应的设备没有安装,这种情况下,CreateFile返回一个空值,表示打开设备失败。另外还可以看出,对设备的打开操作也是以设备名作为唯一关键字来查询设备的,因此,Hello China当前版本的实现中,要求系统中的所有设备必须具有不同的设备名字。

设备打开操作及操作系统实现之路

在Hello China当前版本的实现中,设备的打开操作是通过调用CreateFile函数实现的。该函数是由IOManager提供给用户线程,用户线程访问设备之前,使用该函数打开待访问的设备。该函数不但可以用于打开物理设备,而且还可以用来打开或创建普通的数据文件(从该函数的名字也可以看出这一点)。下面描述了打开一个物理设备的过程:

(1)用户调用该函数,其中待打开设备的设备名字作为参数之一。

(2)CreateFile函数(也可以说是IOManager)分析设备名字,如果发现该设备名字是一个普通文件(以文件系统标识符开头,如C:,D:等),则启用文件打开流程,如果分析结果表示,待打开的设备对象是一个物理设备(以\\.\开头),则继续下面的设备打开操作流程。

(3)CreateFile查询设备对象链表,以设备名字作为索引关键字,从头开始遍历设备对象链表。

(4)如果遍历完整个链表,没有查找到目标设备对象,则说明对应的设备没有安装,这种情况下,CreateFile返回一个空值(NULL),表示打开设备失败。(www.xing528.com)

(5)如果能够在设备对象链表中找到对应的设备,则判断设备的当前状态(打开还是未打开)。如果状态为打开,则判断该设备是否允许共享打开(允许两个或以上的线程同时打开该设备),如果允许,则增加设备打开计数,然后返回设备对象指针,如果不允许,则仍然返回一个空值(NULL),指明该操作失败。

(6)调用CreateFile的线程如果得到一个失败的操作结果,可以通过GetLastError调用,获取错误原因。否则即可保存设备对象句柄,由后续其他操作(比如ReadFile等)使用。

可以看出,上述操作的关键是遍历整个系统设备对象链表。另外还可以看出,对设备的打开操作也是以设备名作为唯一关键字来查询设备的,因此,Hello China当前版本的实现中,要求系统中的所有设备必须具有不同的设备名字。要达到这个要求,如果任意取设备名,可能发生冲突,因此必须采用一些特殊的命名措施,来确保系统中所有设备的名字没有冲突。下面介绍几种可用的设备命名策略,供设备驱动程序实现者参考。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈