Nic*_*ynt 9 x86 kernel multicore osdev
我正在为我的内核做输入缓冲区的工作,我有一些问题.在双核机器上,我知道可以同时运行多个"进程".我不知道的是操作系统和各个程序如何保护数据中的冲突.
关于这个主题,我想知道两件事:
(1)中断发生在哪里?它们是否保证在一个核心而不是另一个核心上发生,并且可以用来确保一个核心上的实时操作不会被文件IO中断,这可以在另一个核心上处理吗?(我逻辑上假设中断会发生在第一个核心上,但总是如此,你会怎么说?或者每个核心都有自己的中断设置?这不会导致核心可以同时对同一个中断作出反应,可能以不同的方式?)
(2)双核处理器如何处理操作码内存冲突?如果一个内核正在读取内存中的地址,而另一个内核正在写入内存中同一个地址的同一时间,会发生什么?抛出异常,还是读取值?(我假设写入会以任何一种方式工作.)如果读取一个值,它是否保证在碰撞时是旧值还是新值?
我理解程序应该理想地编写以避免这些并发症,但操作系统肯定不能指望,并且需要能够处理此类事件而不会窒息.
在x86处理器中,这由APIC处理.您可以在英特尔®64 和IA-32架构软件开发人员手册中查看详细信息,特别是在第3卷,第9 章和x2APIC规范中.
如果您不想了解所有细节,我将简要介绍一下.
中断可以来自三个不同的来源:
每个逻辑处理器(SMT系统中的线程,非SMT多核系统中的核心,非SMT非多核系统中的处理器)具有APIC.APIC控制逻辑处理器如何响应任何此类中断.
简而言之:
SMI和INIT引脚始终分别路由到SMI或INIT.
如果禁用APIC,则LINT0被路由到INTR,LINT1被路由到NMI,并且忽略IPI.
如果启用:
如果您需要有关启用APIC,编程LVT,设置APIC-ID和发送IPI的详细信息,您将需要查看我链接到的手册.
IA-32 参考手册将明确回答您的问题。
我的直觉是两个核心接收中断,操作系统会解决它们。每个核心上可能有一个设置寄存器,用于指定哪个核心获得哪个中断。
碰撞。没有保证。更准确地说,请研究缓存机制以及它们如何整理一致性。
对于与此相关的其他线程: