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

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 发送4ICW8259A进行初始化的。其中ToPortclass_pyos_System类中定义的一个成员函数,它的声明如下:

/* 写端口 */

void class_pyos_System::ToPort( unsigned short port , unsigned char data )

OK,好像又不需要我多解释了,当然,你也许会问,为什么会发送这几个值的数据,而不是其它值的数据。对于这个问题,因为在“上篇”中已经详细描述了,这里就不再浪费大家的时间了。:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值