分享

x86架构下Intel CPU里的Multi Processor的学习记录

 sofes 2017-09-06

      X86架构下的产品包括Notebook, Desktop,Server,Workstation等。Notebook和Desktop里一般都只有一颗CPU,Server和Workstation则会有多颗。而随着生活水平的提高,对于CPU速度的要求越来越高,但由于工艺的原因,速度提升到一定阶段之后就无法再提升,此时,工业界想出了另外一个办法:集成多个核。这就是多核CPU的来历。这里的核称作core。

      除了多核CPU,Intel还提出了一种技术叫Hyper-threading,也就是超线程技术。当超线程技术使能之后,一个core会虚拟出两个logical-processor。

      总结一下,平台可能有1-N个CPU,每个CPU可能有1-N个核,每个核可能有1-2个logical-processor。

      我们可以把操作系统中的线程(thread)对应到这里的logical-processor,实际上操作系统中的thread的概念要更会复杂,但这里只考虑thread由一个logical-processor来执行这种一一对应的关系而已。

      在OS中是多线程的执行环境,但在BIOS POST阶段是单线程执行,那么如何处理这多个logical-processor的关系呢?

      BSP - boot strap processor; AP - application processor; nBSP - native BSP,适用于多个CPU的环境下,指最终选作执行BIOS代码的logical-processor。

      AP在POST阶段处于何种状态:在被选作AP之后(竞争BSP失败),AP的状态是变化的,wait-for-SIPI -> 被BSP唤醒,执行AP init code -> halt。当AP处于halt状态时,只能接受INIT, SMI, NMI, snoop, 以及STPCLK#。

      在BIOS POST阶段,AP绝大部分时间都处于halt状态,这也是为什么用手摸散热片的时候,只有CPU0的散热片很烫,而其余的CPU上面的散热片只是一点点热的原因。如果让AP一直处于一个loop中,其余CPU的散热片是否也会发烫还有待验证!(TODOTODOTODO)

      AP的伪代码:                             

[csharp] view plain copy
  1. <pre name="code" class="csharp">GeneralInitCode();  
  2. if(ApFunction) ApFunction();  
  3. SetState(APIC_ID);  
  4. _asm_{  
  5.       hlt;  
  6.      }   
  7. </pre><br>  
  8. <p></p>  
  9. <pre></pre>  
  10.       在这种代码中,每次AP执行代码之后都会重新进入halt状态,需要BSP重新发送INIT-SIPI-SIPI才能把AP唤醒。  
  11. <p></p>  
  12. <p>      另外一种则是</p>  
  13. <p></p><pre name="code" class="csharp">GeneralInitCode();  
  14. CheckAp:  
  15. if(ApFunction) ApFunction();  
  16. SetState(APIC_ID);  
  17. goto CheckAp</pre>      这种代码中,BSP只需要把function pointer放到ApFunction里去,AP就会执行。<br>  
  18. <br>  
  19. <p></p>  
  20.      
请选中你要保存的内容,粘贴到此文本框

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多