四核CPU或者多核CPU的寄存器如何操作?

renxu350 2010-05-09 05:46:11
比如 Intel 的 Core 2 Quad ,我看一些网站的详细资料说,有4个独立线程,那是不是每一个线程每一个核都有自己独立的一套寄存器?比如 Core 1 的就像是 RAX1, DS1, CS1,, Core 2 的就像是 RAX2, DS2, CS2,, 还是或者仅仅在硬件上封装成一套 RAX DS, CS,, 这样,为了不乱套,不让你单独操作这些多核寄存器呢?我查CSDN,MSDN都查不到资料,是不是有什么特别的指令集?有谁搞过这方面的开发的?
...全文
1306 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
failure5152 2011-07-29
  • 打赏
  • 举报
回复
学习了,一直也有这个疑问。。。
renxu350 2010-05-11
  • 打赏
  • 举报
回复
如果操作系统能分别操作多核中某一核独立的寄存器,那应用程序也可以一定程度分别操作独立的寄存器。
renxu350 2010-05-11
  • 打赏
  • 举报
回复 1
查了一个这个帖子:
http://topic.csdn.net/t/20060622/19/4837791.html

楼主DraculaW(成爲牛人,然後離開)

请问多核处理器里面每个核心是有自己的寄存器呢还是大家公用一组寄存器?

1 楼fangzhe()

就IA-32(包括EM64T)而言,寄存器是独享的。因为共享会涉及到复杂的调度问题,比如:
Core 0:嗨~我要用EAX啦~
Core 1:不行,我这里一个中断要返回EAX!
Core 0:那~我等等?
。。。
Core 0:怎么还没好?
Core 1:中断还要用ECX啊,你占着呢。
Core 0:不行啊,我那个调用EAX的内容现在存在ECX,不能给你用啊
。。。
Core 1:你换到EBX
Core 0:也在用
Core 0:你就不能不用ECX?
Core 1:那我还有个数放哪?EBX你用,EDX我也用。。。
。。。
死机了

2 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)

涉及到体系结构了。
vuoin 2010-05-10
  • 打赏
  • 举报
回复
当某个线程的执行尚未结束(如果是循环线程,则永远也不会结束),倒计时却已到,线程的寄存器状态会不会丢失呢?其实不会。因为在线程切换时,线程的寄存器状态会被保存到任务状态段TSS,任务状态段TSS也在全局描述符表GDT中,但是不是由代码段寄存器CS来选择,而是由任务寄存器TR来选择。当再次切换到这个线程中时,TSS中的任务状态又会被重新载入相应的寄存器。

任务状态段TSS保存的任务状态如下图所示:

在用户状态下,只要有多个用户线程,多个核就可以同时执行不同的用户线程,从而可以充分利用多核处理器的处理能力。
vuoin 2010-05-10
  • 打赏
  • 举报
回复
调用操作系统的创建线程API,即可创建用户线程。

每个线程的代码段都由段描述符表指定了基址和界限,位于RAM中的不同地址,绝不允许越界,所以,只要保证多核总是执行不同的线程,就能保证多核总能执行位于不同地址的指令。
那么,怎么保证多核总是执行不同的线程呢?靠的是总线锁LOCK#信号。当某个核访问一个线程时,会同时向总线发出LOCK#信号锁住总线,阻塞其它核对这个线程的访问,直到这个核退出这个线程后解锁总线,才允许其它核访问。当多个核同时访问一个线程时,都会向总线发出LOCK#信号锁住总线,此时优先级较高的核的发出的LOCK#信号的优先级比优先级较低的核的LOCK#信号的优先级高,所以只有优先级较高的核能抢到总线锁,访问这个线程并阻塞其它核。比如核1和核2同时访问某一线程,最后执行这一线程的只有优先级较高的核1,核2被阻塞后转而去访问其它线程。

一个核不会总是执行一个线程,而是会定期切换线程。怎么切换线程呢?这是通过定时器中断来实现的。每个核都有一个定时器,会自动倒计时。在切换入一个用户线程之前,操作系统中负责切换线程的线程会把定时器设置好倒计时,当用户线程执行完定时器的倒计时后,定时器发出一个定时器中断信号,核收到定时器中断信号后,会转到中断描述符表所指定的定时器中断号的中断处理程序——即操作系统中负责切换线程的线程,然后操作系统中负责切换线程的线程又把定时器设置好倒计时,然后切换入另一个用户线程。每次用户线程之间的切换,都要经过操作系统中负责切换线程的线程。当然,与用户线程比起来,操作系统中负责切换线程的线程所需的时间是极少的。
etracer 2010-05-10
  • 打赏
  • 举报
回复
学习了 。
spirit_sheng 2010-05-10
  • 打赏
  • 举报
