tag 标签: cache

相关博文
  • 热度 16
    2014-9-4 09:46
    1209 次阅读|
    1 个评论
      ARM中用于存储管理的系统控制协处理器CP15介绍:     在基于arm的嵌入式系统中,存储系统通常是通过系统控制协处理器CP15来完成的。     CP15可以包含16个32位的寄存器,其编号为0-15.实际上对于某些编号的寄存器可能对应有多个物理寄存器,在指令中     指定特定的标志位来区分这些物理寄存器。该机制类似与arm中某些寄存器在不同的处理器模式下对应不同的物理寄存器。     访问CP15寄存器的指令有下面两种:         MCR:ARM寄存器到协处理器寄存器的数据传送指令。         MRC: 协处理器到arm寄存器的数据传送指令。         MCR和MRC指令只能在处理器模式是系统模式时执行。在用户模式下执行该指令会触发未定义指令的异常中断。           MCR{cond} p15,0,Rd,CRn,CRm {,opcode_2}         opcode_1为协处理器将执行的操作的操作码对于CP15,opcode_1永远为0,若不为0则该操作结果不可知。         Rd作为源寄存器的arm寄存器,不能为PC。         CRn作为目标寄存器的协处理器,其编号位可能为c0-c15.         CRm附加的目标寄存器或者源操作数寄存器。用于区分同一个编号的不同物理寄存器。当指令中不需要提供附加信息时,将CRm指定为C0,否则指令操作不可预知。         opcode_2提供附加信息,用于区别同一个编号的不同物理寄存器。若不需要附加信息,省略opcode_2或指定其为0,否则指令操作结果不可预知。         如指令: MCR p15,0,R4,C1,c0,0    该指令将arm寄存器r4中的数据传送到协处理器CP15中的C1中。操作码1和操作码2均为0。           MRC{cond} p15,0,Rd,CRn,CRm{,opcode_2}         CRn为协处理器寄存器,存放第一个源操作数。其他的参考MCR指令。       CP15中的寄存器C0:         寄存器C0中存放的是ARM相关的一些标志符。这个寄存器是只读的。指令中的操作码2标志要读取的信息。         0b000表示读取主标识符寄存器,0b001表示读取Cache类型标识符寄存器,其他编码未定义。         主标识符提供处理器版本信息         Cache标识符提供了关于Cache的信息:             数据和指令cache是分开的还是独立的。             cache的容量,块大小以及相联特性             cache的类型是写通的还是写回的以及对于写回类型如何有效清除cache内容             cache是否支持内容锁定。         如 MRC p15,0,R0,C0,C0,0 为读取Cp15的主标识符寄存器内容到arm寄存器R0中              MRC p15,0,R0,C0,C0,1为读取cp15的Cache类型标识符寄存器到arm寄存器R0中。    CP15中的寄存器C1:         使用MRC/MCR 传输数据时, CRm和opcode2的值均为0         禁止/使能MMU以及其他的与存储系统相关的功能         配置存储系统以及ARM处理器中的相关部分的工作方式。         例如读取C1值: MRC p15,0,R0,c1,0,0 ARM中存储管理单元MMU介绍:     与MMU操作相关的寄存器:         C1中的某些位         C2保存内存中的页表基地址         C3设置域的访问控制属性         C5内存访问失效状态指示         C6内存访问失效时失效的地址         C8控制与清除TLB内容相关的操作         C10控制与锁定TLB内容相关的操作     禁止使能MMU: CP15中的寄存器C1的为 用来控制禁止/使能MMU。0禁止,1使能     使能MMU: mrc p15,0,r0,c1,0,0 (注意对C1操作是 CRm和opcode2均为0).                     orr r0,#1                     mcr p15,0,r0,c1,0,0     使能MMU时存储访问过程:             当ARM处理器请求存储访问时,首先在TLB中查找虚拟地址。如果系统中的数据TLB和指令TLB是分开的,在取指令时。             从指令TLB查找相应的虚拟地址,对于其他的内存访问操作,从数据TLB中查找相应的虚拟地址。如果该虚拟地址的地址变换条目不在TLB中,             CPU从位于内存中的页表中查询对应于该虚拟地址的地址变换条目,并把相应的结果添加到TLB中,如果TLB已经满了,还需要根据一定的淘汰算法进行替换。这样             当CPU下一次又需要该地址变换条目时,可以从TLB中直接得到,从而使地址变换的速度大大增加。             当得到了需要的地址变换条目后,将进行以下的操作                 1:得到该虚拟地址对应的物理地址。                 2:根据条目中的C(cachable)控制位和B(bufferable)控制位决定是否缓存该内存访问的结果                 3:根据存取权限控制位和域访问控制位确定该内存访问是否被允许。若不被允许,CP15向ARM处理器报告存储访问终止。,                 4:对于不允许缓存的存储访问,使用 1 中得到的物理地址访问内存。对于允许缓存的存储访问,如果在Cache命中,则忽略物理地址。若没有命中,                         则使用得到的物理地址访问内存,并把该数据块读取到Cache中。       禁止MMU时的存储访问过程:             当禁止MMU时,是否支持chche和write buffer由各个具体芯片的设计确定。如果芯片规定当禁止MMU时禁止Cache和write buffer,则存储访问将不考虑C,B控制位             如果芯片规定当禁止MMU时可以使能cache和write buffer,则数据访问时c=0,B=0,指令读取时,如果使用分开的TLB则C=1,如果使用统一的TLB则C=0。             存储访问不进行权限控制,MMU也不会产生存储访问终止信号。             所有物理地址和虚拟地址相等,即使用平板存储模式。     禁止/使能MMU时应注意的问题:             在使能MMU之前,要在内存中建立页表,同时CP15中的各相关寄存器必须完成初始化。             如果使用的不是平板存储模式,在禁止/使能MMU时,虚拟地址和物理地址的对应关系会发生改变,这时应该清除cache中的当前地址变换条目。             如果完成禁止/使能MMU的代码的物理地址和虚拟地址不同,则禁止/使能MMU时将造成很**烦,因此通常完成使能/禁止MMU的代码的物理地址和虚拟                 地址是相同的。     MMU中地址变换过程:     MMU中采用两级页表实现地址映射:         一级页表中包含有以段为单位的地址变换条目或指向二级页表的指针。一级页表实现的地址映射粒度较大。         二级页表中包含以大页和小页为单位的地址变换条目。其中,一种类型的二级页表还包含有以极小页为单位的地址变换条目。         通常以段为单位的地址变化过程只需要一级页表。而以页为单位的地址变换过程还需要二级页表。           这里简单介绍基于段的地址映射:             CP15的寄存器C2中存放的是内存中页表的基地址。其中为 为内存中页表的基地址,位 为0。因此一级页表的基地址必须是16Kb对齐的。(原因是一级页表             中的一个条目通常映射的大小为1MB,则4G内存可分为2^12个1MB,即一级页表中有2^12个条目。因为每个条目大小为4字节。             所以一级页表大小共有4x2^12个字节即16KB。)             CP15的寄存器C2的 和虚拟地址的 结合为一个32位数的高30位,低两位为0.从而形成一个32位的索引值。             使用该索引值从页表中找到一个4字节的条目,称为一级描述符。该条目中包含了段对应的物理基地址或二级页表基地址。             还包含了缓存控制位,权限控制位等。             当该条目中的 位为10时,表示该一级描述符为段描述符。段描述符定义了对应的1MB的虚拟存储空间的地址映射关系。             为段描述符时,从中取出段对应的物理基地址,然后与虚拟地址的 位结合,形成32位的物理地址。 关于快表(TLB)的操作:     使无效快表的内容:         当内存中的页表内容改变,或者通过修改系统控制协处理器CP15的寄存器C2来使用新的页表时,TLB中的内容需要全部或者部分使无效。MMU提供了相关的硬件支持。         系统控制协处理器CP15的寄存器C8就是用来控制清除TLB内容的相关操作的。它是一个只写的寄存器。         MCR指令写该寄存器: MCR p15,0,Rd,c8,Rm,opcode_2         Rd中为将要写入C8的数据。CRm,opcode_2的不同组合决定指令执行不同的操作。         使无效快表指令格式:             指令 opcode_2 CRm Rd 含义             MCR p15,0,Rd,c8,c7,0 0b000 0b0111 0 使无效整个统一cache或使无效整个数据和指令cache             MCR p15,0,Rd,c8,c7,1 0b001 0b0111 虚拟地址 使无效cache中的单个地址变换条目             MCR p15,0,Rd,c8,c5,0 0b000 0b0101 0 使无效整个指令cache             MCR p15,0,Rd,c8,c5,1 0b001 0b0101 虚拟地址 使无效指令cache中的单个地址变换条目             MCR p15,0,Rd,c8,c6,0 0b000 0b0110 0 使无效整个数据cache             MCR p15,0,Rd,c8,c6,1 0b001 0b0110 1 使无效数据cache中的单个地址变换条目。         若系统使用统一的指令和数据cache时。2,4,6行中指令是相同的 1,3,5行中的指令功能是相同的。     快表内容的锁定:         CP15中寄存器c10用于控制TLB内容的锁定。  ARM中的存储访问失效:     MMU中与存储访问失效相关的寄存器有两个:寄存器C5为失效状态寄存器,寄存器C6为失效地址寄存器。   高速缓冲存储器(cache)和写缓冲区(write buffer):     通常ARM处理器的主频可以达到几百MHZ.而一般的主存储器用动态存储器,其存储周期仅为100ns左右。这样如果指令和数据都存放在     主存储器中,主存储器的速度将会严重制约整个系统的性能。高速缓冲存储器(cache)和写缓冲区(write buffer)位于主存储器和CPU之间。主要用来提高存储系统的性能。     高速缓冲存储器是全部用硬件来实现的,所以对程序员来说是透明的。Cache与主存储器之间以块为单位进行数据的交换。当CPU读取数据或指令时,     它同时将读取到的数据或者指令保存到一个cache块中。     这样当CPU第二次需要读取相同的数据时,他可以从相应的cache中得到相应的数据。因为cache的速度远远大于主存储器的速度,系统的正题性能就能得到很大的提高。实际上     在程序中同城相邻的一段时间内CPU访问相同的数据的概率是很大的,这种规律称为时间局部性。时间局部性保证是系统采用cache后,通常性能都能得到很大的提高。     不同的系统中,cache的块大小也是不同的。当CPU从主存读取地址n的数据时,会将地址为n,n+1,n+2...的数据也读到cache的一个块中。     这样CPU需要访问后面的地址的数据时,它可以从cache中得到该数据,系统的     性能得到提升。实际上,在程序中,cpu访问相邻的存储空间的数据的概率是很大的,这种规律称为空间局部性。     空间局部性保证了系统采用cache后,通常性能会得到很大的提升。       写缓冲区是由一些高速的存储器构成的。他主要用来优化向主存储器中的写入操作。当CPU进行向主存中的写入操作时,     他首先将数据写到缓冲区中,由于写缓冲区的访问速度很快,这种写入操作的速度也很快。     然后CPU就可以进行下面的操作。写缓冲区在适当的时候以较低的速度将数据写入主存储器中相应的位置。       通过引入cache和写缓冲区,存储系统的性能得到了很大的提高,但同时也带来了一些问题。比如由于数据将存在于系统中不同的物理位置,可能造成数据的不一致性。     由于写缓冲区的有有话作用,可能有些写操作的执行顺序不是用户期望的顺序。从而造成操作错误。     cache的分类:      统一/独立的数据cache和指令cache:         使用独立的数据cache和指令cache,可以在同一个时钟周期中读取指令和数据,但需要保证指令和数据的一致性。         写通cache和写回cache:         当CPU更新了cache的内容时,要将结果写回到主存中,通常有两种方法:写通法和写回法。         写回法是指CPU在执行写操作时,被写的数据只写入cache中,不写入主存中。仅当需要替换时,才把已经修改的cache块写回到主存中。              采用这种更新算法的cache块表中,一般有一个修改位,当一块中的任何一个单元被修改时,这一块的修改位被置1,否则保持0.在需要替换这一块时,         如果对应的修改位为1,         则必须先把这一块写到主存中去之后,才能掉入新的快来覆盖。如果对应的修改位为0,则不必把这一块写到主存中,只要用新掉入的块覆盖该块即可。           写通法是指CPU在执行写操作时,必须把数据同时写入cache中和主存中。这样在cache的块表中就不需要修改位。当某一块需要替换时,         也不必把这一块写回到主存中去,新掉入的快可以立即把这一块覆盖掉。       比较:         可靠新:             写通法优于写回法。写通法能始终保持cache是主存的正确副本。         与主存的通信量:             由于写通法在每次写cache时,同时写主存,从而增加了写操作的开销。而写回法是把写主存的开销集中在当发生cache失效时,可能要一次性地写一个块到主存中。         控制的复杂性:             写通法比写回法简单,写通法在快表中不需要修改位。         硬件实现的代价:             写回法比写通法好。因为写通法中,每次写操作都要写主存,因此为了节省写主存所花费的时间。通常要采用一个高速小容量的缓冲存储器,把要写的数据和             地址写到这个缓冲器中。在每次读主存中时,也要首先判断所读取的数据是否在这个缓冲器中。而写回法的硬件实现代价相对较低。       读操作分配cache和写操作分配cache:         当进行数据写操作时,可能cache未命中。这时根据cache执行的操作的不同可以将cache分为两类:读操作分配cache和写操作分配cache。         对于读操作分配cache,当进行数据写操作时,如果未命中,只是简单地将数据写入主存中。主要在数据读取时,才进行cache内容的预取。         对于写操作分配cache,当进行数据写操作时,如果cache未命中,cache系统会进行cache内容预取,从主存中将相应的块读到cache中相应的位置,             再进行写操作,把数据写入cache中。         对于写通类型的cache,数据会同时被写入到主存中,对于写回类型的cache数据将会在合适的时间写回到主存中。         由于写操作分配cache增加了cache内容预取的次数,增加了写操作的开销,但同时可能提高cache的命中率,             因此这种技术对于系统的整体性能的影响与程序中读操作和写操作数量有关。    缓冲技术的使用注意事项:         cache通常需要存储期间具有下面的特征:         读取操作返回最后一次写入的内容,而且没有其他的副作用。         写操作除了影响目标单元的内容外,没有其他副作用。         对同一目标单元的两次连续读取操作将得到相同的结果。         对同一目标单元的两次连续写操作将会把第二次写操作的值写入目标单元中,第一次写操作将没有意义。         在ARM中,I/O操作通常被映射成存储器操作。I/O的输入/输出操作可以通过存储器的读取和写入操作实现。         这样I/O空间就被映射成了存储空间。这些存储空间就不满足cache所要求的上述特性。         例如,从一个普通的存储单元连续读取两次,将会返回同样的结果。对于存储映射的I/O空间,连续两次读取,返回的结果可能不同,             因为I/O引脚随时可能因外界环境而改变。因此对于存储器映射的I/O空间的操作就不能使用cache技术。         由于写缓冲技术可能推迟写操作,它同样不适合对于存储器映射的I/O空间的操作。         由于上述原因,通常MMU都允许将某些地址空间设置成非缓冲的。MMU页表中地址转换条目的B位和C位就是用于控制乡音存储空间的缓冲特性。         C位控制是否可以cache,置1可缓存。置0不可缓存。 B为用来控制是否可写缓冲置1允许,置0不允许。     存储系统的一致性问题:         当存储系统中引入了cache和写缓冲区时,同一地址单元的数据可能在系统中有多个副本,分别保存在cache,写缓冲区以及主存中。         使得数据读操作可能得到的不是系统中"最新的"数值,这就带来了存储系统中数据的一致性问题。         在ARM存储系统中,数据不一致的问题有一些是通过存储系统自动保证的,另外一些数据不一致问题则需要通过程序设计时遵守一定的规则来保证。         地址映射关系变化造成的数据不一致:             在虚拟地址到物理地址的映射关系发生变化前,如果虚拟地址A1所在数据块已经预取到cache中。             当虚拟地址到物理地址的映射关系发生变化后,这时当CPU访问A1时,再使用cache中的数据块将得到错误的数据。             同样当系统中使用了写缓冲区时,如果CPU写入写缓冲区的地址是虚拟地址,也会发生数据不一致的情况。             在虚拟地址到物理地址的映射关系发生变化前,如果CPU向虚拟地址为A1的单元执行写操作,该写操作已经将A1以及对应的数据写入写缓冲区中。             当虚拟地址到物理地址的映射关系发生变化后,则当写缓冲区将上面被延迟的写操作写到主存中时,使用的是变换后的物理地址,从而使写操作失败。         为了避免发生上面所述的数据不一致的情况,在系统中虚拟地址到物理地址的映射关系发生变化前,根据系统的具体情况,执行下面的一些操作:             :如果数据cache为写回类型,清空该数据cache(会写回主存)             :使数据cache中相应的块无效             :使指令cache中相应的块无效             :将写缓冲区中被延迟的写操作全部执行             :有些情况下可能还要求相关的存储区域被设置成非缓冲的。         DMA造成的数据不一致问题:             DMA操作直接访问主存,而不会更新cache和写缓冲区中相应的内容,这样就可能造成数据的不一致。             如果DMA从主存中读取的数据已经包含在cache中,而且cache中对应的数据已经被更新过,这样DMA读到的数据不是系统中最新的数据。             同样,DMA写操作直接更新主存中的数据,如果该数据已经包含在cache中,则cache中的数据将会比主存中对应的数据“老”,也将造成数据的不一致。             为了避免上述的数据不一致问题,执行下面的的一些操作序列:                 :将DMA访问的存储区域设置成非缓冲的                 :将DMA访问的存储区所涉及的数据cache中块设置成非缓冲的。                 :清空写缓冲区(执行写缓冲区中延迟的所有写操作)                 :在DMA操作期间限制处理器访问DMA所访问的存储区域 与cache和写缓冲区相关的编程接口:     寄存器C1中的相关位:         寄存器C1中与cache和写缓冲区操作相关的位有 C(bit ),W(bit ),I(bit ),RR ]     寄存器C7:         CP15的寄存器C7用于控制cache和写缓冲区。它是一个只写的寄存器。使用MRC指令读取该寄存器,将产生不可预知的结果。     一些名词术语:         清空:如果写回类型的数据cache中,如果包含有尚未写到主存中的数据,则将该数据写到主存中         使无效:指将cache中的某个块或所有的块标识成无效,从而使所有访问这个块的操作都不命中。对于写回类型的数据cache来说,使无效并不把数据写回主存中         清空写缓冲区:指终止当前代码的执行,将写缓冲区中所有被延迟的写操作执行完,也就是将写缓冲区中的数据全部写回主存中。         cache内容预取:指在CPU访问某个虚拟单元,将包含该虚拟单元的存储块读取到cache中。         等待中断激活:是ARM进入节能状态,停止执行,等待被异常中断激活。       寄存器C7操作:MCR指令格式:         MCR,p15,0,Rd,c7,CRm,opcode_2  CRm和opcode_2的不同组合决定指令执行不同的操作                 CRm             opcode_2            含义                                     数据(Rd中的数据)                 C0                     4                 等待中断激活                                   0                 C6                     0                 使无效整个数据cache                         0                 C5                     0                 使无效整个指令cache                         0                 C10                     4                 清空写缓冲区                                     0                 C13                     1                 预取指令cache中的某块                虚拟地址 ························     寄存器C9:         寄存器C9是cache内容锁定寄存器。   快速上下文切换技术:     快速上下文切换技术(FCSE)通过修改系统中不同进程的虚拟地址,避免在进行进程切换时造成的虚拟地址到物理地址的重映射,从而提高系统的性能。     通常情况下,如果两个进程占用的虚拟地址空间有重叠,系统在这两个进程之间进行切换时,必须进行虚拟地址到物理地址的重映射。而虚拟地址到物理地址的重     映射涉及到重建MMU表,而且cache及TLB中的内同都必须使无效。这些操作将带来巨大的系统开销。     快速上下文切换技术的引入避免了这种开销。它位于CPU和MMU之间,如果两个进程使用了同样的虚拟地址空间的,则对CPU而言,两个进程使用了同样的虚拟地址空间。     快速上下文切换技术对各进程的虚拟地址进行变换,这样系统中除了CPU外的部分看到的是经过快速上下文切换机构变换的虚拟地址空间。     这样在进行进程间切换时就不需要进行虚拟地址到物理地址的重映射。       ARM系统中,4GB的虚拟地址空间被分成了128个进程空间块,每个进程空间块大小为32MB。每个进程空间块可以包含一个进程,         该进程可以使用虚拟地址空间0x00000000-0x01FFFFFF.     这个地址范围也就是CPU看到的进程的虚拟空间。系统128的进程空间块的编号0-127,     编号为I的进程空间块中的进程实际使用的虚拟地址空间为(Ix0x02000000-Ix0x02000000+0x1ffffff),     这个地址空间是系统中除了CPU之外的其他部分看到的该进程所占用的虚拟地址空间。       由VA(CPU发出的虚拟地址)到MVA(除cpu外部分看到的虚拟地址)的变换算法如下:         if(VA ==0b0000000) then              MVA = VA |(PID25)         else             MVA = VA     其中,PID为当前进程所在的进程空间块的编号,即当前进程的进程标识符。其取值为0-127。     快速上下文切换机构使用进程的进程标识符代替VA的高7位,从而使得变换后的虚拟地址MVA。     当VA的高7位不是全0,MVA=VA。这种VA是本进程用于访问别的进程中的数据和指令的虚拟地址,被访问的进程标识符不能为0.          这里对快速上下文技术我之前也有过一些疑问:每个进程在内存中不是都有自己的虚拟地址映射表吗 。那么就算是相同的虚拟地址映射的也是不同的物理地址啊,     那干嘛要用FCSE技术?     这里给出自己的理解。 内存中的每个进程的确是都有自己在内存中的虚拟地址映射表。所以逻辑上都享有4G的内存。     但是处理器只有一个MMU所以相当于内存中所有的进程的映射表都是放在一个MMU管理的表中的。     但是MMU管理的表中是不能有两个相同的虚拟地址映射到不同的物理地址的。所以CPU发出每个虚拟地址后要经过处理后才会送给MMU。     这样即使当每个进程都发送一个虚拟地址A1,MMU收到的虚拟地址也是不相同的。这也就是上面提到的FCSE技术     快速上下文切换技术编程接口:     CP15中的寄存器C13用于快速上下文切换。指令格式:         MCR p15,0,Rd,c13,c0,0         MRC p15,0,Rd,c13,c0,0     其中,在读操作时,结果中的位 返回PID,其他位的数值是不可以预知的。写操作将设置PID的值。     PID的值为0时,MVA=VA,相当于禁止了FCSE。系统复位后PID即为0.     当PID的值不为0时,相当于使能了FCSE。 指令预取和自修改代码:     在ARM中允许指令预取。在CPU执行当前指令的同时,可以从存储器中预取其后的若干条指令。     程序执行过程中PC寄存器中的值为当前执行指令后第二条指令的地址。     预取的指令并不一定能够得到执行。比如当前指令完成后,如果发生了异常中断,程序将会跳转到异常中断处理程序处执行,     当前预取的指令将被抛弃。或者执行了跳转指令,则当前预取指令的指令也将被抛弃。     自修改代码指的是代码在执行过程中可能修改自身。对于支持指令预取的ARM系统,自修改代码可能带来潜在的问题。当指令被预取后,     在该指令被执行前,如果有访问指令修改了位于主存中的该指令,这是被预取的指令和主存中对应的指令不同,     从而使执行的结果发生错误。         比如下面就是一段自修改代码             ldr r0,AddInstr ;将AddInstr标号的数据(即add,r1,r1,#1指令所表示的4字节数据)保存到r0中             str r0,NextInstr ; 将 R0中的数据(即add,r1,r1,#1指令)写到NextInstr标号处,即覆盖了指令sub r1,r1,#1所表示的4字节数据             NextInstr:              sub r1,r1,#1                 .                 .                 .             AddInstr:             add r1,r1,#1     这段指令中STR 指令修改了它后面紧接的指令,即将sub r1,r1,#1改成了add r1,r1,#1     这段代码第一次执行时,STR指令后执行的是sub r1,r1,#1,因为主存中指令被修改前,sub r1,r1,#1 指令已经被预取。     当这段代码第二次执行时,str执行后执行的就会是add r1,r1,#1,因为主存中的代码已经被修改了。     同样下面的情况也会导致类似的情况:         如果在 str 指令执行后,跳转到异常中断处理程序执行。这时预取的指令sub r1,r1,#1将会被丢弃。当程序从异常中断返回时。         重新进行指令预取,这是得到的就是修改后的指令即add r1,r1,#1。这样指令sub...即使在代码第一次执行时也不一定能得到执行。         相反的,对于某些系统跳转到中断处理程序时,预取的指令会被保存,这样程序返回时,预取的指令sub...还是会执行,而add得不到执行。         上述的不可靠代码的执行不能被ARM自动纠正,需要引入一定的变成规则来保证这种代码在arm体系中的可靠执行。         IMB(Instruction Memory Barrier) 技术可以实现这一目标。 IMB技术:     IMB是一段特定的代码序列,IMB在新的指令被保存到主存中后,在该指令被实际执行之前执行,提供可自修改代码在ARM体系中的可靠执行。     在很多ARM系统中,IMB中需要的很多指令(如使无效cache等)只能运行在系统模式下。而很多用户模式下运行的代码都需要运行IMB(类似linux中的屏障函数?)     所以通常将IMB实现成一个SWI功能调用。         同样在其他的一些场合也要在适当的时候运行IMB,比如对于采用了虚拟地址到物理地址映射的系统,如果在指令预取之后和该指令得到实际执行之前         虚拟地址到物理地址的映射关系发生了改变,这是也需要运行适当的IMB         如果在指令预取之后和该指令得到执行之前,该指令所涉及的存储区域的访问权限发生了改变,这是也需要运行适当的IMB。
  • 热度 15
    2013-4-27 11:34
    1240 次阅读|
    0 个评论
    在许多高性能处理器中,还提出了一些新的概念,以加速外设到存储器的DMA写过程。如Freescale的I/O Stashing和Intel的IOAT技术。 如图3‑8所示,当设备进行存储器写时,如果可以对Cache直接进行写操作时,即便这个存储器写命中了一个状态为M的Cache行,可以不将该Cache行的数据回写到存储器中,而是直接将数据写入Cache,之后该Cache行的状态依然为M。采用这种方法可以有效提高设备对存储器进行写操作的效率。采用直接向Cache行写的方法,PCI设备对存储器写命中一个状态为M的Cache行时,将执行以下操作。 (1) HOST主桥将对存储器的写请求发送到FSB总线上。 (2) CPU通过对FSB监听,发现该写请求在某个Cache行中命中,而且该Cache行的状态为M。 (3) HOST主桥将数据直接写入到Cache行中,并保持Cache行的状态为M。注意此时设备不需要将数据写入存储器中。 从原理上看,这种方法并没有奇特之处,仅需Cache能够提供一个接口,使外部设备能够直接写入即可。但是从具体实现上看,设备直接将数据写入Cache中,还是有相当大的难度。特别是考虑在一个处理器中,可能存在多级Cache,当CPU进行总线监听时,可能是在L1、L2或者L3 Cache中命中,此时的情况较为复杂,多级Cache间的协议状态机远比FSB总线协议复杂的多。 在一个处理器系统中,如果FSB总线事务在“与FSB直接相连的Cache”中命中时,这种情况相对容易处理;但是在与BSB(Back-Side Bus)直接相连的Cache命中时,这种情况较难处理。下文分别对这两种情况进行讨论,在一个处理器中,采用FSB和BSB连接Cache的拓扑如图3‑9所示。 当采用FSB总线连接L2 Cache时,L2 Cache直接连接到FSB总线上,设备通过FSB总线向L2 Cache进行写操作并不难实现,MPC8548处理器就是采用了这种结构将L2 Cache直接连接到FSB总线上。 但是由于FSB总线的频率远低于BSB总线频率,因此采用这种结构将影响L2 Cache的访问速度,为此高端处理器多采用BSB总线连接L2 Cache,x86处理器在Pentium Pro之后的高性能处理器都使用BSB总线连接L2 Cache,Freescale的G4系列处理器和最新的P4080处理器也使用BSB总线连接L2 Cache。 当L2 Cache没有直接连接到FSB上时,来自外部设备的数据并不容易到达BSB总线。除了需要考虑Cache连接在BSB总线的情况外,在外部设备进行DMA操作时,还需要考虑多处理器系统的Cache共享一致性协议。设计一个专用通道,将数据从外部设备直接写入到处理器的Cache中并不容易实现。Intel的IOAT和Freescale的I/O Stashing可能使用了这种专用通道技术,直接对L1和L2 Cache进行写操作,并在极大增加了设计复杂度的前提下,提高了处理器系统的整体效率。 以上对Cache进行直接写操作,仅是Intel的IOAT和Freescale的I/O Stashing技术的一个子集。目前Intel和Freescale没有公开这些技术的具体实现细节。在一个处理器系统中,可能存在多级Cache,这些Cache的层次组成结构和状态机模型异常复杂,本章对这些内容不做进一步说明。
  • 热度 18
    2013-4-19 17:45
    1473 次阅读|
    0 个评论
    PCI设备对可Cache的存储器空间进行DMA读写的操作的过程较为复杂,有关Cache一致性的话题可以独立成书。而不同的处理器系统使用的Cache Memory的层次结构和访问机制有较大的差异,这部分内容也是现代处理器系统设计的重中之重。 本节仅介绍在Cache Memory系统中与PCI设备进行DMA操作相关的,一些最为基础的概念。在多数处理器系统中,使用了以下概念描述Cache一致性的实现过程。 1 Cache一致性协议 多数SMP处理器系统使用了MESI协议处理多个处理器之间的Cache一致性。该协议也被称为Illinois protocol,MESI协议在SMP处理器系统中得到了广泛的应用。MESI协议使用四个状态位描述每一个Cache行。 M(Modified)位。M 位为1 时表示当前Cache 行中包含的数据与存储器中的数据不一致,而且它仅在本CPU的Cache 中有效,不在其他CPU的Cache 中存在拷贝,在这个Cache行的数据是当前处理器系统中最新的数据拷贝。当CPU对这个Cache行进行替换操作时,必然会引发系统总线的写周期,将Cache行中数据与内存中的数据同步。 E(Exclusive)位。E 位为1 时表示当前Cache行中包含的数据有效,而且该数据仅在当前CPU的Cache中有效,而不在其他CPU的Cache中存在拷贝。在该Cache行中的数据是当前处理器系统中最新的数据拷贝,而且与存储器中的数据一致。 S(Shared)位。S 位为1 表示Cache行中包含的数据有效,而且在当前CPU和至少在其他一个CPU中具有副本。在该Cache行中的数据是当前处理器系统中最新的数据拷贝,而且与存储器中的数据一致。 I(Invalid)位。I 位为1 表示当前Cache 行中没有有效数据或者该Cache行没有使能。MESI协议在进行Cache行替换时,将优先使用I位为1的Cache行。 MESI协议还存在一些变种,如MOESI协议和MESIF协议。基于MOESI协议的Cache一致性模型如图3‑5所示,该模型基于AMD处理器使用的MOESI协议。不同的处理器在实现MOESI协议时,状态机的转换原理类似,但是在处理上仍有细微区别。 MOESI协议引入了一个O(Owned)状态,并在MESI协议的基础上,进行了重新定义了S状态,而E、M和I状态和MESI协议的对应状态相同。 O位。O位为1表示在当前Cache 行中包含的数据是当前处理器系统最新的数据拷贝,而且在其他CPU中一定具有该Cache行的副本,其他CPU的Cache行状态为S。如果主存储器的数据在多个CPU的Cache中都具有副本时,有且仅有一个CPU的Cache行状态为O,其他CPU的Cache行状态只能为S。与MESI协议中的S状态不同,状态为O的Cache行中的数据与存储器中的数据并不一致。 S位。在MOESI协议中,S状态的定义发生了细微的变化。当一个Cache行状态为S时,其包含的数据并不一定与存储器一致。如果在其他CPU的Cache中不存在状态为O的副本时,该Cache行中的数据与存储器一致;如果在其他CPU的Cache中存在状态为O的副本时,Cache行中的数据与存储器不一致。 在一个处理器系统中,主设备(CPU或者外部设备)进行存储器访问时,将试图从存储器系统(主存储器或者其他CPU的Cache)中获得最新的数据拷贝。如果该主设备访问的数据没有在本地命中时,将从其他CPU的Cache中获取数据,如果这些数据仍然没有在其他CPU的Cache中命中,主存储器将提供数据。外设设备进行存储器访问时,也需要进行Cache共享一致性。 在MOESI模型中,“Probe Read”表示主设备从其他CPU中获取数据拷贝的目的是为了读取数据;而“Probe Write”表示主设备从其他CPU中获取数据拷贝的目的是为了写入数据;“Read Hit”和“Write Hit”表示主设备在本地Cache中获得数据副本;“Read Miss”和“Write Miss”表示主设备没有在本地Cache中获得数据副本;“Probe Read Hit”和“Probe Write Hit”表示主设备在其他CPU的Cache中获得数据副本。 本节为简便起见,仅介绍CPU进行存储器写和与O状态相关的Cache行状态迁移,CPU进行存储器读的情况相对较为简单,请读者自行分析这个过程。 当CPU对一段存储器进行写操作时,如果这些数据在本地Cache中命中时,其状态可能为E、S、M或者O。 状态为E或者M时,数据将直接写入到Cache中,并将状态改为M。 状态为S时,数据将直接写入到Cache中,并将状态改为M,同时其他CPU保存该数据副本的Cache行状态将从S或者O迁移到I(Probe Write Hit)。 状态为O时,数据将直接写入到Cache中,并将状态改为M,同时其他CPU保存该数据副本的Cache行状态将从S迁移到I(Probe Write Hit)。 当CPU A对一段存储器进行写操作时,如果这些数据没有在本地Cache中命中时,而在其他CPU,如CPU B的Cache中命中时,其状态可能为E、S、M或者O。其中CPU A使用CPU B在同一个Cache共享域中。 Cache行状态为E时,CPU B将该Cache行状态改为I;而CPU A将从本地申请一新的个Cache行,将数据写入,并该Cache行状态更新为M。 Cache行状态为S时,CPU B将该Cache行状态改为I,而且具有同样副本的其他CPU的Cache行也需要将状态改为I;而CPU A将从本地申请一个Cache行,将数据写入,并该Cache行状态更新为M。 Cache行状态为M时,CPU B将原Cache行中的数据回写到主存储器,并将该Cache行状态改为I;而CPU A将从本地申请一个Cache行,将数据写入,并该Cache行状态更新为M。 Cache行状态为O时,CPU B将原Cache行中的数据回写到主存储器,并将该Cache行状态改为I,具有同样数据副本的其他CPU的Cache行也需要将状态从S更改为I;CPU A将从本地申请一个Cache行,将数据写入,并该Cache行状态更新为M。 Cache行状态可以从M迁移到O。例如当CPU A读取的数据从CPU B中命中时,如果在CPU B中Cache行的状态为M时,将迁移到O,同时CPU B将数据传送给CPU A新申请的Cache行中,而且CPU A的Cache行状态将被更改为S。 当CPU读取的数据在本地Cache中命中,而且Cache行状态为O时,数据将从本地Cache获得,并不会改变Cache行状态。如果CPU A读取的数据在其他Cache中命中,如在CPU B的Cache中命中而且其状态为O时,CPU B将该Cache行状态保持为O,同时CPU B将数据传送给CPU A新申请的Cache行中,而且CPU A的Cache行状态将被更改为S。 在某些应用场合,使用MOESI协议将极大提高Cache的利用率,因为该协议引入了O状态,从而在发送Read Hit的情况时,不必将状态为M的Cache回写到主存储器,而是直接从一个CPU的Cache将数据传递到另外一个CPU。目前MOESI协议在AMD和RMI公司的处理器中得到了广泛的应用。 Intel提出了另外一种MESI协议的变种,即MESIF协议,该协议与MOESI协议有较大的不同,也远比MOESI协议复杂,该协议由Intel的QPI(QuickPath Interconnect)技术引入,其主要目的是解决“基于点到点的全互连处理器系统”的Cache共享一致性问题,而不是“基于共享总线的处理器系统”的Cache共享一致性问题。 在基于点到点互连的NUMA(Non-Uniform Memroy Architecture)处理器系统中,包含多个子处理器系统,这些子处理器系统由多个CPU组成。如果这个处理器系统需要进行全机Cache共享一致性,该处理器系统也被称为ccNUMA(Cache Cohenrent NUMA)处理器系统。MESIF协议主要解决ccNUMA处理器结构的Cache共享一致性问题,这种结构通常使用目录表,而不使用总线监听处理Cache的共享一致性。 MESIF协议引入了一个F(Forware)状态。在ccNUMA处理器系统中,可能在多个处理器的Cache中存在相同的数据副本,在这些数据副本中,只有一个Cache行的状态为F,其他Cache行的状态都为S。Cache行的状态位为F时,Cache中的数据与存储器一致。 当一个数据请求方读取这个数据副本时,只有状态为F的Cache行,可以将数据副本转发给数据请求方,而状态位为S的Cache不能转发数据副本。从而MESIF协议有效解决了在ccNUMA处理器结构中,所有状态位为S的Cache同时转发数据副本给数据请求方,而造成的数据拥塞。 在ccNUMA处理器系统中,如果状态位为F的数据副本,被其他CPU拷贝时,F状态位将会被迁移,新建的数据副本的状态位将为F,而老的数据副本的状态位将改变为S。当状态位为F的Cache行被改写后,ccNUMA处理器系统需要首先Invalidate状态位为S其他的Cache行,之后将Cache行的状态更新为M。 独立地研究MESIF协议并没有太大意义,该协议由Boxboro-EX处理器系统 引入,目前Intel并没有公开Boxboro-EX处理器系统的详细设计文档。MESIF协议仅是解决该处理器系统中Cache一致性的一个功能,该功能的详细实现与QPI的Protocal Layer相关,QPI由多个层次组成,而Protocal Layer是QPI的最高层。 对MESIF协议QPI互连技术有兴趣的读者,可以在深入理解“基于目录表的Cache一致性协议”的基础上,阅读Robert A. Maddox, Gurbir Singh and Robert J. Safranek合著的书籍“Weaving High Performance Multiprocessor Fabric”以了解该协议的实现过程和与QPI互连技术相关的背景知识。 值得注意的是,MESIF协议解决主要的问题是ccNUMA架构中SMP子系统与SMP子系统之间Cache一致性。而在SMP处理器系统中,依然需要使用传统的MESI协议。Nehelem EX处理器也可以使用MOESI协议进一步优化SMP系统使用的Cache一致性协议,但是并没有使用该协议。 为简化起见,本章假设处理器系统使用MESI协议进行Cache共享一致性,而不是MOESI协议或者MESIF协议。 2 HIT#和HITM#信号 在SMP处理器系统中,每一个CPU都使用HIT#和HITM#信号反映HOST主桥访问的地址是否在各自的Cache中命中。当HOST主桥访问存储器时,CPU将驱动HITM#和HIT#信号,其描述如表3‑1所示。 表 3‑1 HITM#和HIT#信号的含义 HITM# HIT# 描述 1 1 表示HOST主桥访问的地址没有在CPU的Cache中命中。 1 0 表示HOST主桥访问的地址在CPU的Cache中命中,而且Cache的状态为S(Shared)或者E(Exclusive),即Cache中的数据与存储器的数据一致。 0 1 表示HOST主桥访问的地址在CPU的Cache中命中,而且Cache的状态为M(Modified),即Cache中的数据与存储器的数据不一致,在Cache中保存最新的数据拷贝。 0 0 MESI协议规定这种情况不允许出现,但是在有些处理器系统中仍然使用了这种状态,表示暂时没有获得是否在Cache命中的信息,需要等待几拍后重试。 HIT#和HITM#信号是FSB中非常重要的两个信号,各个CPU的HIT#和HITM#信号通过“线与方式”直接相连 。而在一个实际FSB中,还包括许多信号,本节并不会详细介绍这些信号。 3 Cache一致性协议中使用的Agent 在处理器系统中,与Cache一致性相关的Agent如下所示。 Request Agent。FSB总线事务的发起设备。在本节中,Request Agent特指HOST主桥。实际上在FSB总线上的其他设备也可以成为Request Agent,但这些Request Agent并不是本节的研究重点。Request Agent需要进行总线仲裁后,才能使用FSB,在多数处理器的FSB中,需要对地址总线与数据总线分别进行仲裁。 Snoop Agents。FSB总线事务的监听设备。Snoop Agents为CPU,在一个SMP处理器系统中,有多个CPU共享同一个FSB,此时这些CPU都是这条FSB上的Snoop Agents。Snoop Agents监听FSB上的存储器读写事务,并判断这些总线事务访问的地址是否在Cache中命中。Snoop Agents通过HIT#和HITM#信号向FSB通知Cache命中的结果。在某些情况下,Snoop Agents需要将Cache中的数据回写到存储器,同时为Request Agent提供数据。 Response Agent。FSB总线事务的目标设备。在本节中,Response Agent特指存储器控制器。Response Agent根据Snoop Agents提供的监听结果,决定如何接收数据或者向Request Agent设备提供数据。在多数情况下,当前数据访问没有在Snoop Agents中命中时,Response Agent需要提供数据,此外Snoop Agents有时需要将数据回写到Response Agent中。 4 FSB的总线事务 一个FSB的总线事务由多个阶段组成,包括Request Phase、Snoop Phase、Response Phase和Data Phase。目前在多数高端处理器中,FSB支持流水操作,即在同一个时间段内,不同的阶段可以重叠,如图3‑6所示。 在一个实际的FSB中,一个总线事务还可能包含Arbitration Phase和Error Phase。而本节仅讲述图3‑6中所示的4个基本阶段。 Request Phase。Request Agent在获得FSB的地址总线的使用权后,在该阶段将访问数据区域的地址和总线事务类型发送到FSB上。 Snoop Phase。Snoop Agents根据访问数据区域在Cache中的命中情况,使用HIT#和HITM#信号,向其他Agents通知Cache一致性的结果。有时Snoop Agent需要将数据回写到存储器。 Reponse Phase。Response Agent根据Request和Snoop Phase提供的信号,可以要求Request Agent重试(Retry),或者Response Agent延时处理(Defer)当前总线事务。在FSB总线事务的各个阶段中,该步骤的处理过程最为复杂。本章将在下文结合PCI设备的DMA读写执行过程,说明该阶段的实现原理。 Data Phase。一些不传递数据的FSB总线事务不包含该阶段。该阶段用来进行数据传递,包括Request Agent向Response Agent写入数据;Response Agent为Request Agent提供数据;和Snoop Agent将数据回写到Response Agent。 下文将使用本小节中的概念,描述在PCI总线中,与Cache相关的总线事务,并讲述相关的FSB的操作流程。 Boxboro-EX处理器系统由多个Nehalem EX处理器组成,而Nehalem EX处理器由两个SMP处理器系统组成,一个SMP处理器系统由4个CPU组成,而每一个CPU具有2个线程。其中SMP处理器系统之间使用QPI进行连接,而在一个SMP处理器内部的各个CPU仍然使用FSB连接。 HIT#和HITM#信号是Open Drain(开漏)信号,Open Drain信号可以直接相连,而不用使用逻辑门。
  • 热度 25
    2013-4-17 14:01
    1267 次阅读|
    0 个评论
    PCI总线规范定义了一系列与Cache相关的总线事务,以提高PCI设备与主存储器进行数据交换的效率,即DMA读写的效率。当PCI设备使用DMA方式向存储器进行读写操作时,一定需要经过HOST主桥,而HOST主桥通过FSB总线 向存储器控制器进行读写操作时,需要进行Cache共享一致性操作。 PCI设备与主存储器进行的Cache共享一致性增加了HOST主桥的设计复杂度。在高性能处理器中Cache状态机的转换模型十分复杂。而HOST主桥是FSB上的一个设备,需要按照FSB规定的协议处理这个Cache一致性,而多级Cache的一致性和状态转换模型一直是高性能处理器设计中的难点。 不同的HOST主桥处理PCI设备进行的DMA操作时,使用的Cache一致性的方法并不相同。因为Cache一致性操作不仅与HOST主桥的设计相关,而且主要与处理器和Cache Memory系统设计密切相关。 PowerPC和x86处理器可以对PCI设备所访问的存储器进行设置,其设置方法并不相同。其中PowerPC处理器,如MPC8548处理器,可以使用Inbound寄存器的RTT字段和WTT字段,设置在PCI设备进行DMA操作时,是否需要进行Cache一致性操作,是否可以将数据直接写入Cache中。RTT字段和WTT字段的详细说明见第2.2.3节。 而x86处理器可以使用MTRR(Memory Type Range Registers)设置物理存储器区间的属性,是否为可Cache空间。下文分别讨论在PowerPC与x86处理器中,PCI设备进行DMA写操作时,如何进行Cache一致性操作。 但是与PowerPC处理器相比,x86处理器在处理PCI设备的Cache一致性上略有不足,特别是网络设备与存储器系统进行数据交换的效率。因为x86处理器所重点优化的是PCIe设备,目前x86处理器使用的IOAT(I/O Acceleration Technology)技术,极大增强了PCIe设备与主存储器进行数据通信的效率,但是这种技术仍然不能与一些Data Plane处理器,如XLP832,P4080处理器优化I/O访问的技术相提并论。毕竟x86处理器所适用的领域依然是PC、服务器等计算和控制领域,并不是Data Plane处理器领域。
  • 热度 27
    2013-3-19 09:47
    1617 次阅读|
    2 个评论
    PCI总线作为处理器系统的局部总线,主要目的是为了连接外部设备,而不是作为处理器的系统总线连接Cache和主存储器。但是PCI总线、系统总线和处理器体系结构之间依然存在着紧密的联系。 PCI总线作为系统总线的延伸,其设计考虑了许多与处理器相关的内容,如处理器的Cache共享一致性和数据完整性,以及如何与处理器进行数据交换等一系列内容。其中Cache共享一致性和数据完整性是现代处理器局部总线的设计的重点和难点,也是本书将重点讲述的主题之一。 独立地研究PCI总线并不可取,因为PCI总线仅是处理器系统的一个组成部分。深入理解PCI总线需要了解一些与处理器体系结构相关的知识。这些知识是本书所侧重描述的,同时也是PCI总线规范所忽略的内容。脱离实际的处理器系统,不容易也不可能深入理解PCI总线规范。 对于今天的读者来说,PCI总线提出的许多概念略显过时,也有许多不足之处。但是在当年,PCI总线与之前的存在其他并行局部总线如ISA、EISA和MCA总线相比,具有许多突出的优点,是一个全新的设计。 (1) PCI总线空间与处理器空间隔离 PCI设备具有独立的地址空间,即PCI总线地址空间,该空间与存储器地址空间通过HOST主桥隔离。处理器需要通过HOST主桥才能访问PCI设备,而PCI设备需要通过HOST主桥才能主存储器。在HOST主桥中含有许多缓冲,这些缓冲使得处理器总线与PCI总线工作在各自的时钟频率中,彼此互不干扰。HOST主桥的存在也使得PCI设备和处理器可以方便地共享主存储器资源。 处理器访问PCI设备时,必须通过HOST主桥进行地址转换;而PCI设备访问主存储器时,也需要通过HOST主桥进行地址转换。HOST主桥的一个重要作用就是将处理器访问的存储器地址转换为PCI总线地址。PCI设备使用的地址空间是属于PCI总线域的,而与存储器地址空间不同。 x86处理器对PCI总线域与存储器域的划分并不明晰,这也使得许多程序员并没有准确地区分PCI总线域地址空间与存储器域地址空间。而本书将反复强调存储器地址和PCI总线地址的区别,因为这是理解PCI体系结构的重要内容。 PCI规范并没有对HOST主桥的设计进行约束。每一个处理器厂商使用的HOST主桥,其设计都不尽相同。HOST主桥是联系PCI总线与处理器的核心部件,掌握HOST主桥的实现机制是深入理解PCI体系结构的前提。 本书将以Freescale的PowerPC处理器和Intel的x86处理器为例,说明各自HOST主桥的实现方式,值得注意的是本书涉及的PowerPC处理器仅针对Freescale的PowerPC处理器,而不包含IBM和AMCC的Power和PowerPC处理器。而且如果没有特别说明,本书中涉及的x86处理器特指Intel的处理器,而不是其他厂商的x86处理器。 (2) 可扩展性 PCI总线具有很强的扩展性。在PCI总线中,HOST主桥可以直接推出一条PCI总线,这条总线也是该HOST主桥的所管理的第一条PCI总线,该总线还可以通过PCI桥扩展出一系列PCI总线,并以HOST主桥为根节点,形成1颗PCI总线树。这些PCI总线都可以连接PCI设备,但是在1颗PCI总线树上,最多只能挂接256个PCI设备(包括PCI桥)。 在同一条PCI总线上的设备间可以直接通信,并不会影响其他PCI总线上设备间的数据通信。隶属于同一颗PCI总线树上的PCI设备,也可以直接通信,但是需要通过PCI桥进行数据转发。 PCI桥是PCI总线的一个重要组成部件,该部件的存在使得PCI总线极具扩展性。PCI桥也是有别于其他局部总线的一个重要部件。在“以HOST主桥为根节点”的PCI总线树中,每一个PCI桥下也可以连接一个PCI总线子树,PCI桥下的PCI总线仍然可以使用PCI桥继续进行总线扩展。 PCI桥可以管理这个PCI总线子树,PCI桥的配置空间含有一系列管理PCI总线子树的配置寄存器。在PCI桥的两端,分别连接了两条总线,分别是上游总线(Primary Bus)和下游总线(Secondary Bus)。其中与处理器距离较近的总线被称为上游总线,另一条被称为下游总线。这两条总线间的通信需要通过PCI桥进行。PCI桥中的许多概念被PCIe总线采纳,理解PCI桥也是理解PCIe体系结构的基础。 (3) 动态配置机制 PCI设备使用的地址可以根据需要由系统软件动态分配。PCI总线使用这种方式合理地解决了设备间的地址冲突,从而实现了“即插即用”功能。从而PCI总线不需要使用ISA或者EISA接口卡为解决地址冲突而使用的硬件跳线。 每一个PCI设备都有独立的配置空间,在配置空间中含有该设备在PCI总线中使用的基地址,系统软件可以动态配置这个基地址,从而保证每一个PCI设备使用的物理地址并不相同。PCI桥的配置空间中含有其下PCI子树所能使用的地址范围。 (4) 总线带宽 PCI总线与之前的局部总线相比,极大提高了数据传送带宽,32位/33MHz的PCI总线可以提供132MB/s的峰值带宽,而64位/66MHz的PCI总线可以提供的峰值带宽为532MB/s。虽然PCI总线所能提供的峰值带宽远不能和PCIe总线相比,但是与之前的局部总线ISA、EISA和MCA总线相比,仍然具有较大的优势。 ISA总线的最高主频为8MHz,位宽为16,其峰值带宽为16MB/s;EISA总线的最高主频为8.33MHz,位宽为32,其峰值带宽为33MB/s;而MCA总线的最高主频为10MHz,最高位宽为32,其峰值带宽为40MB/s。PCI总线提供的峰值带宽远高于这些总线。 (5) 共享总线机制 PCI设备通过仲裁获得PCI总线的使用权后,才能进行数据传送,在PCI总线上进行数据传送,并不需要处理器进行干预。 PCI总线仲裁器不在PCI总线规范定义的范围内,也不一定是HOST主桥和PCI桥的一部分。虽然绝大多数HOST主桥和PCI桥都包含PCI总线仲裁器,但是在某些处理器系统的设计中也可以使用独立的PCI总线仲裁器。如在PowerPC处理器的HOST主桥中含有PCI总线仲裁器,但是用户可以关闭这个总线仲裁器,而使用独立的PCI总线仲裁器。 PCI设备使用共享总线方式进行数据传递,在同一条总线上,所有PCI设备共享同一总线带宽,这将极大地影响PCI总线的利用率。这种机制显然不如PCIe总线采用的交换结构,但是在PCI总线盛行的年代,半导体的工艺、设计能力和制作成本决定了采用共享总线方式是当时的最优选择。 (6) 中断机制 PCI总线上的设备可以通过四根中断请求信号INTA~D#向处理器提交中断请求。与ISA总线上的设备不同,PCI总线上的设备可以共享这些中断请求信号,不同的PCI设备可以将这些中断请求信号“线与”后,与中断控制器的中断请求引脚连接。PCI设备的配置空间记录了该设备使用这四根中断请求信号的信息。 PCI总线进一步提出了MSI(Message Signal Interrupt)机制,该机制使用存储器写总线事务传递中断请求,并可以使用x86处理器FSB(Front Side Bus)总线提供的Interrupt Message总线事务,从而提高了PCI设备的中断请求效率。 虽然从现代总线技术的角度上看,PCI总线仍有许多不足之处,但也不能否认PCI总线已经获得了巨大的成功,不仅x86处理器将PCI总线作为标准的局部总线连接各类外部设备,PowerPC、MIPS和ARM 处理器也将PCI总线作为标准局部总线。除此之外,基于PCI总线的外部设备,如以太网控制器、声卡、硬盘控制器等,也已经成为主流。 在ARM处理器中,使用SoC平台总线,即AMBA总线,连接片内设备。但是某些ARM生产厂商,依然使用AMBA-to-PCI桥推出PCI总线,以连接PCI设备。
