在多处理器系统中的处理器之间传送消息的方法与装置的制作方法

文档序号:6411129阅读:329来源:国知局
专利名称:在多处理器系统中的处理器之间传送消息的方法与装置的制作方法
技术领域
本发明涉及多处理器系统领域。更具体地,本发明涉及在多处理器系统中的处理器之间传送消息的方法与装置。
消息只是用来传送操作参数与数据的数据结构。消息是由在一个或多个平台上执行的一个或多个进程(即应用)生成的。平台包含一个处理器或处理器簇、关联的存储器、局部存储器总线及存储器输入/输出总线。平台内的这些元件构成一个操作环境。
再者,平台执行操作系统的一单个实例。换言之,计算机系统为分布式处理系统,在其中单一的操作系统支持多个处理器。在一个特定平台上的进程之一生成消息之后,便将它送至另一处理器平台供处理。
一则消息可用指向驻留在存储器中的控制块的指针指示,控制块中包含指令及指向附加信息数据块的其它指针。例如,控制块可指定特定的外围设备(即,硬盘驱动器),并请求从该设备的指定扇区读取数据。
在“紧耦合”(即处理器共用单个高速缓冲存储器)的处理器的对称多处理器系统(SMP)及在用公用总线结构将处理器“松”耦合在一起的不对称多处理器系统中的处理器之间利用消息传递。
当将消息从第一平台中的一个处理器传递给第二平台中的第二处理器时,消息必须排队以便消息指向的处理器在其资源空闲时可处理该消息。
对消息进行排队的先有技术方法主要采用软件技术实现。这些方法需要对共享的队列结构进行多次原子访问。例如,在单一处理器上运行的多个进程可共用位于由这些处理器共用的存储器中的一个消息队列。进程之一为了得到原子访问,操作系统授予请求存取队列的进程一个给予该进程对队列独享权(即原子访问)的信号。信号只是给予进程对共享数据结构(即操作系统上下文的一部分)的独享存取的操作系统变量。这时进程便可在队列上增加或删除消息。当一个特定的进程控制该信号时,它便封锁要求存取该队列的其它进程。其它进程在可以获得对该共享结构的存取之前必须等待第一进程释放该信号。
在多处理器系统中,一个以上的处理器可能同时试图得到对该信号的存取。从而,为了同步(即原子访问)需要总线封锁。当一个处理器将总线封锁时,另一处理器便不能存取存储器中的同一共享结构(即存储器块)直到第一处理器解锁总线为止。由于信号是在系统存储器中的,即使其它处理器没有在争用信号时也将它们封锁。因此,在能被挂起的软件模块中(即多任务操作系统)永远不能使用总线封锁。作为替代,当在这些应用中得到与释放信号时,便需要对操作系统核心的调用。
由于在等待信号或等待总线存取时各进程花费在空闲上的时间量,上述操作非常低效。再者,上述对操作系统核心的调用导致昂贵的上下文切换。
上下文只是专用于一个应用的存储区(即应用代码与数据)。应用上下文包括标志、变量及当前进程状态。由于信号是在与应用上下文不同的上下文(即操作系统上下文)中的一个操作系统变量,系统资源对切换上下文是必须的。例如,在改变数据指针的上下文切换中,将指针压到栈上并且还修改进程控制参数。
不具有总线封锁能力的先有技术计算机系统采用高度复杂的算法来提供处理器之间的同步。在这些系统中,进一步降低了性能。
从而,存在着对不用信号而允许高效地直接存取队列的方法与装置的需求。
本发明涉及用于在多处理器系统中的处理器之间传送消息的方法与装置。本方法与装置允许不对称多处理器系统中的处理器之间的消息通信。不对称多处理器系统只是其中的处理器并发执行不同操作系统的系统。例如,应用平台上的应用处理器正在运行诸如Windows NTTM等标准应用操作系统软件。然而,I/O平台上的处理器则正在运行适用于I/O操作的特定操作系统(诸如,实时操作系统RTOS)。具体地,本发明提供一个快速与直接的机制,用于从在一个或多个处理器平台上执行的一个或多个进程将消息排队到包含一个本地处理器的平台上。
本发明提供将消息缓冲器分配给其它平台的入站空闲队列(inbound free queue)、及投送来自I/O平台外部的处理器与总线代理的消息的入站(inbound)工作队列。此外,本发明提供投送从本地处理器(即I/O平台的处理器)到另一处理器平台(即主处理器)的消息而使其它平台上的处理器能检索这些消息的外出工作队列(outbound work queue)。本发明还提供主处理器能将消息缓冲器释放到其中的外出空闲队列(outbound free queue)。这一队列在主处理器处理过消息之后将消息缓冲器释放给本地处理器。
本发明用在主平台与I/O平台之间提供非常快速与高效的硬件队列接口的消息单元来管理这些队列。本发明在单个PCI总线事务周期中能提供空闲消息缓冲器或“空”指示器(即读消息单元中的寄存器)。再者,本发明能在单个PCI总线事务中投送或检索消息或“满”指示器(即写入到消息单元中的寄存器)。
用硬件接口管理队列,本发明提供了超过先有技术软件队列管理技术的若干优点。首先当进程试图在满或空队列上执行队列操作时,本发明避免了死锁或锁定。在检测到试图从空表或队列中取时,本发明的消息单元很快返回一个空指示。类似地,当检测到试图投送到满队列时,本发明很快返回特定队列是满的指示。能用最少的硬件资源高效地实现本发明。
再者,由于本发明在单个总线事务处理周期中执行队列存取,便消除了同步(即取得与释放信号)的必要性,并明显地改进了系统性能。队列存取只是在队列上加上一个元素或从队列上去掉一个元素。队列存取可包含定位下一元素、改变该元素及修改一个队列描述符以为下一次队列存取指示下一元素等特定任务。本发明是自动执行这些任务的。正在进行这些任务期间,必须封锁队列使得另一进程不能获得同一消息缓冲器或改写另一消息。本发明在一次总线事务中提供队列存取得益于单个PCI总线事务内在地是原子的这一事实(即执行该事务的总线代理的独占存取)。再者,本发明通过就绪与重试信号自动处理同步。
再者,由于本发明排除了对信号的需求,冻结系统资源的上下文切换不再必要。由于对消息传送单元中的寄存器单一的读或写是存取一个特定队列所需要的,并且读或写可在一个总线事务处理中完成,因此信号不再需要。
在附图的图中以示例方式而不是限制方式展示本发明,附图中相同的参照指示相同元素,附图中

