我正在为我的内核做输入缓冲区的工作,我有一些问题.在双核机器上,我知道可以同时运行多个"进程".我不知道的是操作系统和各个程序如何保护数据中的冲突.
关于这个主题,我想知道两件事:
(1)中断发生在哪里?它们是否保证在一个核心而不是另一个核心上发生,并且可以用来确保一个核心上的实时操作不会被文件IO中断,这可以在另一个核心上处理吗?(我逻辑上假设中断会发生在第一个核心上,但总是如此,你会怎么说?或者每个核心都有自己的中断设置?这不会导致核心可以同时对同一个中断作出反应,可能以不同的方式?)
(2)双核处理器如何处理操作码内存冲突?如果一个内核正在读取内存中的地址,而另一个内核正在写入内存中同一个地址的同一时间,会发生什么?抛出异常,还是读取值?(我假设写入会以任何一种方式工作.)如果读取一个值,它是否保证在碰撞时是旧值还是新值?
我理解程序应该理想地编写以避免这些并发症,但操作系统肯定不能指望,并且需要能够处理此类事件而不会窒息.
在x86处理器中,这由APIC处理.您可以在英特尔®64 和IA-32架构软件开发人员手册中查看详细信息,特别是在第3卷,第9 章和x2APIC规范中.
如果您不想了解所有细节,我将简要介绍一下.
中断可以来自三个不同的来源:
外部引脚(在Intel处理器中,直到Core i7,你有LINT0,LINT1,SMI,INIT.我不知道它们在Core i7或AMD或Via处理器中被称为什么).
公交交易.这是一个线程向现代系统中的另一个线程发送中断的主要方式.它们被称为IPI - I nter- P rocessor I nterrupts.
内部事件,例如热中断,事件监视器或内部错误.
每个逻辑处理器(SMT系统中的线程,非SMT多核系统中的核心,非SMT非多核系统中的处理器)具有APIC.APIC控制逻辑处理器如何响应任何此类中断.
简而言之:
SMI和INIT引脚始终分别路由到SMI或INIT.
如果禁用APIC,则LINT0被路由到INTR,LINT1被路由到NMI,并且忽略IPI.
如果启用:
LINT0,LINT1,热事件,事件监控和错误都有在LVT(条目大号 ogical V埃克特牛逼指定如果它屏蔽或不能),如果没有,什么类型的中断将是.
IPI得到处理.IPI包括中断类型(即INTR,SMI,NMI,INIT,SIPI)和目的地.每个逻辑处理器都有一个APIC-ID,即.如果IPI的目的地与其ID匹配,则它处理中断.否则它会忽略它.
如果您需要有关启用APIC,编程LVT,设置APIC-ID和发送IPI的详细信息,您将需要查看我链接到的手册.