首页 理论教育 IO端口资源管理-操作系统实现之路

IO端口资源管理-操作系统实现之路

时间:2023-10-21 理论教育 版权反馈
【摘要】:在当前版本的Hello China实现中,由DeviceManager对象对IO端口资源进行统一管理。图9-2 Hello China的端口资源管理UsedPortResource链表起始为空,即没有任何IO端口资源被使用,而FreePortResource则包含了所有可用的IO端口资源。一旦有驱动程序被加载,则驱动程序会调用ReservePortRegion函数以预留IO端口资源,这样如果请求预留的端口资源没有被使用,则DeviceManager会创建一个__RESOURCE对象,根据ReservePortRegion的参数对该Resource对象初始化,并把对象插入到UsedPortResource链表中。

IO端口资源管理-操作系统实现之路

在当前版本的Hello China实现中,由DeviceManager对象对IO端口资源进行统一管理。在DeviceManager对象的定义中,定义了两个成员变量:UsedPortResource和FreePortResource。其中,UsedPortResource把已经使用的端口资源连接成一个双向链表,而FreePortResource则把当前空闲的资源连接成一个双向链表,如图9-2所示。

978-7-111-41444-5-Chapter09-12.jpg

图9-2 Hello China的端口资源管理(www.xing528.com)

UsedPortResource链表起始为空,即没有任何IO端口资源被使用,而FreePortResource则包含了所有可用的IO端口资源(0x0000~0xFFFF)。一旦有驱动程序被加载,则驱动程序会调用ReservePortRegion函数以预留IO端口资源,这样如果请求预留的端口资源没有被使用(位于FreePortResource链表内),则DeviceManager会创建一个__RESOURCE对象,根据ReservePortRegion的参数对该Resource对象初始化,并把对象插入到UsedPortResource链表中。需要注意的是,在插入使用链表的同时,会从FreePortResource链表中删除相应的资源。如果请求预留的资源是一块连续端口资源的一部分,比如,用户请求预留资源0x0010到0x001F,而位于空闲链表中的资源是包含用户请求资源的更大范围的空闲端口,比如0x0000到0x01FF,则DeviceManager就会执行一个拆分动作,把0x0000到0x01FF的资源拆分成0x0000~0x000F、0x0010~0x001F和0x0020~0x01FF三部分,然后把中间部分返回给用户(添加到使用链表中),把剩余的两部分重新插入空闲链表。

相反,如果驱动程序释放了一个端口范围,则DeviceManager会把释放的端口范围插入到空闲资源链表中,并进行一个合并操作,把零散的(但是连续的)端口范围尽量合并成一个连续的端口范围。

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

我要反馈