图1展示实现本发明的不对称多处理器计算机系统的方框图;图2展示包含本发明的I/O平台;图3展示本发明的一个实施例;
图4展示本发明的循环队列;图5进一步展示本发明的循环队列操作;图6A展示本发明的入站空闲状态机;图6B展示用于入站空闲状态机的状态图;图7A展示本发明的入站投递状态机;图7B展示入站邮件状态机的状态图;图8A展示本发明的外出检索状态机;图8B展示外出检索状态机的状态图;以及图9A展示本发明的外出释放状态机;与图9B展示外出释放状态机的状态图。
图1展示实现本发明的多处理器计算机系统的方框图。多处理器系统100包括主处理器102。主处理器102可包含多个处理器(即紧耦合处理器簇)。主处理器102通过主总线103耦合在主存储器104上。存储器总线103还将主处理器102与存储器104耦合到主芯片组105上。主芯片组105包含存储器控制器、高速缓冲存储器控制器及提供存储器总线103与输入/输出(I/O)总线106(诸如PCI总线)之间的接口的桥。
主芯片组105是本技术中已知的。例如,当主处理器102为Intel制造的PentiumTM处理器时,适当的主芯片组105为也是Intel制造的TridentTM芯片组。类似地,如果采用的是p6TM处理器,则适当的主芯片组105为也是Intel制造的OrionTM芯片组。在这一多处理器系统100中,主处理器102、存储器总线103、主存储器104及主芯片组105将称作主平台。
多处理器系统100还包括耦合在第一PCI总线106上的I/O平台108。再者,I/O平台108提供第一PCI总线106的地址空间与包含在I/O平台108中的处理器的地址空间之间的接口。I/O平台108还可包含将第一PCI总线106耦合到第二PCI总线(未示出)上的桥。
I/O平台108还为主处理器提供I/O支持,以及耦合在第一PCI总线106与第二PCI总线上的设备(未示出)。关于I/O平台108的一个实例,请参见转让给Intel公司的有关申请。图2更详细地展示包含本发明的I/O平台200(前面在图1中称作元件108)。I/O平台200包含经由本地总线204通过存储器控制器205耦合在本地存储器206上的本地处理器202。本地处理器202可以是Intel 80960JF处理器。
地址翻译单元(ATU)218耦合在本地总线204及第一PCI总线208(前面在图1中称作元件106)上。地址翻译单元(ATU)218将PCI总线208的地址空间中的地址翻译成处理器202地址空间中的地址,反之亦然。从而,具有PCI地址空间中的地址的PCI总线208上的事务必须翻译成本地总线204地址空间,以便存储器控制器205可存取本地存储器206中的正确单元或MU210中的适当寄存器212。
ATU218包含外出模块用于将本地总线事务翻译成PCI总线事务、入站模块用于将PCI总线事务翻译成本地总线事务及控制状态机用于管理这一地址翻译。对于本发明而言,可将ATU218看成地址解码器,它检测特定的PCI总线事务存取MU210中的寄存器212之一。ATU218检测到一个事务为对MU210中的寄存器之一的存取之后,便通过数据路径221发送一个信号来启动MU210中的控制状态机,这将在后面描述。控制状态机214通过数据路径221发送多个信号到ATU218,通知ATU218 MU210未准备好接收该事务,或者指示ATU218向提出请求的进程发出重试信号。
本地总线仲裁器240将本地总线204的控制授权给本地总线主中任何一个(即MU210、ATU218的入站模块及本地处理器202)。仲裁电路240是本技术中周知的。
为通过数据路径224与225对本地存储器206的存取设置了存储器控制器205。虽然已示出本地总线204为单一数据路径,但本地总线204可由地址部分与数据部分构成。
总线代理201可以是主处理器或另一I/O平台。再者,总线代理201可包括图1中的主存储器104、主处理器102、主芯片组105及主总线103。换言之,总线代理201本身可以是一个子系统或任何智能总线代理。
消息单元210耦合在本地总线204及ATU218上。MU210实现本发明的教导并包含多个寄存器212及多个状态机214。下面参照图3进一步描述这些寄存器212及状态机214。
图3展示实现在MU210中的本发明。MU210包含通过控制路径350耦合在ATU218上的多个状态机214。MU210还包含多个预取与临时寄存器332。这些寄存器332通过数据路径336耦合在ATU218上。预取与临时寄存器332还通过数据路径352受控制状态机214的控制。寄存器332还通过数据路径334耦合在本地总线204上以存取本地存储器206。
在本实施例中,MU210包含利用四个循环队列的消息传递方案。在本实施例中有四个预取与临时寄存器332。装置了两个寄存器以允许主处理器将数据写入循环队列。设置了两个寄存器以允许主处理器从循环队列之一读取数据。
MU210还包括通过数据路径342耦合在控制状态机214上的多个队列指针寄存器340。这些寄存器中存储队列207的头与尾指针。下面相对于图4与5更详细地描述这些队列。循环队列MU210向总线代理201提供对四个循环队列207的存取。其中两个为入站队列及两个为外出队列。“入站”与“外出”是指活跃消息的流动方向。“入站”消息为对于本地处理器202由总线代理201向进程投送的新消息或者可供总线代理201使用的空的或空闲的消息缓冲器。“外出”消息为对于主处理器201由本地处理器202投送的消息或者是本地处理器202可使用的空闲缓冲器。
在一个实施例中,有四个循环队列用来在主处理器/总线代理201与本地处理器202之间传递消息。有两个入站队列用来处理入站消息,及两个外出队列用来处理外出消息。将入站队列之一指定为空闲队列,并且它包含入站空闲消息句柄。消息句柄为消息缓冲器的逻辑或物理地址。将另一入站队列指定为邮件或工作队列,并且它包含入站投送的消息句柄。类似地将外出队列之一指定为空闲队列,并将另一外出队列指定为邮件队列。
两个外出队列允许本地处理器202将外出消息投送在邮件队列中及接收从外部主处理器201返回的释放的消息到外出空闲队列中。两个入站队列允许总线代理201从入站空闲队列得到空闲消息缓冲器,并随后投送该缓冲器给入站空闲队列供本地处理器202处理。
循环队列207的数据存储器是由本地存储器206提供的。在本特定实现中,队列中的各项为一作为消息句柄的32位数据值。再者,对队列的读或写可正好存取一个队列项。
各循环队列具有一个头指针与一个尾指针。对队列的写发生在队列的头上而读则发生在尾上。头与尾指针由运行在本地处理器202上的软件或消息单元210递增。稍后描述关于本地处理器202及MU210如何增量头与尾指针的细节。
头与尾指针为各相应循环队列中的偏移量并在0到循环队列大小减一的范围内(即用0开始标记指针)。这些指针是在每次队列存取之后递增的。头与尾指针在它们到达队列大小(即队列尾部)时卷动回到0。
消息单元210在某些条件下生成对本地处理器202的中断或生成PCI总线中断(即对外部处理器的中断)。通常,在写入邮件队列时,生成的中断通知目标处理器已投送了消息。
在一个实施例中,各循环队列的大小可在16千字节(4096个句柄)到256千字节(65536个句柄)的范围之内。再者,在这一实施例中,全部四个队列大小相同并且是邻接的。从而循环队列所需的本地存储器的总量在64千字节到一兆字节之间。这一队列常驻在本地存储器206中,而队列的头与尾指针则位于MU210的寄存器中。队列大小是由消息单元配置寄存器(MUCR)中的队列大小字段确定的。表1中示出了MUCR的一种可能格式。在实施例中全部四个队列还有一个基地址。各队列的起始地址是基于队列基地址与队列大小字段的。基地址存储在也位于MU210中的队列基地址寄存器(QBAR)中。表2中示出QBAR的一种可能格式。要在图6-9中示出的实施例包含每一个队列一个独立的基地址。
表1
表2
图4示出本发明的四个循环队列。其中有两个外出队列410与420及两个入站队列430与440,都位于本地存储器206中。
本地处理器202通过写入外出邮件队列420的头而投送外出消息422。主处理器201通过从外出邮件队列420的尾读取而从外出邮件队列420中检索所投送的消息。
主处理器201通过写入外出空闲队列410的头而释放外出消息缓冲器412。本地处理器202从外出空闲队列410的尾读取空闲消息缓冲器414。
主处理器或总线代理201通过写入入站邮件队列430的头而投送入站消息432到入站邮件队列430中。本地处理器202从入站邮件队列430的尾读这些投送的消息。当主处理器写入入站邮件队列430时便在436生成一个中断到本地处理器202。
当本地处理器202将消息投送到外出邮件队列420时,便生成中断426到主处理器201。这里可采用PCI总线规范版本2.0所规定的中断。
本地处理器202通过写入这一队列440的头而将空闲消息缓冲器442返回给入站空闲队列440。主处理器/总线代理201以通过数据路径444从入站空闲队列440的尾读取而获得空闲消息缓冲器。
图5示出外出空闲队列510、外出邮件队列520、入站邮件队列530及入站空闲队列540。外出空闲队列外出空闲队列(OFQ)510中保存总线代理201放置在那里(即释放的)的空消息的句柄供本地处理器202使用。主处理器201通过写入外出队列端口516中的寄存器而将消息缓冲器释放给OFQ510。本地处理器202从队尾读取OFQ510,并由主处理器201将其写入队列头。消息单元210维护头指针(OFHP)512。而在本地处理器202上运行的软件则维护外出空闲队列尾指针(OFTP)514。
对于存取外出队列端口516的PCI写事务,MU210将消息句柄(即,空闲消息缓冲器的地址)写入本地存储器206中由头指针(OFHP)512指向的单元,头指针512存储在外出空闲头指针寄存器(OFHPR)926中。本地存储器地址为队列基地址寄存器+3×队列大小+外出空闲头指针寄存器(OFHPR)926。表3中示出OFHPR的一种可能格式。
当将写入外出队列端口516的数据写入本地存储器206时,MU210便增量OFHP512。
从MU210接收到PCI写事务时起直到将数据写入本地存储器206并增量了OFHP512为止,通过插入等待状态延迟试图存取入站队列端口516的任何PCI事务。如果在插入等待状态时出现PCI等待时间扰乱,便向外部PCI代理发出重试信号。
本地处理器202通过读取外出空闲队列尾指针(OFTP)514指向的本地存储器单元,从OFQ510中检索消息缓冲器句柄。本地存储器地址为队列基地址寄存器+3×队列大小+外出空闲尾指针寄存器(OFTPR)438。表4中示出OFTPR的一种可能格式。然后,本地处理器202增量外出空闲尾指针寄存器938(图9A中所示)中的OFTP514。
表3<
外出邮件队列外出邮件队列(OPQ)520中存储本地处理器放置在那里的所投送的消息,供主处理器201检索与处理。主处理器201通过读取外出队列端口516中的寄存器从OPQ520中检索消息。本地处理器202通过写入队列头来增加到OPQ520中。本地处理器202维护头指针(OPHP)522。消息单元210维护尾指针(OPTP)524。
对于存取外出队列端口516的PCI读事务,MU210预取由OPTP524指向的本地存储器单元中的数据。本地存储器地址为队列基地址寄存器+2×队列大小+外出邮件尾指针寄存器(OPTPR)826(如图8A中所示)。如果OPQ520不空(即头522与尾指针524不等),便向请求处理器201提供一个消息句柄。如果OPQ520为空(即头522与尾指针524相等),便向请求处理器201提供-1(FFFF.FFFFH)的值。如果OPQ520队列不空且MU210进行在尾上预取数据,MU210便增量OPTPR826中的尾指针(OPTR)524。
如上所述,如果头522与尾524指针相等(即OPQ520为空),预取机制便在预取寄存器806(下面将参照图8A进一步描述)中加载值-1(FFFF.FFFFH)。当将消息加入OPQ520而它成为不空时,为了更新ORR806,如果ORR806包含FFFF.FFFFH,MU210中的预取机制便自动起动预取,并由本地处理器202写入外出邮件头指针寄存器(OPHPR)422。表5中示出OPHPR的一种可能格式。当本地处理器202加入消息到OPQ520中时,本地处理器202更新OPHPR422。
从一个外部总线代理201的观点,预取必须呈现为原子的。在起动了预取时,试图存取外出队列端口516中的外出检索寄存器806(下面参照图8A描述)的任何PCI事务都被插入等待状态所延迟,直到完成预取为止。如果在插入等待状态中出现总线等待时间扰乱,便以重试信号通知该外部总线代理201。
在OPHP522不等于OPTP524时,便对主处理器201生成PCI中断。当OPHP522与OPTP524相等时,不生成中断。外出门铃寄存器中的外出邮件队列中断位表示OPHPR838与OPTPR828中的值的比较情况。当头522与尾524指针相等时,将中断清除。这出现在主处理器201读取足够的队列项而清空OPQ520时。中断可被外出门铃屏蔽寄存器所屏蔽,该寄存器受软件控制。
本地处理器202可通过将数据写入由头指针(OPHP)522所指的本地存储器单元而将消息放入OPQ520中。本地存储器地址为队列基地址寄存器+外出邮件头指针寄存器838。表6中示出OPTPR的一种可能格式。然后,本地处理器202增量外出邮件头指针寄存器838中的OPHP522。
表5
表6
入站邮件队列入站邮件队列(IPQ)530保存总线代理201放置在那里的所投送的消息的句柄,供本地处理器202处理。主处理器201或总线代理通过写入入站队列端口536中的寄存器而投送消息给IPQ530。本地处理器202从队列尾开始读IPQ530,而由外部总线代理201将之写入队列头。尾指针(IPTP)534由在本地处理器202上运行的软件维护。头指针(IPHP)532则由MU210维护。
对于存取入站队列端口(IQP)536的PCI写事务,MU210将数据写入由存储在入站邮件头指针寄存器(IPHPR)724(图7A中所示)中的IPHP532所指向的本地存储器单元。本地存储器地址为队列基地址寄存器+队列大小+入站邮件头指针寄存器(IPHPR)724。表7中示出IPHPR的一种可能格式。表8中示出IPTPR的一种可能格式。
当将要写入入站队列端口536的数据写入本地存储器206时,MU210便增量IPHPR724。当将数据写入本地存储器206并增量了IPHPR724时,MU210便对本地处理器202生成一个中断。通过设置入站门铃寄存器的入站邮件队列中断位而记录这一中断。该中断可被入站门铃屏蔽寄存器所屏蔽,该寄存器受软件控制。
表7
表8<
入站空闲队列入站空闲队列540保存由本地处理器202放置在那里的空消息缓冲器的句柄,供总线代理201使用。主处理器201通过读入站队列端口536中的寄存器而被分配一个来自IFQ540的消息缓冲器。入站空闲队列540是由外部总线代理201从队尾读取,并由本地处理器202写入队列头的。头指针542由在本地处理器202上运行的软件维护。尾指针(IFTP)544则由MU210维护。
对于存取入站队列端口(1QP)536的PCI读事务,MU210在IFTP544指向的本地存储器单元中预取数据。本地存储器地址为队列基地址寄存器+存储尾指针的入站空闲尾指针寄存器(IFTPR)626。表10中示出IFTPR的一种可能格式。如果IFQ540不空(即头与尾指针不等),则为主处理器或总线代理的下一次存取提供IFTP544指向的数据。如果IFQ540为空(即头与尾指针相等),则向请求主处理器或总线代理提供-1的值(FFFF.FFFFH)。如果IFQ540不空,且MU210预取IFTP544指向的数据,MU210便增量入站空闲尾指针寄存器(IFTPR)626(如图6A中所示)中的指针的值。
为了缩短PCI读存取的等待时间,MU210实现预取机制来预测对IFQ540的存取。MU210从IFQ540尾部预取数据并将其加载到一个内部预取寄存器中。当PCI读存取出现时,便可从预取寄存器中直接读取数据。
如果头与尾指针相等(即IFQ540为空),预取机制便在预取寄存器中加载-1的值(FFFF.FFFFH)。为了在将消息加到IFQ540并且它成为不空时更新预取寄存器,如果预取寄存器包含FFFF.FFFFH,预取机制便自动起动预取,并写入入站空闲头指针寄存器(IFHPR)638。表9中示出IFHPR的一种可能格式。运行在本地处理器202上的软件在它加入消息到IFQ540中时更新IFHP542。
从外部总线代理201的观点,预取必须呈现为原子的。当起动预取时,试图存取入站队列端口536中的入站空闲寄存器的任何PCI事务都被插入等待状态延迟了,直到完成预取为止。如果在插入等待状态时出现PCI等待时间扰乱,MU210便向外部总线代理201发送重试信号。
本地处理器202可通过将数据写入头指针(IFHP)542指向的本地存储器单元而将消息放置在IFQ540中。本地存储器地址为队列基地址寄存器+入站空闲头指针寄存器(IFHPR)638。然后,运行在本地处理器202上的软件增量IFHPR638。入站空闲表表9
表10
图6A示出实现在MU210中的本发明如何将空闲消息缓冲器分配给PCI总线上的总线代理。数据从位于本地存储器206中的入站空闲队列(IFQ)540通过本地数据总线移动到入站空闲寄存器(IFR)606。在这一上下文中数据特指消息缓冲器地址(即信息句柄)而言。随后,数据从入站空闲寄存器606通过数据路径608行进到ATU218,并随后通过数据路径610到PCI总线208上的总线代理。
MU210包含入站空闲状态机612用于分配发布与接收若干控制信号的空闲消息缓冲器。下面将参照图6B进一步描述入站空闲状态机612的状态图。
为了向IFQ602请求消息缓冲器,总线代理通过PCI总线208与数据路径610发送一个读事务到ATU218。ATU218检测到指定入站空闲寄存器606的读事务。一旦ATU218检测到总线代理要读入站空闲寄存器606,ATU便检验IFR_Ready(IFR就绪)信号614的状态。如果确定了IFR_Ready信号614,ATU便完成通过路径608将IFR606中的数据提供给ATU218的PCI事务并生成Read_Inbound_Free(读入站空闲)信号616到状态机612。
如果撤销IFR_Ready信号614(即状态机612未就绪),ATU218插入等待状态,并且在确定IFR_Ready信号614之前不发送Read_IFR(读IFR)616。如果在IFR606中仍有陈旧的数据(即状态机612尚未完成将数据预取到IFR606中),便撤销IFR_Ready信号614。
一旦状态机612接收到Read_IFR信号616,状态机612便发送Memory_Read_Request(存储器读请求)信号618到本地总线仲裁器240并撤销IFR_Ready信号614。在Grant(授权)信号632出现时,MU210简单地将适当的IFQ602的尾地址确立到本地地址总线630上。然后通过本地数据总线604将数据从本地存储器206传送到IFR606(即读取IFQ602尾部的值)。MU210包含计算IFQ602的适当尾地址的加法器624。加法器624生成入站空闲尾指针寄存器(IFTPR)626与入站空闲基地址寄存器(IFBR)628的内容之和。
在IFQ540的尾指针所指的数据在本地数据总线604上之后,状态机612便发送一个Latch(锁存)信号634将本地数据总线604上的数据锁存到IFR606中并发送一个Increment(增量)信号644到IFTPR626中。这样,便完成了下一可获得的消息缓冲器的预取。
MU210还包含比较入站空闲头指针寄存器(IFHPR)638中的值与入站空闲尾指针寄存器(IFTPR)626中的值的比较器636。如果这两个值相等,比较器636生成一个空信号640(即队列中没有空闲消息缓冲器)。将这一Empty(空)信号640送至状态机612而导致状态机612确立preset(预设)信号642。预设信号642导致将IFR606的内容设定在为空指示保留的预定值上(即不是有效的缓冲器地址)。
当总线代理读IFR606时,它立即存取IFR606中所存储的预取数据,或者指示IFQ602为空的预设值。
图6B示出入站空闲状态机612的状态图。状态机612具有三级空650、预取652及起动(primed)656。状态机612是在空状态650中直到在654撤销Empty(空)信号为止。not_Empty(非空信号)将状态机650从空状态612转换到预取状态652,而状态机612发布Memory_Read_Request(存储器读请求)信号618并撤销IFR_Ready信号614。
在Grant信号632下状态机612从预取状态652转换到起动状态656。在接收到Grant信号632时,状态机612输出Latch_IFR(锁存IFR)信号634、Increment_IFTPR(增量IFTPR)信号644并确立IFR_Ready(IFR就绪)信号614。在接收到Read_IFR(读IFR)信号616时,状态机612从起动状态656转换到预取状态652,并且不确立Empty信号654。这一转换还生成Memory_Read_Request(存储器读请求)信号618及撤销IFR_Ready信号614。
状态机612在接收到Read_IFR信号616时从起动状态656转换到空状态650,并确立Empty信号640。这一转换生成Preset(预设)信号642。
图7A示出本发明如何将总线代理生成的消息投送到位于本地存储器206中的入站邮件队列(IPQ)530中。
当总线代理要写入站邮件寄存器(IPR)706时,数据从PCI总线208通过数据路径702行进到ATU218,然后通过数据路径704到IPR706。将数据锁存进IPR706之后,便通过本地数据总线604将其传送到本地存储器206中的IPQ530中。
ATU218检测IPR_Ready信号716的状态。如果确立了IPR_Ready信号716,ATU218便通过供应数据给IPR706及生成一个Write_IPR(写IPR)信号718到状态机712而完成PCI事务。
如果未确立IPR_Ready信号716,ATU218插入等待状态,并在确立IPR_Ready信号716时完成PCI事务。除非违反PCI等待时间规则,请求进程保持对总线的控制并完成PCI事务。
ATU218还检验IPR_Retry(IPR重试)信号714的状态。如果确立了IPR_Retry信号714,便未完成PCI事务,而向请求进程发出重试信号,因此它将释放总线并在稍后的时间上再作尝试。
图7B中所示的状态图进一步示出了MU210的入站邮件状态机712。状态机712具有三种状态空闲状态750、邮件状态752及满状态754。状态机752在ATU218确立Write_Inbound_Post(写入站邮件)信号718时将从空闲状态750转换到邮件状态752中。当状态机712接收到Write_Inbound_Post信号时,状态机712便生成Memory_Write_Request(存储器写请求)信号720并撤销IPR_Ready信号716。状态机712在接收到来自本地总线仲裁器240的Grant信号728时从邮件状态752转换回空闲状态750。在接收Grant信号728及写入IPR数据604到存储器中时,状态机712生成Increment(增量)信号740到入站邮件头指针寄存器(IPHPR)724,并且还确立IPR-Ready信号716。
状态机712在接收到来自比较器734的Full(满)信号738时从空闲状态750转换到满状态754。Full信号738是由比较器734在入站邮件尾指针寄存器(IPTPR)730与入站邮件头指针寄存器(IPHPR)724的内容表示入站邮件队列(IPQ)530为满时生成的。在接收到满信号738时,状态机712向ATU218确立IPR_Retry信号714。
状态机712在撤销Full信号时即not_Full(不满)时从满状态754转换到空闲状态750。在接收到not_Full(不满)信号时,状态机712便撤销IPR_Retry信号714。
比较器734还生成not_Empty(不空)信号736到向I/O处理器生成本地中断的中断生成逻辑(未示出)。在接收到not_Empty信号736时生成本地中断的逻辑是本技术中已知的。这一逻辑还可包含中断寄存器及由软件控制的有选择地屏蔽掉中断的屏蔽寄存器。
Increment(增量)信号740被送至IPHPR 724并增量入站邮件头指针。加法器722利用IPHPR724的值725与IPBR726的值727计算新的入站头指针723。将这一地址723送至存储器控制器205以便通过本地总线(即本地地址总线630)存取本地存储器。
如上所述,MU210在本地地址总线630上确立地址723并启动将锁存在IPR706中的数据(即消息缓冲器的地址)传送到IPQ530的头上。
图8A示出外出检索状态机812及本发明如何允许主处理器或总线代理检索来自外出邮件队列520(OPQ)的所投送的消息的。当主处理器或总线代理检索所投送的信息句柄时,数据(即消息缓冲器的地址)通过本地数据总线604从位于本地存储器206中的OPQ520行进到外出检索寄存器(ORR)806。然后通过数据路径808将数据从ORR806传递给ATU218的外出部分。然后将数据通过经由PCI总线208的数据路径810传递给相应的主处理器或总线代理。状态机812撤销ORR_Ready(ORR就绪)814以指示ORR806中的陈旧数据。当撤销ORR_Ready信号814时,ATU218将插入等待状态直到确立表示ORR806包含有效数据的ORR_Ready信号814为止。
图8B中所示的状态图进一步示出MU210的外出检索状态机812。外出检索状态机具有三种状态空850、预取852及起动856。在撤销Empty(空)信号840时,外出检索状态机从空状态850转换到预取状态852。作为响应,外出检索状态812确立Memory_Read_Request(存储器读请求)818到本地总线仲裁单元240并撤销ORR_Ready信号同时等待Grant信号832。在等待Grant信号832时,加法器824计算下一消息的地址(即尾指针),并将这一地址放置在本地地址总线630上。
在Grant信号832出现时状态机812从预取852转换到起动状态856。存储器控制器205利用地址825从OPQ520中读取适当的消息句柄。将这一消息句柄(即指针)放置在本地数据总线604上并传送给ORR806。然后状态机812生成一个Latch_ORR(锁存ORR)834将来自OPQ520的数据锁存到ORR806中并且还生成Increment_OFTPR信号844以增量存储在OPTPR826中的OPQ520的尾指针。完成了这一预取并将新数据锁存到ORR806中之后,状态机812确立一个ORR_Ready信号814以通知ATU218它已准备好去完成来自PCI总线208的另一事务。
在生成Read_ORR信号816时,状态机812从起动状态856转换到预取状态852,并撤销Empty信号840。作为响应,状态机812确立Memory_Read_Request(存储器读请求)信号818到本地总线仲裁器240并对ATU218撤销ORR_Ready信号814,使得以后的事务不读取ORR806的内容直到完成了预取。
状态机812在检测到当确立了空信号840时确立的Read_ORR信号时便从起动状态856转换到空状态850。作为响应,状态机812确立Preset(预设)信号842。Preset信号842导致将ORR806的内容设定到为空指示保留的值,从而向OPQ520请求读的事务将被通知OPQ520是空的。
在比较器836比较OPHPR838与OPTPR826的内容且值相等时,便确立Empty(空)信号840。非空OPQ520(即not_Empty)表示存在等待主处理器201处理的消息。本发明包含通过PCI总线规范发布2.0中规定的中断线路生成中断到主处理器201的逻辑(未示出)。
图9A与9B示出外出释放状态机912。主处理器201处理消息之后,便通过数据路径904经过PCI总线208将空闲消息缓冲器指针返回给ATU218并将其锁存在外出释放寄存器(ORLSR)906中。然后通过本地数据总线604将空闲消息缓冲器句柄从外出释放寄存器(ORLSR)送到外出空闲队列(OFQ)510。为了释放一个空闲消息缓冲器,主处理器201简单地在一个总线事务周期中将该空闲信息缓冲器的地址写入ORLSR906中即可。
ATU218检验ORLSR_Ready(ORLSR就绪)信号916及ORLSR_Retry(ORLSR重试)信号914的状态。如果撤销了ORLSR_Retry信号914,则未完成PCI事务(即写入ORLSR906)。向请求进程发出Retry信号,而请求进程释放总线的控制并在稍后时间重新尝试。如果撤销了ORLSR_Ready信号916,ATU218插入等待状态直到确立ORLSR_Ready信号916。在确立了ORLSR_Ready信号916时,ATU218生成Write_ORLSR(写ORLSR)信号918到状态机912并将数据锁存到ORLSR906中。
图9B示出外出释放状态机912的状态图。状态机912具有三种状态满状态954、空闲状态950及邮件状态952。状态机912在比较器936确立满信号940时从空闲状态950转换到满状态954。响应这一满信号940,状态机912确立ORLSR_Retry(ORLSR重试)信号914到ATU218。在生成ORLSR_Retry信号914时,便向起动对ORLSR906的写事务的进程发出在稍后时间上重新尝试的信号。
状态机912在撤销满信号940时从满状态954转换到空闲状态950。如果外出空闲队列OFQ510不满,则状态机912撤销ORLSR_Retry信号914(即OFQ510中有用于额外的空闲消息句柄的空间)。
状态机912在收到来自ATU218的Write_ORLSR信号918时从空闲状态950转换到邮件状态952。Write_ORLSR信号918还起到将空闲消息句柄锁存到ORLSR906中的作用。响应Write_ORLSR信号918的确立,状态机912确立Memory_write_Request信号918到本地总线仲裁器240并等待来自仲裁器的Grant信号932。加法器925计算待写入下一空闲消息句柄的OFQ510中的下一位置。状态机912还撤销ORLSR_Ready信号916以防止随后的事务改写当前锁存在ORLSR906中的数据。
状态机912在收到来自本地总线仲裁器240的Grant信号932时从邮件状态952转换到空闲状态950。作为响应,外出释放状态机912通过Increment_OFHPR信号944增量OFHPR926中的头指针。状态机912还确立ORLSR_Ready(ORLSR就绪)信号916,向ATU218指示它已经存储了ORLSR906的内容并且已计算出要存储下一空闲消息句柄的OFQ地址,并已就绪对ORLSR906的下一次写入。
概言之,主处理器通过将空闲消息缓冲器的句柄写入ORLSR906中而发放空闲消息缓冲器给OFQ510。如果OFQ510是满的,便通知请求进程稍后重试。如果OFQ510不满,便将空闲消息缓冲器的句柄锁存到ORLSR906中。然后状态机912等待来自本地总线仲裁器240的Grant信号932以得到对本地总线的存取。一旦授于了对本地总线的控制,状态机912便将锁存在ORLSR906中的数据传送到在预计算的头指针/地址所指向的单元上的OFQ510。
这样,已描述了不用信号或总线封锁便能使远程进程分配消息缓冲器然后将该消息缓冲器投送给工作队列的方法与装置。
此外还描述了从工作队列中检索消息并在主处理器处理过该消息之后将其释放到空闲队列的方法与装置。
本发明还提供可伸缩性、灵活性及与其它平台的兼容性。例如,如前所述的包含进入消息队列的所有平台都能容易地发送处理器间消息。对于与并不实现入站消息队列的其它平台的兼容性,外出消息队列提供该平台以等效功能而无须修改平台的硬件。此外,本发明允许的抽象观念在于其它平台可同时使用一个平台的入站队列而无须表达在计算机系统中存在其它处理器的认识。
从而,本发明提供了以高度有效方式在处理器之间直接传递消息而无须对不对称多处理器系统中的处理器作硬件修改的方法与装置。
在上文中的说明书中,已参照其特定示范性实施例描述了本发明。然而显而易见可对其作出各种修正与改变而不背离所附权利要求书中所陈述的本发明的较广的精神与范围。从而,本说明书及附图应认为是示例性的而不是限制性的。
权利要求
1.一种通过本地总线耦合在本地处理器与存储器上,并通过第二总线进一步耦合在主处理器上的消息单元,所述消息单元包括a)入站空闲存储装置,用于存储供主处理器读的数据;b)入站空闲电路装置,耦合在入站空闲存储装置上,用于在入站空闲队列中的数据上进行操作;c)入站邮件存储装置,用于存储主处理器写入的数据;以及d)入站邮件电路装置,耦合在入站邮件存储装置上,用于在外出空闲队列中的数据上进行操作。
2.权利要求1中所述的消息单元,还包括a)外出检索存储装置,存储供主处理器读取的数据;b)外出检索电路装置,耦合在外出检索存储装置上,用于在外出邮件队列中的数据上进行操作;c)外出释放存储装置,用于存储主处理器所写入的数据;以及d)外出释放电路装置,耦合在外出释放存储装置上,用于在外出空闲队列中的数据上进行操作。
3.权利要求1中所述的消息单元,其中入站空闲电路装置在数据上的操作还包括在入站空闲队列不空时从存储在存储器中的入站空闲队列中预取消息,在入站空闲队列为空时用预定的值加载入站空闲存储装置,以及在完成了预取操作时允许主处理器读取入站空闲存储装置;以及其中入站空闲电路装置在数据上的操作还包括检测入站邮件队列是否为满,如果入站邮件队列为满则返回重试信号给主处理器,以及如果入站邮件队列不满且已将存储在入站邮件存储装置中的当前值存储进入站邮件队列中时允许主处理器写入站邮件存储装置。
4.权利要求2中所述的消息单元,其中外出检索电路装置在数据上的操作还包括在外出邮件队列不空时从外出邮件队列中预取数据,如果外出邮件队列为空时用预定值加载外出检索存储装置,以及如果完成了预取时允许主处理器读取外出检索存储装置;以及其中外出释放电路装置在数据上的操作还包括检测外出空闲队列是否为满,如果外出空闲队列为满则返回重试信号给主处理器,以及如果外出空闲队列不满且已将外出释放存储装置中的当前值存储进外出空闲队列中时允许主处理器写外出释放存储装置。
5.权利要求2中所述的消息单元,其中该第二总线为PCI总线。
6.权利要求2中所述的消息单元,其中的存储装置为寄存器。
7.一种使主处理器能在一次总线事务中从外出邮件队列中检索消息句柄的方法,所述队列是用一个尾指针与一个头指针定义的,所述方法包括下述步骤a)检测队列是否为空;b)如果队列为空,将指示空队列的值返回给主处理器;c)如果队列不空,则返回队列尾所指向的消息句柄;以及d)预取下一消息句柄。
8.权利要求7中所述的方法,其中预取下一消息句柄的步骤包括增量队列的尾指针;从队列中读取数据;以及将数据锁存进预取寄存器中。
9.一种使主处理器在一次总线事务中将一个空闲消息句柄释放到队列的方法,所述队列用一个尾指针与一个头指针定义,所述方法包括下述步骤a)检测队列是否为满;b)如果队列不满,则将空闲消息句柄写入队列中;以及c)如果队列为满,发信号通知主处理器在稍后时间上重试。
10.权利要求9所述的方法,其中将空闲消息句柄写入队列的步骤进一步包括下述步骤锁存空闲消息句柄;增量队列的头指针;以及将锁存的句柄存储到存储器中。
11.一种使主处理器能在一次总线事务中从入站空闲队列中分配一个消息句柄的方法,所述队列是用一个尾指针与一个头指针定义的,所述方法包括下述步骤a)检测队列是否为空;b)如果队列为空,则将指示空队列的值返回给主处理器;c)如果队列不空,则返回队列的尾所指向的消息句柄;以及d)预取下一消息句柄。
12.权利要求11中所述的方法,其中预取下一消息句柄的步骤包括增量队列的尾指针;从存储器中读数据;以及将该数据锁存进预取寄存器中。
13.一种使主处理器能在一次总线事务中将一个空闲消息句柄投送到队列的方法,所述队列是用一个尾指针与一个头指针定义的,所述方法包括下述步骤a)检测队列是否为满;b)如果队列不满,则将空闲消息句柄写入队列中;以及c)如果队列为满,发信号通知主处理器在稍后的时间上重试。
14.权利要求13中所述的方法,其中将消息句柄写入队列的步骤进一步包括下述步骤锁存消息句柄;增量队列的头指针;以及将锁存的句柄存储在存储器中。
全文摘要
一种消息单元(210)提供主处理器与处理I/O平台中的I/O操作的本地处理器之间的硬件队列接口。电路(214)管理入站空闲队列、入站邮件队列、外出空闲队列及外出邮件队列的头与尾指针。还提供了电路用于使主处理器或总线代理能通过读或写入站端口寄存器或外出端口寄存器而在单个总线事务中存取这些队列。队列元素包含消息缓冲器的句柄。本发明自动执行定位队列中下一元素、改变该元素及为下一次队列存取修改队列描述符(即头或尾指针)以指示下一元素的特定任务。当主处理器、总线代理或本地处理器之一写队列时,利用多个寄存器来有选择地中断主处理器或本地处理器。
文档编号G06F13/40GK1193410SQ96196279
公开日1998年9月16日 申请日期1996年6月17日 优先权日1995年6月15日
发明者B·达维斯, W·T·福拉尔, E·加尔布斯 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1