回复
楼主需要对线程有所了解。结合以下点自己思考一下就明白了:
1)一个线程,只能在一个核上执行,这个线程只能操作其所执行的核上的寄存器。
2)当一个线程在一个核上执行时,其他的核上有其他的线程在执行。如果你能够更改其他的核上的寄存器,将会破坏其他线程的执行环境。所以,除了操作其所执行的核上的寄存器,修改其他核上的寄存器,是不被允许的。
3)楼主要明白一个执行环境的概念,虽然你的CPU有四个核,但一个系统中通常有成百上千个线程。任一时刻最多有核的个数的线程是被执行的,其他大多数线程是被挂起的。只不过这些线程的切换很快,用户感觉不到罢了。
4)系统调度时,也就是线程切换时,寄存器的值有一个保存和恢复的过程。也就是说,当这个线程被挂起时,其各寄存器的值,后保存在内存中;当下次这个线程重新获得执行权时,系统会根据上次保存的内存中的数据,恢复各寄存器的值。所以,寄存器的值并不是象你想的那样具有全局的生命期,而是与你的线程相关的,你的这个操作某个核上的寄存器的想法,是没有意义的。
vuoin 2010-05-10
  • 打赏
  • 举报
回复
确实每个核都有一套完整的寄存器。

其实多核的地址跳转分离仅仅是启动的第一步,以后还有很多事要做:
1.每个核分别执行相应地址上的操作系统指令,把各自的CR0寄存器的第0位即PE标志位设为1,从而进入保护模式。在保护模式下,指令的地址由段寄存器CS、段描述符表寄存器GDTR和LDTR、段描述符表GDT和LDT以及指令指针EIP共同决定。段描述符表寄存器GDTR和LDTR分别指定段描述符表GDT和LDT的基址,段寄存器CS中的选择子从段描述符表GDTR或LDTR中选择一项(当CS的第2位即表指示位为0时,选择全局描述符表GDT中的一项,当CS的第2位即表指示位为1时,选择局部描述符表LDT中的一项)。GDT和LDT都在RAM中,分别由全局描述符表寄存器GDTR和局部描述符表寄存器LDTR指令基址。段描述符表GDT和LDT中的被选择项指定代码段的基址,EIP指定代码段的变址。
2.每个寄存器继续分别执行相应地址上的操作系统指令,构建好各自的中断描述符表IDT,用来在中断时进入操作系统的中断处理程序。中断描述符表IDT在RAM中,由中断描述符表寄存器IDTR指定基址,由中断号指定表选项。
3.每个核分别创建操作系统代码段,即操作系统线程。

至此,操作系统的初始化完成,可以开始调度线程了。
renxu350 2010-05-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dragonzht 的回复:]

四核CPU相当于四个单核CPU合在一起,四个核各有完整的一套寄存器。应用程序在哪个核上运行?这是操作系统指定的,普通程序员没法干预。写应用程序时,像在单核CPU上一样使用寄存器就行了。
[/Quote]

我也怀疑多核CPU无法独立操作某个核的独立的寄存器,但不知是否确定?
renxu350 2010-05-10
  • 打赏
  • 举报
回复
谢谢LS诸位热心的回答,并特别感谢 vuoin阁下 详尽的回答,但 v君 提供的更多的偏向了操作系统层面的细节了,要是能更多知道一些WINDOWS平台应用程序级别的多核CPU寄存器操作的细节就好了,呵呵,所以本贴等一等再结贴吧,呵呵,,,,,

另外回复 vuoin :
按照您提供的细节,就是存在独立的 EIP0,EIP1,EIP2,EIP3,那就是可以确定每个核都有一套独立的寄存器了?
skyworth98 2010-05-09
  • 打赏
  • 举报
回复
sp

[Quote=引用 1 楼 mydo 的回复:]
intel指令手册中有相关指令,另外还有多核平台结构详述。

你可以到intel官方下载pdf版本。
[/Quote]
大熊猫侯佩 2010-05-09
  • 打赏
  • 举报
回复
intel指令手册中有相关指令,另外还有多核平台结构详述。

你可以到intel官方下载pdf版本。
vuoin 2010-05-09
  • 打赏
  • 举报
回复
更正一下:
四核处理器的完整启动过程如下:
1.处理器刚加电或复位,主核0立即启动(三个从核尚未启动),此时主核0的EIP指向ROM,主核0从ROM中读取BIOS指令,通过BIOS指令把磁盘中的操作系统引导程序载入ROM出口处的RAM。
2.主核0执行玩ROM中的BIOS指令进入RAM,执行RAM中的操作系统引导程序,跳至相应的地址,然后执行那个地址上的指令来改变这条跳转指令的跳转地址供从核1使用。
3.从核1延时启动,虽然此时从核1的EIP指向ROM,但ROM对从核不可读,所以执行空指令,除了EIP不停加1外什么事都不干。
4.从核1执行玩指向ROM的空指令进入RAM,执行RAM中的操作系统引导程序,执行已经被主核0改变了的跳转指令,跳入一个与主核0不同的地址,然后执行那个地址上的指令再次改变这条跳转指令的跳转地址供从核2使用。
5.从核2延时启动,虽然此时从核2的EIP指向ROM,但ROM对从核不可读,所以执行空指令,除了EIP不停加1外什么事都不干。
6.从核2执行玩指向ROM的空指令进入RAM,执行RAM中的操作系统引导程序,执行已经被从核1改变了的跳转指令,跳入一个与从核1不同的地址,然后执行那个地址上的指令再次改变这条跳转指令的跳转地址供从核3使用。
7.从核3延时启动,虽然此时从核3的EIP指向ROM,但ROM对从核不可读,所以执行空指令,除了EIP不停加1外什么事都不干。
8.从核3执行玩指向ROM的空指令进入RAM,执行RAM中的操作系统引导程序,执行已经被从核2改变了的跳转指令,跳入一个与从核2不同的地址。
至此,四个核已经分别指向不同的地址,可以同时执行不同的指令了。
wtertwe 2010-05-09
  • 打赏
  • 举报
