相关疑难解决方法(0)

设置IRQ映射

我正在按照几个教程和参考试图设置我的内核.我在一个没有解释它的教程中遇到了一些不熟悉的代码.这是我告诉的代码映射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架构上.这个源代码工作正常,我理解它的作用,但我不明白它是如何做到的.有人可以向我解释这里发生了什么,所以如果我需要扩展这个,我会知道我在做什么吗?

x86 assembly kernel irq osdev

9
推荐指数
1
解决办法
3130
查看次数

被抢占的中断处理程序会发生什么?

即使在一些写得很好的内核书籍中,我也无法找到以下问题的正确答案:

  1. 他们说ISR无法入睡,因为它不能重新安排ISR,因为它没有与任何进程相连,所以当更高优先级的中断抢占执行进程时会发生什么呢?中断的ISR不会再次重新安排(执行)?如果是的话,谁将做这项工作?

  2. 很多时候我们会禁用中断(例如:1.在关键区域2.当执行快速中断时,它会禁用当前处理器中的所有中断),那么当中断被禁用时发生的中断会发生什么?他们被简单地丢弃了?或将被存储在某处以供以后执行?如果是,在哪里以及如何?

  3. 当ISR执行时,它将禁用当前IRQ线中的中断以避免重入(防止同一线路上的另一个ISR被执行),但为什么呢?如果ISR是可重入的,那该怎么办?

*ISR =中断服务程序

*他们= Book的作者

kernel interrupt linux-device-driver linux-kernel interrupt-handling

6
推荐指数
1
解决办法
2992
查看次数