当前位置:  开发笔记 > 编程语言 > 正文

设置IRQ映射

如何解决《设置IRQ映射》经验,为你挑选了1个好方法。

我正在按照几个教程和参考试图设置我的内核.我在一个没有解释它的教程中遇到了一些不熟悉的代码.这是我告诉的代码映射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);
}

代码outportb()如下,但我已经清楚地了解它的作用:

void outPortB(unsigned short port, unsigned char data)
{
    __asm__ __volatile__ ("outb %1, %0" : : "dN" (port), "a" (data));
}

我应该提一下,这是在受保护模式下的x86架构上.这个源代码工作正常,我理解它的作用,但我不明白它是如何做到的.有人可以向我解释这里发生了什么,所以如果我需要扩展这个,我会知道我在做什么吗?



1> Evan Teran..:

outb和类似的,写入硬件IO端口.基本上,与设备通信有2个主要选项.您可以将设备映射到内存或IO端口.

至于这段代码是如何工作的,我会为你评论:

ICW代表"初始化命令字"

outportb(0x20, 0x11); /* write ICW1 to PICM, we are gonna write commands to PICM */
outportb(0xA0, 0x11); /* write ICW1 to PICS, we are gonna write commands to PICS */

outportb(0x21, 0x20); /* remap PICM to 0x20 (32 decimal) */
outportb(0xA1, 0x28); /* remap PICS to 0x28 (40 decimal) */

outportb(0x21, 0x04); /* IRQ2 -> connection to slave */ 
outportb(0xA1, 0x02);

outportb(0x21, 0x01); /* write ICW4 to PICM, we are gonna write commands to PICM */
outportb(0xA1, 0x01); /* write ICW4 to PICS, we are gonna write commands to PICS */

outportb(0x21, 0x0); /* enable all IRQs on PICM */
outportb(0xA1, 0x0); /* enable all IRQs on PICS */

希望这可以帮助

欢迎来到OS开发世界:)我还建议您访问:http://forum.osdev.org/,它是一个新的业余爱好OS开发人员的宝贵资源.

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有