您的位置:首页 > 编程语言

保护模式下8259A芯片编程及中断处理探究(下)【2】

2013-04-25 15:08 288 查看
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,好像又不需要我多解释了,当然,你也许会问,为什么会发送这几个值的数据,而不是其它值的数据。对于这个问题,因为在“上篇”中已经详细描述了,这里就不再浪费大家的时间了。:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: