发明名称 基于CPU总线互联的底层通信协议实现方法
摘要 本发明涉及一种基于CPU总线互联的底层通信协议实现方法,是一种通过系统间共享物理内存的方式实现系统间的通信,其特征在于:该方法的具体实现方式如下:步骤一、定义地址映射;步骤二、定义内核数据结构和预留sbuf的结构;步骤三、关键方法定义;步骤四、协议启动、数据初始化阶段;步骤五、monitor启动,监控各个队列;步骤六、处理收发操作;步骤七,协议关闭阶段。本发明在基于系统间可以共享物理内存的机制上,对于每一个系统都分配出一块物理空间,为各个系统共享,这样系统间的通信就可以通过直接读、写远程主机的共享buffer来实现系统间的通信。
申请公布号 CN101827088B 申请公布日期 2013.03.27
申请号 CN201010126126.5 申请日期 2010.03.15
申请人 北京航空航天大学 发明人 祝明发;田力;田媛媛;陈潇;李勇男;胡耀辉
分类号 H04L29/06(2006.01)I;H04L12/40(2006.01)I;H04L29/12(2006.01)I 主分类号 H04L29/06(2006.01)I
代理机构 北京慧泉知识产权代理有限公司 11232 代理人 王顺荣;唐爱华
主权项 一种基于CPU总线互联的底层通信协议实现方法,是一种通过系统间共享物理内存的方式实现系统间的通信,其特征在于:步骤一、定义地址映射对于板内的各个系统而言,系统间是独立的,划分的buffer地址范围在物理上是一致的,系统间实现buffer共享,需要每个系统对外都能提供逻辑地址空间,之后系统间的互访就可以通过访问逻辑地址空间实现;实现逻辑地址到物理地址变换可以通过HYPERTRANSPORT1地址映射来完成,每个HYPERTRANSPORT控制器提供了最多八个可用的地址映射窗口,地址映射方案采用双向环的策略,一个是顺时针环,一个是逆时针环,这样的设计使得每个系统都能访问其相邻的系统以及其对角线的系统,并且使得访问对角线的系统可以采用不同的环路径到达,这样的设计保证在一个环出现问题的情况下,可以通过另一个环来完成系统间的通信任务;步骤二、定义内核数据结构和预留sbuf的结构本通信协议的任务是完成主机间的数据传输的任务,主要包括数据发送和数据接收,对于收发的数据不仅要记录发送、接收的具体数据,还要记录收发数据的协议描述信息,类似于TCP/IP协议的头部,在内核中需要开辟空间维护四个队列,依次是:“消息发送队列”、“消息发送完成队列”、“消息接收队列”、“消息接收完成队列”;“消息发送队列”主要记录的是上层应用程序发送的消息,这些发送的消息还没有通知给消息的接收方;“消息发送完成队列”记录的是上层应用程序发送的消息,这些消息已经通知给消息的接收方,消息的接收方还没有传递消息接收完成的通知;“消息接收队列”记录远程主机发给本主机的消息和这些消息的基本信息,基本信息包括数据类型以及数据量大小、数据存放在buffer中位置,本机可以根据这些信息获取远程主机发给本主机的数据;“消息接收完成队列”记录发送方发给本主机的消息,接收方已将这些消息提交给上层应用程序,但还没有反馈给消息的发送方;此外,在内核中还需要开辟空间记录数据buffer的使用,包括为基于HYPERTRANSPORT互联的通信模块预留的数据buffer哪些已经被使用,哪些可以使用,可以使用数据buffer的单元大小;预留的sbuf主要是用于两台通信的主机交换信息使用,这是两台独立主机沟通的唯一渠道,这片buffer空间是操作系统为基于HYPERTRANSPORT互联的通信模块预留出的空间,对于这片空间操作系统不用于分配,而是把对这片空间的使用权完全交给基于 HYPERTRANSPORT互联的通信模块,通信模块将这片预留的sbuf进行划分,分为两个部分,一部分记录系统交互的信息,一部分记录两个系统间具体传输的数据;后一部分比较简单,仅仅记录系统间交互的数据,它由buffer管理结构对其进行管理;第一部分比较复杂,因为涉及到两个系统对这片预留buffer区域的操作,互斥的问题需要重点解决,记录系统交互的信息部分主要涉及两个结构,一个是“sbuf接收队列”,一个是“sbuf接收完成队列”;这两个队列都是供远程主机写入,本机读取的队列;“sbuf接收队列”主要是接收其他主机发给本主机的消息,这些消息仅仅包括消息头,这些消息头包括发送数据具体存放的位置,数据的长度,数据的类型,本机能够根据这些消息头所表达的信息,取得消息所包含的数据,这里取数据的操作主要是操作远端内存,因为接收的数据真正是存放在消息的发送方;“sbuf接收完成队列”存放的是数据接收方主机通告的数据已经接收完的通告,发送方根据这个通告,得知发送给接收方的数据哪些已经被提交给上层应用程序,已经提交的数据,发送方需要释放数据所占用的buffer空间;由于对“sbuf接收队列”和“sbuf接收完成队列”这个队列的操作是由两台主机来完成,通常的锁机制在这里并不能使用,为了保证对预留buffer操作的互斥性,在sbuf中设置了一些代表锁结构的标识并使用一定的策略来达到互斥的效果;下面将具体的介绍如何利用这些标识和相关的策略来达到对预留buffer操作的互斥性;对于两台主机都能访问的sbuf结构加入额外两个锁,称其为lockA,lockB,假设主机A和主机B是对共享buffer空间操作的两台主机,这片buffer空间是主机A为HYPERTRANSPORT互联通信预留的buffer空间,那么主机A对这片buffer空间的操作相当于操作本地内存,主机B对这片buffer空间的操作相当于操作远端内存,主机A和主机B可以分别使用lockA和lockB锁住这片空间,其中lockA与lockB在初始化阶段都被设置为非锁定状态,每台主机想操作这片buffer空间都需要在对方没有锁定的情况下才可以;假如主机A想操作这片共享的空间,它先使用lockA把这片空间锁住,之后获取lockB这个锁的状态,如果主机B没有锁定这片buffer空间那么它就可以操作,操作完成后,打开自己加的锁,如果主机B已将buffer空间锁定,主机A就直接打开自己加的锁,不然会造成死锁;对于主机B而言,它要想操作这片空间,也需要获得对方的锁,它首先通过自己的锁lockB把共享的buffer锁定,之后获取lockA的状态,如果对方加锁,它直接释放掉自己加的锁,如果锁可以获得,它并不能马上操作这片空间,而是要多询问几次,如果锁在询问过程中一直都可以获得,它才去操作这片空间,操作后释放掉自己加的锁,如果有一次询问的结果是主机A已对buffer空间加锁,主机B无条件释放对这片buffer空间加上的锁,原因在于这片buffer空间可能事先主机A和主机B对它都没有操作,双方的锁都是打开的状态,主机A 和主机B可能同时去获取锁,这样就造成了主机A和主机B都对这片buffer空间有操作权,为了避免这种情况的发生,采用让主机B这个操作远端内存的主机多次询问的方式来避免该种情况的发生,即在主机A和主机B都同时获得了对这片buffer空间的操作权时,其实最终能够操作这片buffer空间的主机是主机A,主机B没有对这片buffer空间做任何操作;步骤三、关键方法定义基于以上的数据结构,需要主要定义如下方法并实现才能保证通信协议正常运转;定义的主要方法分别是“发送操作”,“接收操作”,“获取buffer”,“释放buffer”,“监控发送队列”,“监控接收完成队列”,“监控sbuf接收队列”,“监控sbuf接收完成队列”;“发送操作”是通信协议为上层应用程序提供的调用接口,它负责的功能是解析用户的请求,具体包括解析应用程序将把数据发送到那里,数据的大小,数据的类型信息,发送函数根据这些信息去调用“获取buffer”函数,来确定剩余的预留buffer空间是否还能够满足用户的请求,如果空间不够,向用户程序通告发送失败的消息,如果可以满足请求,那么发送函数将用户要发送的数据由用户空间拷贝到内核空间,同时产生记录表项,包括数据buffer使用的记录,发送的消息记录,之后获取数据接收方的锁,看是否可以把发送的信息通告给数据接收方,如果可以将通告信息通知给数据接收方,那么“发送操作”就向接收方的sbuf中写入通告信息,同时产生发送完成表项插入到自己的发送完成队列中,如果通告信息不能通告给数据的接收方,那么“发送操作”将产生发送表项,插入到自身的发送队列,等待monitor的扫描对该队列包含的请求做出处理;“接收操作”也是通信模块为上层应用程序提供的调用接口,这个函数主要负责解析用户程序调用传递的参数,根据数据来源、消息标示的信息在“接收队列”中搜索,如果找到了匹配的项,说明数据已经正确的接收,这时将数据提交给上层应用程序,并释放相应的接收表项,数据提交后还需要通告消息发送方数据已正确接收,以便发送方能够及时释放掉已发送数据占用的buffer空间,对于这个操作,“接收操作”需要获取消息发送方sbuf结构的锁,如果消息发送方的sbuf中可以写入接收完成通告表项,那么就将通告写入到发送方的sbuf中的接收完成队列中即可,如果不能写入,就需要生产接收完成表项插入到自身的接收完成队列中,等待monitor的扫描把通告发送给消息的发送方;“获取buffer”操作是根据申请的buffer大小信息,在数据buffer管理结构中查找这样的buffer,如果能够找到,就分配buffer,并对buffer使用记录做更改,如果不能分配buffer,就返回buffer请求失败的信息;“释放buffer”要做的操作是根据调用的参数确定即将释放buffer的起始地址和需要释 放buffer的大小,之后扫描数据buffer管理结构的队列,来完成具体buffer回收的操作;“监控发送队列”完成的功能是在monitor扫描该队列时,首先确定队列中是否有请求没有得到处理,如果没有,该操作什么都不做,如果有请求没有处理,那么去获得远程主机的sbuf锁,如果锁获取失败,那么什么都不做,如果锁获取成功,再查看远程sbuf中可以接收的表项数目,如果为零,说明远程主机的sbuf中不能再接收新的表项,那么什么都不做,如果不为零,取发送队列中表项数和远程主机sbuf中可以接收表项数中较小的值,将相应的发送表项写入到远程主机的sbuf的接收队列中,同时需要释放发送表项,并产生发送完成表项插入到发送完成队列中,这之后需要相应更改发送队列、发送完成队列、sbuf接收队列中的表项数目值;“监控接收完成队列”完成的功能是在monitor扫描该队列时,确定是否有接收完成通告需要通知给消息的发送方,如果该队列为空,什么都不做,如果队列不空,说明有请求需要处理,之后获取远程主机sbuf锁,如果锁获取失败,那么什么都不做,如果锁获取成功,再查看远程sbuf中可以接收的表项数目,如果为零,说明远程主机的sbuf中不能再接收新的表项,那么什么都不做,如果不为零,取接收完成队列中表项数和远程主机sbuf中可以接收表项数中较小的值,将相应的接收完成表项写入到远程主机的sbuf的“接收完成队列”中,同时需要释放接收完成表项,这之后需要相应更改接收完成队列、sbuf接收完成队列中的表项数目值;“监控sbuf接收队列”完成的功能是首先获取sbuf的锁,如果锁获取失败,什么都不做,如果锁获取成功,查看sbuf中的表项数目,如果数目为零,什么都不做,如果数目不为零,那么在内核空间申请与sbuf中表项数目相应的接收表项数目,考虑到在内核空间去申请空间可能会失败,那么会得到一个实际申请到的接收表项数目值,根据这个值,将sbuf中的表项数目拷贝到接收队列中,同时更改sbuf中接收表项数目的值和接收队列中表项数目的值;“监控sbuf接收完成队列”完成的功能是首先获取sbuf的锁,如果锁获取失败,什么都不做,如果锁获取成功,查看sbuf中的表项数目,如果数目为零,什么都不做,如果数目不为零,那么在发送完成队列中搜索相应的表项,将搜索到的表项记录从发送完成队列中销毁,同时需要释放该消息数据所占用的buffer单元,调用“释放buffer”函数回收数据buffer,处理过sbuf中的所有表项后,那么更改sbuf接收完成队列中表项的记录数以及发送完成队列中的表项数;步骤四、协议启动、数据初始化阶段本阶段主要完成通信模块中的一些信息初始化工作,主要包括在内核中申请的一些记录信息的初始化,为基于HYPERTRANSPORT互联的通信模块预留的buffer空间的初始化,具体包括“发送队列”,“发送完成队列”,“接收队列”,“接收完成队列”的初始化,“数据buffer管理结构”的初始化,“sbuf中锁”的初始化,“sbuf中接收表项数目和接收完成表项数目”初始化,“sbuf中接收队列”初始化,“sbuf中接收完成队列”初始化;步骤五、monitor启动,监控各个队列monitor使用内核定时器,在设定的时间到达时刻去扫描“发送队列”,“接收完成队列”,“sbuf接收队列”,“sbuf接收完成队列”,如果队列中有请求需要处理,就调用相应函数对该请求做出适当的处理,如果队列中无需要处理的请求,monitor会继续扫描下一个队列,扫描队列完成,重新设置定时器,之后采用休眠,在定时时刻再次到来时再去扫描各个队列,monitor在协议启动后处于一直运行的状态,直到协议关闭,可以对monitor扫描的时间做动态的调整,这个统计可以基于每次扫描处理请求的时间来做调整;步骤六、处理收发操作当用户程序有数据收发请求时,将调用内核中的通信模块,对于发送操作,通信模块负责对发送的信息做以记录,并将数据从用户空间拷贝到内核空间,并通知数据接收方数据已发送,等待数据接收方取数据;对于数据接收操作,用户程序调用处于内核态下的通信模块,通信模块负责去查找要接收的数据是否已经正确接收到,如果正确接收到,将数据从内核空间拷贝到用户空间,同时销毁一些记录信息,并通知数据发送方,数据接收已完成,发送方接收到接收完成通告将销毁一些记录信息同时释放数据所占用的buffer空间,如果用户程序要接收的数据还没有正确接收,那么内核模块将不返回任何数据,通告用户程序数据未正确接收;步骤七,协议关闭阶段本阶段发生在卸载通信模块阶段,否则,该通信模块将一直运行在内核态下,为用户的请求提供服务,在模块卸载阶段,将销毁在协议启动阶段所分配的内核空间。
地址 100191 北京市海淀区学院路37号北航计算机科学与工程学院