Xv6内核分析(三.6)

gewenbin
gewenbin
gewenbin
188
文章
15
评论
2020年12月20日16:14:23 评论 386

main函数之ioapicinit

1. ioapic概述

ioapic的基础知识可见下面这篇博客: https://blog.csdn.net/borisjineman/article/details/51050049。

ioapic的具体描述可以参见82093数据手册,其中关于寄存器的描述如下:

Xv6内核分析(三.6)

其中00h寄存器用于选择具体的寄存器,10h寄存器用于传输要读取或者写入的数据。

Xv6内核分析(三.6)

2. ioapicinit函数

2.1 ioapicread和ioapicwrite

Xv6内核分析(三.6)

IOAPIC的定义如下:

Xv6内核分析(三.6)

IOAPIC寄存器空间一般默认被映射到0xFEC00000起始的空间中。

ioapicread和ioapicwrite:

Xv6内核分析(三.6)

这两个函数还是很简单的,就是通过index寄存器和数据寄存器进行操作。

2.2 获取重定位入口数量

读取REG_VER以获得重定位入口的数量,REG_VER寄存器的描述如下:

Xv6内核分析(三.6)

2.3 获取当前ioapic的id

读取REG_ID寄存器获得当前ioapic的id:

Xv6内核分析(三.6)

然后对此id进行校验,ioapicid这个变量是在mpinit函数中进行初始化的。

2.4 I/O REDIRECTION TABLE

每个ioapic共有24个I/O REDIRECTION TABLE,每个table是8个字节:

Xv6内核分析(三.6)

每个table的具体描述如下:

Xv6内核分析(三.6)

Xv6内核分析(三.6)

Xv6内核分析(三.6)

其中vector位域用于设置这个table对应的中断向量号。

Interrupt Mask位域用于设置是否使能对应的中断。

由代码里可知,所有中断被设置为边沿触发,默认被禁止,中断号从32开始递增。Destination Field位域设置的是目标APIC ID。

Xv6内核分析(三.6)

2.5 ioapicenable函数

Xv6内核分析(三.6)

ioapicenable函数很简单,就是根据irq设置相应的I/O REDIRECTION TABLE,并且设置对应中断要分发的cpu。从注释可知,似乎cpu号和其对应的apic id是一样的???

总结:由上面的分析可知,ioapicinit的工作就是初始化24个I/O REDIRECTION TABLE。

gewenbin
  • 本文由 发表于 2020年12月20日16:14:23
  • 转载请务必保留本文链接:http://www.databusworld.cn/9348.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: