我正在研究Linux内核中的驱动程序内核模块,通常通过探测函数调用request_irq()。驱动程序/net/以太网/natsemi/ one 83820.ko可以是这样的例子。
request_irq()调用request_threaded_irq(),注释中提到了这一点:
This call allocates interrupt resources and enables the
interrupt line and IRQ handling. From the point this
call is made your handler function may be invoked.
假设有一个端口映射的I/O设备,它在IRQ线路上任意生成中断。设备的挂起中断可以通过对特定寄存器的单个outb调用来清除。
此外,假设下面的中断处理程序通过request_irq分配给相关的IRQ行
irqreturn_t handler(int irq, void *data)
{
/* clear pending IRQ on device */
outb(0, CLEAR_IRQ_REGISTER_ADDR);
/* device may generate another IRQ at this point,
* but
我正在Intel Atom处理器上编写一个LinuxV3.2内核模块(x86_64,2核)。我想禁用一个特定的IRQ号,但是在Linux上这样做有困难。
我是双引导MS-DOS,通过直接与8259 PIC芯片通信,我可以很容易地禁用英特尔语法x86程序集中的中断:
CLI ; disable all interrupts
MOV DX, 0x21 ; set 8259 ioport address
IN AL, DX ; store current interrupt mask in AL
AND AL, 0xDF ; m
我有一个linux程序,它以:
terminate called after throwing an instance of 'std::bad_function_call'
遗憾的是,在调用堆栈中,我看不到坏函数是从哪里调用的。此外,在生成这个错误之前,它会做很多迭代,所以我不能真正手动调试它。
有没有办法找到有问题的代码?
我读了一些相关的文章:
(1)罗伯特·洛夫:
You cannot sleep in an interrupt handler because interrupts do not have a backing
process context, and thus there is nothing to reschedule back into. In other
words, interrupt handlers are not associated with a task, so there is nothing to
"put to sleep" and (more i