2
2. 计算机开始运行阶段就有中断吗?XV6 的中断管理是如何初始化的?XV6
是如何实现内核态到用户态的转变的?XV6 的硬件中断是如何开关的?实
际的计算机里,中断有哪几位?
BIOS 支持中断
在计算机启动时,执行存放在非易失存储器中的 BIOS。BIOS 作为一个小型操作系统,
为了初始化硬件设备,可能设置了自己的中断处理程序,所以计算机在开始运行阶段便存在
BIOS 支持的中断。
XV6
中断管理初始化
XV6 的中断管理初始化主要包括以下步骤:
1) 计算机启动时运行 BIOS,BIOS 中存在一些自身支持的中断。
2) BIOS 将控制权交给从引导扇区加载的代码,即 bootloader(包含 bootasm.S 和
bootmain.c)。进入 bootasm.S 后第一条执行的指令便是屏蔽中断(如图 2 所 示 ),
原因是:当前 BIOS 已经失去了控制权,并且此时操作系统还未定义各种中断和初
始化中断处理程序,故无法响应各种中断事件。
图
2 bootasm.S
关中断操作
3) bootasm.S 调用 bootmain.c 中的 bootmain()方法,从磁盘第二个扇区开头读入内核
程 序( entry.S),之后跳转到 main.c 的 main()方法,main()中调用了各种系统初始化
方法。
4) 如图 3 所示,main()方法中与中断管理初始化相关的方法及其作用如下(具体逻辑
将在“源代码阅读”部分提及):
lapicinit():初始化局部高级可编程中断控制器(Local APIC)。
picinit():禁用 8259A 中断控制器。
ioapicinit():初始化全局高级可编程中断控制器(I/O APIC)。
consoleinit():初始化控制台相关中断。
uartinit():设置通用异步接收器/发送器(UART)中断。
tvinit():初始化中断描述符表(IDT)。
mpmain():将 IDT 基址写入描述符表寄存器(IDTR),开启中断。
start_others():主 CPU 通过初始化号的 Local APIC 发送中断信号使其他 CPU
开始初始化操作,其中包括各自中断管理的初始化。
评论0