相关资源
  • 所需E币: 1
    时间: 2023-7-29 17:02
    大小: 630.27KB
    上传者: Argent
    AN12042(RT1050Cache使用说明)
  • 所需E币: 0
    时间: 2021-9-15 18:35
    大小: 534.96KB
    上传者: Argent
    FPGA是一个技术密集型的行业,没有坚实的技术功底,很难形成有竞争力的产品。从技术上来看FPGA未来的发展有广阔的空间,嵌入式开发需要了解不同领域的产品工作原理,包括快速读懂数据手册,搜集了部分数据手册,第三方教育机构的指导性文档,希望对您有所帮助。
  • 所需E币: 5
    时间: 2021-9-7 21:57
    大小: 4.92MB
    上传者: czd886
    低功耗指令Cache的设计
  • 所需E币: 1
    时间: 2021-4-8 10:51
    大小: 2.89MB
    上传者: czd886
    支持目录协议的多核DSP一级数据Cache的设计与实现
  • 所需E币: 0
    时间: 2021-3-18 22:10
    大小: 3.05MB
    上传者: samewell
    编程技术_Linux内核文件Cache_机制
  • 所需E币: 1
    时间: 2021-3-17 10:28
    大小: 2.77MB
    上传者: ZHUANG
    高性价比DSP中指令Cache的研究与设计
  • 所需E币: 1
    时间: 2021-3-17 10:46
    大小: 2.89MB
    上传者: ZHUANG
    支持目录协议的多核DSP一级数据Cache的设计与实现
  • 所需E币: 4
    时间: 2020-11-6 22:33
    大小: 3.16MB
    上传者: samewell
    编程技术_Linux内核文件Cache_机制
  • 所需E币: 3
    时间: 2019-12-25 22:53
    大小: 73.34KB
    上传者: 16245458_qq.com
    TMS320DM642DSP是TI公司新近推出的一款高性能数字多媒体处理器,它的两级高速缓存(Cache)结构为高复杂度视频编码算法的高效率实现提供了有力的保证。综合考虑视频编码算法特点和Cache结构特征实现的算法,能够满足系统整体需求和指标要求。本文首先简要介绍DM642的Cache结构特点,然后针对视频编码算法的高复杂度,提出一种Cache优化策略,能够很好的解决应用系统中的实时实现问题。……
  • 所需E币: 4
    时间: 2019-12-25 15:55
    大小: 285.59KB
    上传者: quw431979_163.com
    该文提出了一种合理地应用Cache的方法,以解决VxWorks环境下操作系统的启动速度慢和应用程序运行效率低的问题.在启动过程中,通过修改配置文件来合理地打开代码Cache和数据Cache,加快操作系统的启动速度;在应用程序开发...第30卷第6期南京理工大学学报V01.30No.6兰鲤鱼生12旦』旦望!墅幽壁!塑璺蚵i望g旦垡!旦墅!迎Q!曼堕旦坠竺旦璺旦堕!竺竺墅坚塑!壁g!望塑:至鲤鱼VxWorks操作系统中Cache的配置和编程方法沈玮1,于晓华1,董磊2(1.中国电子科技集团公司第51研究所,上海201802;2.上海奥索汉泰电子科技有限公司,上海201106)摘要:该文提出了一种合理地应用Cache的方法,以解决VxWorks环境下操作系统的启动速度慢和应用程序运行效率低的问题。在启动过程中,通过修改配置文件来合理地打开代码Cache和数据Cache,加快操作系统的启动速度;在应用程序开发过程中,通过使用不同的Cache编程方法,提高应用程序的运行效率。实例分析给出了具体应用的实现方法。关键词:VxWorks操作系统;高速缓冲存储器……
  • 所需E币: 5
    时间: 2019-12-25 15:44
    大小: 150.72KB
    上传者: quw431979_163.com
    CPCI总线是一种成熟全面的计算机总线,通过它主机可以方便地为DSP加载程序,进行调试和监控工作;另外还能在主机和DSP系统间完成高速数据传输工作.本文结合一个已经成功应用的设计,阐述了基于双状态机+Cache结构的主机接口设计,并给出了逻辑框图.利用PLX公司的PCI9656接口芯片,FPGA提供了高达90MB/s的主机访问DSP和SDRAM的速度.嵌蕊妓蒂鼬鲥捌k删吲基于CPCI总线多DSP系统的高速主机接口设计张骋,蔡惠智,何国建(中国科学院声学研究所,北京100080)摘要:CPCI总线是一种成熟全面的计算机总线,通过它主机可以方便地为DSP加裁程序,进行调试和监控工作;另外还能在主机和DSP系统问完成高速数据传输工作。本文结合一个已经成功应用的设计,阐述了基于双状态机+Cache结构的主机接口设计,并蛤出了逻辑框图。利用PL)【公司的PCI9656接口芯片,FPGA提供了高迭90MB,s的主机访问DsP和SDRAM的速度。关键词:CPCI总线n,GADSPSDRAMCacheHigh―speedhostinterfacedesign“multi―DSPsystembasedonCPCIZHANGCh8Ilg,CAIHlli珊,HEGuoJi加……
  • 所需E币: 3
    时间: 2019-12-25 15:33
    大小: 223.04KB
    上传者: rdg1993
    基于TI的DM642芯片提出了一套提升小波变换的优化方法.试验证明,优化方法比现有方法在效率上有较大提高.5/3提升小波在DM642上硇实坝与优化~..沈海涛,樊养余(西北工业大学,陕西西安710072)方豢纛泼竺一娘柑一…概…呲…岘有关键词:提升,J、波茹642cAc腿缺失流水一邺h优化乃法比现有璺.?77、5/3提升小波变换作磊茹=三。裟.中.,采!譬到广泛应用。在新的苗磊盂菇::焉罴i曼置编码主怒器慧要嫠萎善构耋一一嚣妻扩展性、可升级性与易菇嘉磊_言耋芸量要竺竺簟,:完全能满足各种处理需求:“。门7磕俐力式灵活性上提誊背篱:掣裟::竺在‰算法的基础捻篙孝等意囊蔷溅黧棠答碧,坤、L1D和L2。L1只能作≥Z麓:激誓篓:1,譬翌16KB,……
  • 所需E币: 3
    时间: 2019-12-25 12:51
    大小: 806.73KB
    上传者: wsu_w_hotmail.com
    深层嵌入式控制InformationQuarterly[31]Number1,Autumn2004InformationQuarterly[32]Number1,Autumn2004ARM1026EJ-S+VICARM1026EJ-S020406080100120140InformationQuarterly[33]Number1,Autumn20040.321.80.251.61.40.2……
  • 所需E币: 5
    时间: 2019-12-25 11:36
    大小: 148.38KB
    上传者: 238112554_qq
    在分析Cache性能的基础上介重构算法。Cache模型能够在程的应用程序对可重构Cache进行效降低处理器的功耗。……
  • 所需E币: 5
    时间: 2019-12-25 10:35
    大小: 372.62KB
    上传者: 二不过三
    ARM存储系统……
  • 所需E币: 4
    时间: 2019-12-25 10:33
    大小: 102.87KB
    上传者: 16245458_qq.com
    带Cache内核简要介绍……
  • 所需E币: 5
    时间: 2019-12-25 10:24
    大小: 213.52KB
    上传者: givh79_163.com
    可编程逻辑器件--中文第5章存储器z介绍z只读存储器(ROM)z随机访问存储器(RAM)z特殊存储器功能4/28/2004CopyrightpreservedbyProf.LUO,TsinghuaUNIV.387特殊存储器功能z高速缓存(Cache)z直接和CPU进行高速通信,从相对慢速、便宜的主存中获取程序指令和数据z易挥发的z512Kz先入先出存储器(FIFO)z用作高速计算机和慢速外设(比如键盘)之间的缓冲器z参考刘勇攀的报告4/28/2004CopyrightpreservedbyProf.LUO,TsinghuaUNIV.388参考文献电路级z第12章设计存储器和阵列结构zRabaey,DigitalIntegratedCircuits,数字集成电路-设计透视(第2版),清华大学出版社,2004zModule:数字大规模集成电路,研究生课程4/28/2004CopyrightpreservedbyProf.LUO,TsinghuaUNIV.389第6章可编程逻辑器件(PLD)可编程逻辑器件z介绍zPLD电路基础zPLD结构4/28/……
  • 所需E币: 5
    时间: 2020-1-9 14:13
    大小: 388.16KB
    上传者: 2iot
    Capture裡的DesignCache應用◆Capture……