这不是汇编语言的范畴,常规的汇编语言不会介绍这些东西。通常来说,这一块属于硬件、操作系统设计的一部分。一句话概括的话,多核操作就是写寄存器+IPI中断(Inter-Processor Interrupt,核间中断)。如果题主只是为了学习汇编语言的话,建议暂时不要接触这方面的知识,对汇编语言的学习基本上毫无用处,反而会造成很多误解。SMP的启动过程,跟硬件高度相关,比如你学习的X86的实现方式,再接触ARM的时候,会发现很多都不一样。
如果题主非常想要了解的话,有两种方法,一种是读Intel的手册,比较枯燥并且读了也不一定明白。还有一种方法是看Linux的多核启动代码,但这种方法看上去很糊涂。
Intel手册的链接:
先从卷3的<ADVANCED PROGRAMMABLE INTERRUPT CONTROLLER (APIC)>章节看起。
SMP启动和通信的内容非常多,几万字都不可能详细介绍清楚。以Intel的x86-64环境为例,需要学习:
1. 分页、分段机制,MSR寄存器操作
2. APIC知识
3. IPI通信
大概的说一下:
先通过APIC/CPUID来获得硬件上多核的支持情况。
如果要启动一个从核,先要为从核准备对应的页表以及基本的内存空间(比如异常栈、GDTR等),同时还要准备一个最基本的IDLE任务代码和堆栈,来接受调度。这里还包括准备一些MSR寄存器等等。
最后一步,是通过APIC发送一个IPI中断,让从核切换状态,获得IDLE任务的入口,并开始运行。
此时就完成了从核的启动。
从编程的角度上看,这个过程里,基本上都是高级语言在操作(比如申请内存等)。唯一底层的操作,也就是跟汇编语言有相关性的,是那个IPI中断,就是通过一个CPU向另一个CPU发送指令。题主可能以为这里是用一条很特殊的汇编指令吧,其实不是的,这个IPI中断,是通过向一块内存里写入特定的数值来触发的,对应的汇编指令是MOV指令。
通过MOV指令,向APIC控制器的特定寄存器(FEE00000H + CPU偏移)里写入指定内容,就可以触发对应的IPI中断,另外的一个核就可以收到这个IPI并开始处理。
所以整个的过程中,几乎没有特殊的汇编指令参与。
--------------------
Linux这一块的代码非常庞杂,涉及到一系列的函数指针调用,从头看的话很难理清楚,并且Linux不同arch的实现也不完全相同,Linux对不同arch做了封装。
x86的部分,最核心的部分可以关注这几个:
do_boot_cpu,真正启动从核的代码:
ia64_send_ipi,发送IPI的函数
这里调用的writeq就是一句汇编指令,可以说是题主想要的那句汇编,展开了就是一句MOV,向ipi_addr里写入ipi_data,就完成了从核的启动了。ipi_data可以理解为一个中断号,但中断的代码是提前准备好的(调用关系太长,就不详细介绍了)。