百科问答小站 logo
百科问答小站 font logo



汇编语言怎么表示多核? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

这不是汇编语言的范畴,常规的汇编语言不会介绍这些东西。通常来说,这一块属于硬件、操作系统设计的一部分。一句话概括的话,多核操作就是写寄存器+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,真正启动从核的代码:

git.kernel.org/pub/scm/

ia64_send_ipi,发送IPI的函数

git.kernel.org/pub/scm/

这里调用的writeq就是一句汇编指令,可以说是题主想要的那句汇编,展开了就是一句MOV,向ipi_addr里写入ipi_data,就完成了从核的启动了。ipi_data可以理解为一个中断号,但中断的代码是提前准备好的(调用关系太长,就不详细介绍了)。




  

相关话题

  汇编下call和ret指令是否有内存屏障的作用? 
  if(x>y)和if(x-y>0)有没有区别(x,y都是int)? 
  可以预先将 X86 平台机器码译码到 micro operations 来解决 X86 译码效率低吗? 
  C 语言是否需要改进,甚至重新设计一门语言取代 C 语言? 
  第一个汇编器是怎么来的,直接输入二进制编码吗? 
  x86 global页在新的page directory里不存在会发生什么? 
  雷军写代码水平如何? 
  为什么在汇编语言中需大量使用跳转指令,而在C语言中却尽量避免使用goto语句呢? 
  为什么显卡在内存中的映射是0b8000H? 
  对于这一条add指令,ALU是不是会被使用2次来分别计算有效地址和数据?而且是在1个阶段内还是2个阶段 

前一个讨论
如何评价 Windows 11 抄袭 mac OS 的声音就没断过?
下一个讨论
AS之内的路由器在执行OSPF协议、建立本机转发用的IP路由表的过程中,是否、如何存储完整的路由信息?





© 2024-11-21 - tinynew.org. All Rights Reserved.
© 2024-11-21 - tinynew.org. 保留所有权利