1.x86架构下一般有两个PIC一共16路IRQ来接收中断,相当于这16个IRQ可以映射到16个中断号上去,那对于中断号一共8bit的空间来说是不是太浪费了,而且这点中断号数能够处理所有问题吗?
2.xv6文档中描述:
Xv6 must set up the x86 hardware to do something sensible on encountering an int instruction, which causes the processor to generate a trap. The x86 allows for 256 different interrupts. Interrupts 0-31 are defined for software exceptions, like divide errors or attempts to access invalid memory addresses. Xv6 maps the 32 hardware interrupts to the range 32-63 and uses interrupt 64 as the system call interrupt.
注意到他们把32个硬件中断映射到了32个中断号。参考了代码之后发现也是两个PIC,一共16路IRQ,这是怎么做到的?是通过IOAPIC吗?但是上网查阅资料发现IOAPIC也只有24个中断引脚,还是不足32位个,这是怎么做到的?
有关xv6和haribote对于中断的处理
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
3条回答 默认 最新
关注让【道友老李】来帮你解答,本回答参考gpt编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
如果答案让您满意,请采纳、关注,非常感谢!
1. 对于x86架构下的16位IRQ映射到8位中断号上的情况,你提出的确实存在一定的浪费。事实上,x86架构允许使用更多的中断号来处理更多的中断情况,但是通常只使用了一部分。因此,尽管8位中断号可能是一种浪费,但是在实际情况下,可能并不会用尽所有的中断号。- 对于xv6文档中描述的情况,他们将32个硬件中断映射到32个中断号的做法可能是通过一些特殊的硬件来实现的。一种可能的方法是使用Advanced Programmable Interrupt Controller (APIC)来扩展中断号的数量。APIC是一个更灵活的中断控制器,它可以支持更多的中断号。另外,xv6可能也使用了其他一些技术或者软件模拟来实现这种映射。 如果想要实现在x86架构下将更多的中断号与IRQ映射,可以尝试使用APIC或者其他中断控制器,并根据具体的硬件情况进行相应的配置。下面给出一个简单的示例代码来设置IRQ到中断号的映射(仅供参考):
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/io.h> #define PIC_MASTER_COMMAND 0x20 #define PIC_SLAVE_COMMAND 0xa0 #define PIC_KEYBOARD_IRQ 1 // 举例,可以根据具体需求修改 void remap_irq() { // 重新映射IRQ outb(PIC_MASTER_COMMAND, 0x11); // 开始初始化:发送ICW1到主PIC outb(PIC_SLAVE_COMMAND, 0x11); // 开始初始化:发送ICW1到从PIC outb(PIC_MASTER_COMMAND+1, 0x20); // 设置主PIC中断号从0x20开始 outb(PIC_SLAVE_COMMAND+1, 0x28); // 设置从PIC中断号从0x28开始 outb(PIC_MASTER_COMMAND+1, 4); // 告诉主PIC有从PIC连接在IRQ2(0000 0100) outb(PIC_SLAVE_COMMAND+1, 2); // 告诉从PIC连接到主PIC的IRQ2 outb(PIC_MASTER_COMMAND+1, 0x01); outb(PIC_SLAVE_COMMAND+1, 0x01); } int main() { // 建议在操作系统内核中进行中断号的映射设置 remap_irq(); return 0; }这段代码只是一个简单的示例,实际配置中断控制器可能需要更多的细节和考虑。具体的配置可以根据具体的情况和要求进行调整。
解决 无用评论 打赏 举报