回复
真够复杂的
vuoin 2010-05-09
  • 打赏
  • 举报
回复
完整的启动过程如下:
1.处理器刚加电,主核0立即启动(三个从核尚未启动),此时主核0的EIP指向ROM,主核0从ROM中读取BIOS指令,通过BIOS指令操作系统引导程序写入ROM出口处的RAM。
2.主核0执行玩ROM中的BIOS指令进入RAM,执行操作系统引导程序,跳至相应的地址,然后执行那个地址上的指令来改变这条跳转指令的跳转地址供从核1使用。
3.从核1延时启动,虽然此时从核1的EIP指向ROM,但ROM对从核不可读,所以执行空指令,除了EIP不停加1外什么事都不干。
4.从核1执行玩指向ROM的空指令进入RAM,执行操作系统引导程序,执行已经被主核0改变了的跳转指令,跳入一个与主核0不同的地址,然后执行那个地址上的指令再次改变这条跳转指令的跳转地址供从核2使用。
5.从核2延时启动,虽然此时从核2的EIP指向ROM,但ROM对从核不可读,所以执行空指令,除了EIP不停加1外什么事都不干。
6.从核2执行玩指向ROM的空指令进入RAM,执行操作系统引导程序,执行已经被从核1改变了的跳转指令,跳入一个与从核1不同的地址,然后执行那个地址上的指令再次改变这条跳转指令的跳转地址供从核3使用。
7.从核3延时启动,虽然此时从核3的EIP指向ROM,但ROM对从核不可读,所以执行空指令,除了EIP不停加1外什么事都不干。
8.从核3执行玩指向ROM的空指令进入RAM,执行操作系统引导程序,执行已经被从核2改变了的跳转指令,跳入一个与从核2不同的地址。
至此,四个核已经分别指向不同的地址,可以同时执行不同的指令了。
vuoin 2010-05-09
  • 打赏
  • 举报
回复
加电或复位后主核总是立即启动,从核总是延时启动。即使是SMP型多核,在启动时也有一个主核几个从核,即使同为从核,启动也有先后之分,没有绝对的众核平等。
vuoin 2010-05-09
  • 打赏
  • 举报
回复
四核处理器有一个主核(也叫引导核),三个从核。
任何核刚启动时,EIP寄存器的值均为00000000000000001111111111110000,恰好指向只读内存ROM的地址(ROM和RAM是同一编址的,都能被寻址,一起构成整个内存空间)。但ROM只对主核是可读的,对从核来说,ROM是不存在的。
启动过程如下:
1.处理器刚加电,主核0启动(三个从核尚未启动),此时主核从ROM中读取BIOS指令,通过BIOS指令操作系统引导程序写入ROM出口处的RAM。
2.主核0执行玩ROM中的BIOS指令进入RAM,执行操作系统引导程序,跳至相应的地址,然后执行那个地址上的指令来改变这条跳转指令的跳转地址供从核1使用。
3.从核1执行玩指向ROM的空指令进入RAM,执行操作系统引导程序,执行已经被主核0改变了的跳转指令,跳入一个与主核0不同的地址,然后执行那个地址上的指令再次改变这条跳转指令的跳转地址供从核2使用。
4.从核2执行玩指向ROM的空指令进入RAM,执行操作系统引导程序,执行已经被从核1改变了的跳转指令,跳入一个与从核1不同的地址,然后执行那个地址上的指令再次改变这条跳转指令的跳转地址供从核3使用。
5.从核3执行玩指向ROM的空指令进入RAM,执行操作系统引导程序,执行已经被从核2改变了的跳转指令,跳入一个与从核2不同的地址。
至此,四个核已经分别指向不同的地址,可以同时执行不同的指令了。
dragonzht 2010-05-09
  • 打赏
  • 举报
回复
四核CPU相当于四个单核CPU合在一起,四个核各有完整的一套寄存器。应用程序在哪个核上运行?这是操作系统指定的,普通程序员没法干预。写应用程序时,像在单核CPU上一样使用寄存器就行了。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