main函数之ioapicinit
1. ioapic概述
ioapic的基础知识可见下面这篇博客: https://blog.csdn.net/borisjineman/article/details/51050049。
ioapic的具体描述可以参见82093数据手册,其中关于寄存器的描述如下:
其中00h寄存器用于选择具体的寄存器,10h寄存器用于传输要读取或者写入的数据。
2. ioapicinit函数
2.1 ioapicread和ioapicwrite
IOAPIC的定义如下:
IOAPIC寄存器空间一般默认被映射到0xFEC00000起始的空间中。
ioapicread和ioapicwrite:
这两个函数还是很简单的,就是通过index寄存器和数据寄存器进行操作。
2.2 获取重定位入口数量
读取REG_VER以获得重定位入口的数量,REG_VER寄存器的描述如下:
2.3 获取当前ioapic的id
读取REG_ID寄存器获得当前ioapic的id:
然后对此id进行校验,ioapicid这个变量是在mpinit函数中进行初始化的。
2.4 I/O REDIRECTION TABLE
每个ioapic共有24个I/O REDIRECTION TABLE,每个table是8个字节:
每个table的具体描述如下:
其中vector位域用于设置这个table对应的中断向量号。
Interrupt Mask位域用于设置是否使能对应的中断。
由代码里可知,所有中断被设置为边沿触发,默认被禁止,中断号从32开始递增。Destination Field位域设置的是目标APIC ID。
2.5 ioapicenable函数
ioapicenable函数很简单,就是根据irq设置相应的I/O REDIRECTION TABLE,并且设置对应中断要分发的cpu。从注释可知,似乎cpu号和其对应的apic id是一样的???
总结:由上面的分析可知,ioapicinit的工作就是初始化24个I/O REDIRECTION TABLE。
评论