百科问答小站 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可以理解为一个中断号,但中断的代码是提前准备好的(调用关系太长,就不详细介绍了)。




  

相关话题

  可以预先将 X86 平台机器码译码到 micro operations 来解决 X86 译码效率低吗? 
  汇编的ret怎么区分近返回还是远返回? 
  if(x>y)和if(x-y>0)有没有区别(x,y都是int)? 
  苹果的 Rosetta 2 的实现原理大概是怎样的? 
  向下扩展的段,为什么偏移量是从limit+1 ~ 0xFFFF? 
  不同指令集架构的芯片,是如何去支持基础软件库的? 
  为什么8086CPU不支持将数据直接送入段寄存器的操作? 
  指令前缀0x66到底是干什么用的? 
  计算机底层是如何访问显卡的? 
  都说寄存器比内存快,但是为什么有些时候运行显示的是寄存器更慢? 

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





© 2024-06-12 - tinynew.org. All Rights Reserved.
© 2024-06-12 - tinynew.org. 保留所有权利