在linux内核的控制流程中,发现控件移动到具有中断位置的IDT(例如:0x80系统调用).然后控制移动到适当的系统调用.另请阅读IDT仅在引导时初始化.
我想更多地了解来自真实内核的IDT信息,例如它的位置.还想知道,在其他任何时候它被修改了吗?
请帮忙.
linux interrupt system-calls linux-kernel interrupt-handling
当我们使用irq_set_chained_handler时,当我们为关联的处理程序提供服务时,irq行不会被禁用,就像request_irq一样.
irq linux-device-driver linux-kernel interrupt-handling embedded-linux
我有两个设备通过串行端口相互连接。一个作为主人,另一个作为奴隶。
主设备是一个基于 ARM 的套件,运行 Linux。
目前的情况是master发送命令然后轮询com端口直到slave回复。
现在我不想使用轮询。我需要处理器执行其他任务,直到从机回复。
我知道解决方案是使用中断,但找不到更多详细信息。我找到了一些使用信号的解决方案。它以非阻塞模式读取 tty,然后在数据准备好时发送 io 信号。
那么,串行通信中中断和信号有什么区别呢?当使用中断时我应该编写设备驱动程序或内核模块等吗?为了不使用轮询,还有其他有效的解决方案吗?
我正在阅读英特尔手册 3A 第 6 章中断和异常处理。
\n\n中断和异常分别有3个来源。
\n\n对于软件生成的中断,它说:
\n\n\n\n\nINT n 指令允许通过提供中断向量号作为操作数从软件内部生成中断。例如,INT 35 指令强制隐式调用中断 35 的中断处理程序。从 0 到 255 的任何中断向量都可以用作该指令中的参数。然而,如果使用处理器 xe2x80x99 预定义的 NMI 向量,则处理器的响应将与以正常方式生成的 NMI 中断的响应不同。如果在此指令中使用向量号 2(NMI\n 向量),则会调用 NMI 中断处理程序,但不会激活处理器\xe2\x80\x99s NMI 处理硬件。\n 软件中生成的中断INT n 指令不能被 EFLAGS 寄存器中的 IF 标志屏蔽。
\n
对于软件生成的异常,它说:
\n\n\n\n\nINTO、INT 3 和 BOUND 指令允许在软件中生成异常。这些指令允许在指令流中的点处执行异常条件检查。例如,INT 3 会导致生成断点异常。INT\nn指令可用于模拟软件中的异常;但有一个限制。如果 INT n 为架构定义的异常之一提供向量,则处理器会生成正确向量的中断(以访问异常处理程序),但不会将错误代码推送到堆栈上。即使相关的硬件生成的异常通常会产生错误代码,情况也是如此。在处理异常时,异常处理程序仍会尝试从堆栈中弹出错误代码。由于没有推送错误代码,处理程序将弹出并丢弃 EIP(代替丢失的错误代码)。这会将返回值发送到错误的位置。
\n
那么,有什么区别呢?似乎都利用了int n指令。如何判断一段汇编代码中是否产生异常或中断?
我有一个具有以下配置的系统;
当 SOFTIRQ 1 运行时,中断 B 出现,然后 ISR B 启动。当 ISR B 发生 irq_exit() 时,它将调用 softirq。因此,它将调度 SOFTIRQ 2(不处理被中断的 SOFTIRQ 1)。
是正确的说法吗?
另一个问题。此时,如果 SOFTIRQ 1 禁用“bottom_half”,我们检测到下半部分被禁用并跳过 SOFTIRQ 2 的执行?提前致谢!
我读过OSDev Wiki的一篇文章,而不是IRQ#1匹配键盘.但PIC如何知道键盘是键盘,那么它应该映射到IRQ#1?
hardware assembly operating-system interrupt interrupt-handling
当尝试在 x86 程序集中为引导加载程序编写一些例程时,我遇到了一个错误,当发生除法错误时,程序将陷入无限循环。通过调查,我发现调用 int 0 会正常通过异常处理程序,然后继续执行程序的其余部分。为 x86 编写自己的异常处理程序,发生除法错误异常时的返回地址是指令的地址,这意味着它将永远循环执行除法。这是正常行为还是 Virtualbox/我的 cpu 特有的错误?
org 0x7c00 ;put all label addresses at offset 0x7c00
xor ax, ax ;set up all segment registers
mov ds, ax
mov ax, 0x9000
mov ss, ax
mov sp, 0x1000
mov ax, 0xB800 ;video text memory starts at this address
mov es, ax
mov ah, 0x00
mov al, 0x02
int 0x10 ;go into 80x25 monochrome text
mov [0x0000], word DivideException
mov [0x0002], word 0x0000
xor di, di
xor bx, bx …Run Code Online (Sandbox Code Playgroud) 我正在用ISO C90编写代码,它禁止混合声明和代码.所以我有这样的事情:
int function(int something)
{
int foo, ret;
int bar = function_to_get_bar();
some_typedef_t foobar = get_this_guy(something);
spin_lock_irqsave(lock);
/*
Here is code that does a lot of things
*/
spin_unlock_irqrestore(lock);
return ret;
}
Run Code Online (Sandbox Code Playgroud)
问题是硬件或软件中断是否发生,它可以在哪个地方中断我的功能,它是否也可以在变量声明中发生?
为什么我问这是因为我需要这个函数不被中断打断.我想使用spin_lock_irqsave()来确保,但我想知道中断是否可以在变量声明中中断我的函数?
对于PA1和PC1的例子,是否可以从相同的EXTI线获得多个中断,它们都在EXTI1上.
因此,通过点击PA1上的按钮,LED在PB6上亮起,然后点击PC1,LED在PC0上切换.
微控制器==> STM32F091
这是我用于2个不同行的中断的代码:
//PC1
SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI1_PA;
EXTI->IMR = EXTI_IMR_MR1;
EXTI->RTSR = EXTI_RTSR_TR1;
EXTI->FTSR = EXTI_FTSR_TR1;
//PB0
SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI1_PC;
EXTI->IMR |= EXTI_IMR_MR1;
EXTI->RTSR |= EXTI_RTSR_TR1;
EXTI->FTSR |= EXTI_FTSR_TR1;
NVIC_EnableIRQ(EXTI0_1_IRQn);
NVIC_SetPriority(EXTI0_1_IRQn,0);
Run Code Online (Sandbox Code Playgroud)
中断处理程序:
void EXTI0_1_IRQHandler(void)
{
if ((EXTI->PR & EXTI_PR_PR1) == EXTI_PR_PR1) /* Check line 1 has triggered the IT */
{
EXTI->PR = EXTI_PR_PR1; /* Clear the pending bit */
GPIOC->ODR ^= 1<<0;
}
if ((EXTI->PR & EXTI_PR_PR0) == EXTI_PR_PR0) /* Check line 0 has triggered the IT …Run Code Online (Sandbox Code Playgroud) 我正在使用nrf52微控制器(CORTEX 34F)处理器.我对主循环进行了变量检查,在主循环和定时器中断程序中都进行了修改.
主循环检查变量是否为真:
执行条件代码
将变量设置为false
没有volatile关键字,代码似乎不起作用,但当我将变量设置为volatile它似乎工作,但我不相信,因为:
任何答案,请;
if true执行正文代码2.列出项目
linux-kernel ×5
interrupt ×4
c ×3
assembly ×2
linux ×2
x86 ×2
embedded ×1
exception ×1
hardware ×1
irq ×1
serial-port ×1
signals ×1
spinlock ×1
stm32 ×1
system-calls ×1
virtualbox ×1
volatile ×1
x86-16 ×1