3.2 pyos 的系统初始化
下面,我们来看看 pyos 的系统初始化函数:
#include "interrupt.h"
/* 系统初始化 */
void class_pyos_System::Init()
{
/* 初始化Gdt表 */
InitGdt() ;
/* 初始化段寄存器 */
InitSegRegister() ;
/* 初始化中断 */
class_pyos_Interrupt::Init() ;
}
是的,他就是这么简单,由于InitGdt与InitSegRegister的内容在《操作系统引导探究》中已经描述过了,这里我们就专注于我们本篇的核心内容——对于中断系统的初始化。
从上面的代码中我们可以看出,系统首先在“interrupt.h”中定义了一个名为“class_pyos_Interrup”的中断类,专门来处理系统的中断部份。然后,系统调用中断类的Init()函数,来进行初始化。呵呵,我们马上就去看看这个中断类的初始化函数到底做了些什么:
/* 初始化中断服务 */
void class_pyos_Interrupt::Init()
{
/* 初始化中断可编程控件器 8259A */
Init8259A() ;
/* 初始化中断向量表 */
InitInterruptTable() ;
/* 许可键盘中断 */
class_pyos_System::ToPort( 0x21 , 0xfd ) ;
/* 汇编指令,开中断 */
__asm__( "sti" ) ;
}
我想,对于这样自说明式的代码,解释是多余的,我们还是抓紧时间来看看它首先是怎样初始化 8259A 的吧:
/* 初始化中断控制器 8259A */
void class_pyos_Interrupt::Init8259A()
{
// 给中断寄存器编程
// 发送 ICW1 : 使用 ICW4,级联工作
class_pyos_System::ToPort( 0x20 , 0x11 ) ;
class_pyos_System::ToPort( 0xa0 , 0x11 ) ;
// 发送 ICW2,中断起始号从 0x20 开始(第一片)及 0x28开始(第二片)
class_pyos_System::ToPort( 0x21 , 0x20 ) ;
class_pyos_System::ToPort( 0xa1 , 0x28 ) ;
// 发送 ICW3
class_pyos_System::ToPort( 0x21 , 0x4 ) ;
class_pyos_System::ToPort( 0xa1 , 0x2 ) ;
// 发送 ICW4
class_pyos_System::ToPort( 0x21 , 0x1 ) ;
class_pyos_System::ToPort( 0xa1 , 0x1 ) ;
// 设置中断屏蔽位 OCW1 ,屏蔽所有中断请求
class_pyos_System::ToPort( 0x21 , 0xff ) ;
class_pyos_System::ToPort( 0xa1 , 0xff ) ;
}
从上面的代码可以看出程序是通过向 8259A 发送4个ICW对8259A进行初始化的。其中ToPort是class_pyos_System类中定义的一个成员函数,它的声明如下:
/* 写端口 */
void class_pyos_System::ToPort( unsigned short port , unsigned char data )
OK,好像又不需要我多解释了,当然,你也许会问,为什么会发送这几个值的数据,而不是其它值的数据。对于这个问题,因为在“上篇”中已经详细描述了,这里就不再浪费大家的时间了。:)