考虑以下代码:
unsigned global;
while(global);
Run Code Online (Sandbox Code Playgroud)
global在由IRQ调用的函数中被修改.但是,g ++删除了"is-not-zero"测试,并将while循环转换为无限循环.
禁用编译器优化可以解决问题,但C++是否为它提供了语言结构?
我应该先分享我所知道的一切 - 那就是完全混乱.关于这个主题有几个不同的问题,所以请不要生气:).
1)为了找到ISR,CPU具有中断号.在x86机器(286/386及以上)中,有一个带有ISR的IVT; 每个4字节大小的条目.所以我们需要将中断数乘以4才能找到ISR.所以第一堆问题是 - 我完全混淆了CPU接收中断的机制.为了引发中断,首先设备应该探测IRQ - 然后是什么?中断号在"IRQ"上向CPU传输?我还读过像数据总线上设置ISR地址的设备; 什么呢?覆盖ISR的设备的概念是什么?有人可以告诉我几个CPU轮询中断的示例设备吗?它在哪里找到它们的ISR?
2)如果两个设备共享IRQ(这是非常可能的),它们之间的CPU有何不同?如果两个设备同时引发相同优先级的中断怎么办 我知道会有相同类型和低优先级中断的屏蔽 - 但这种通信是如何在CPU和设备控制器之间发生的?我研究了PIC和APIC在这个问题上的作用,但是无法理解.
谢谢阅读.非常感谢您的回答.
当Linux内核中同时发生两个中断时会发生什么?
如果该处理器具有多个CPU,则中断可以同时在不同的CPU内核上运行.
我正在按照几个教程和参考试图设置我的内核.我在一个没有解释它的教程中遇到了一些不熟悉的代码.这是我告诉的代码映射16 IRQs (0-15)到ISR位置的代码32-47:
void irq_remap(void)
{
outportb(0x20, 0x11);
outportb(0xA0, 0x11);
outportb(0x21, 0x20);
outportb(0xA1, 0x28);
outportb(0x21, 0x04);
outportb(0xA1, 0x02);
outportb(0x21, 0x01);
outportb(0xA1, 0x01);
outportb(0x21, 0x0);
outportb(0xA1, 0x0);
}
Run Code Online (Sandbox Code Playgroud)
代码outportb()如下,但我已经清楚地了解它的作用:
void outPortB(unsigned short port, unsigned char data)
{
__asm__ __volatile__ ("outb %1, %0" : : "dN" (port), "a" (data));
}
Run Code Online (Sandbox Code Playgroud)
我应该提一下,这是在受保护模式下的x86架构上.这个源代码工作正常,我理解它的作用,但我不明白它是如何做到的.有人可以向我解释这里发生了什么,所以如果我需要扩展这个,我会知道我在做什么吗?
对于共享中断线,我可以有几个中断处理程序.内核将按顺序调用该特定共享行的所有处理程序.据我所知,每个处理程序在被调用时都会通知内核它是否是要调用的正确处理程序.
我的问题是如何确定,有没有办法检查一个内存映射寄存器,告诉特定设备的状态或是否有其他硬件机制?处理程序如何知道相应的设备确实是发出中断的设备?
这些信息是通过设备和处理器中断线之间的中断控制器进行中继的吗?
什么是链式IRQ?做什么chained_irq_enter和chained_irq_exit做什么,因为在中断发生后IRQ线被禁用,但是chained_irq_enter调用与屏蔽中断有关的功能.如果该行已被禁用,为什么要屏蔽中断?
我想设置 Intel 10G NIC 使用的 RX/TX 队列数。让我解释一下原因:
我在 Dell R720 系统上使用 X520 型 Intel 10G NIC。我正在使用 ixgbe 版本 3.6.7-k。Ubuntu 3.2.0-59 中的内核。
我正在机器上 24 个内核中的 4 个内核上运行我的网络应用程序。目前 NIC 正在使用流导向器,所以我有 24 个 TX 和 RX 队列,而大多数 IRQ 最终在运行应用程序的 4 个内核上运行。
但是,我看到一些 IRQ 正在其他 20 个队列上运行(这可能是因为流导向器对大约 20% 的流量进行采样,因此一些流量通过常规 RSS)。现在我不希望在其他 20 个内核上运行任何 IRQ,因为它们正在执行不同的任务,而这些任务会被运行的 IRQ 损坏。
我尝试仅将中断的关联设置为我使用的 4 个内核,但这不适用于 flow-director。我想更好的方法是仅使用 4 个 RX/TX 队列并将它们分配给专用内核。但是我找不到在 ixgbe 驱动程序中设置 RX/TX 队列数量的方法(尽管这对于我熟悉的其他 10G 驱动程序非常简单,例如 Broadcom 的 bnx2x)。
任何的想法?
任何人都可以告诉为什么MSI中断在linux中不可共享.
基于PIN的中断可以由设备共享,但MSI中断不由设备共享,每个设备都有自己的MSI IRQ号.为什么不能共享MSI中断?
我正在尝试编写一个非常简单的内核用于学习目的.在阅读了大量有关x86架构中PIC和IRQ的文章后,我发现这IRQ1是键盘处理程序.我正在使用以下代码打印正在按下的键:
#include "port_io.h"
#define IDT_SIZE 256
#define PIC_1_CTRL 0x20
#define PIC_2_CTRL 0xA0
#define PIC_1_DATA 0x21
#define PIC_2_DATA 0xA1
void keyboard_handler();
void load_idt(void*);
struct idt_entry
{
unsigned short int offset_lowerbits;
unsigned short int selector;
unsigned char zero;
unsigned char flags;
unsigned short int offset_higherbits;
};
struct idt_pointer
{
unsigned short limit;
unsigned int base;
};
struct idt_entry idt_table[IDT_SIZE];
struct idt_pointer idt_ptr;
void load_idt_entry(char isr_number, unsigned long base, short int selector, char flags)
{
idt_table[isr_number].offset_lowerbits = base & 0xFFFF;
idt_table[isr_number].offset_higherbits …Run Code Online (Sandbox Code Playgroud) I'm writting a driver for a synthesized device in an FPGA. The device has several IRQs and have requested them on my driver:
irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
rc = request_irq(irq, &Custom_driver_handler,IRQF_TRIGGER_RISING , DRIVER_NAME, base_addr);
Run Code Online (Sandbox Code Playgroud)
My problem is that i want that the irq_handler calls a function of an user space application. Is there any way to call my user space application from the irq_handler of the driver on kernel space??
I know i could save a flag from the …