兄弟阋墙,CPU内核们是如何争当老大的?
中国地大物博,自古却形成大一统的政治格局。国家很大,皇帝却只有一个。皇子们为了争夺帝位,上演了无数惊心动魄的历史活剧。远了有杀兄逼父,英明神武的唐太宗;近了有屡次被搬上荧幕的九龙夺嫡。存在的就是合理的,一言堂的格局也保证了不会令出多门,国家陷入混乱。
电脑主板设备众多,需要有统一的调度,而运行程序的基本单位:内核却越来越多,尤其是多CPU的时候。东宫和宠妃们(各个CPU)都生了很多皇子(内核),到底谁是真龙天子,在下一次启动后掌控这个电脑帝国呢?
CPU内核的角色
皇子分成嫡子、长子和一般皇子。CPU每个内核的角色也有多种:
- AP:Application Processor。应用处理器,类似一般皇子。
- BSP:BootStrap Processor。启动处理器,类似皇太子。
BSP在多CPU的情况下,又分为两种:
- NBSP:Node BSP。每个实体CPU是一个node,NBSP是每个node选出来的皇位继承人。
- SBSP:System BSP。系统BSP是在各个NBSP中选出来的唯一人选,是真龙天子,真正的皇位继承人。
皇帝驾崩了,宫斗剧开始
在前朝皇帝驾崩(计算机重启)后,各方势力开始角逐。除了已经介绍过的皇子们,我们先来看还有哪些出场人物:
- 各宫娘娘:她们是CPU的on die Rom,负责挑选代表本宫势力的皇子(NBSP)出来角逐太子。
- 顾命大臣:BIOS,他负责在被挑选出来的皇子中甄选太子(SBSP),以继承大统。
皇帝驾崩,太监们把消息传递出去,各方开始蠢蠢欲动起来:
- 最先收到消息的娘娘们在自己宫内(CPU内)寻找准太子(NBSP)。各个皇子长相都差不多,手心手背都是肉,到底选哪个呢?首先被淘汰的就是那些个孪生的弱不经风的弟弟们。接下来,和本朝一样,先生出来的总是受到青睐,各个AP都有个APICID,娘娘一般都选择APICID小的。
- 没被选上的皇子(AP)悄悄回家了(被放入Wait for SIPI的状态),等待被新任皇帝安排工作。
- 入选的皇子(NBSP)都到了顾命大臣(BIOS)家(reset Vector),试图说服BIOS选择他当皇帝。顾命大臣性格不同,也会有很多不同的策略:
- 选拔型:让入选皇子站在同一个起跑线上去夺旗,谁拿到谁当皇帝。这个旗是一个Global的寄存器,各个NBSP都去读,只有一个能够读到1,之后其他人读都是0。
- 软耳根型:谁先到BIOS家,就让谁当皇帝。
- 认死理型:只认嫡长子,非让嫡长子当皇帝。嫡长子就是东宫皇后(socket 0的CPU)的第一个儿子。十分讽刺的是,和中国历史上嫡长子继承制为主流一样,BIOS中认死理的也是大多数。这样做缺少灵活性,如果没有东宫怎么办呢?如果嫡长子不堪大用怎么办呢?
皇帝选拔出来了,他开始行驶职责,运行MRC初始化内存、初始化硬件、让兄弟们帮忙干活(WakeupAP)等等。具体他要干什么可以参考专栏的另一篇文章( 按下电源键后发生了什么?电脑是如何优雅地开机的?)。BIOS这大权在握的顾命大臣在一旁监视,如果他发现皇帝不行,它可以在后期废立皇帝(SwithBSP)。
结论
俗话说:兄弟同心,其利断金。众多内核直接虽然没有如历史中皇子们般骨肉相残,但在BIOS阶段,也是忙的忙死,闲的闲死。SBSP一旦被选择出来,它就是整个系统的主人。它运行BIOS的主体部分,OS Loader也是它来跑,直到操作系统。AP大部分时间无事可干,处在Wait for SIPI的状态,在后期初始化AP的时候得以运行一会,然后就被放入死循环或者低功耗状态(Cstate),直到被操作系统调度。
如何让AP在BIOS阶段就能并发执行部分代码,这是UEFI BIOS努力的目标之一。目前服务器的内存初始化部分会让各个NBSP初始化自身的内存,而主体BIOS却还是单线程的。
CPU是如何调度的,以及CPU在BIOS各个阶段的模式(16位、32位以及64位)我们会在今后另写文章介绍,最后给大家一个思考题:为什么AP/BSP这里是processor,而不是Core或者Thread?
欢迎大家关注本专栏和用微信扫描下方二维码加入微信公众号"UEFIBlog",在那里有最新的文章。同时欢迎大家给本专栏和公众号投稿!