• 【实现】外设的相关中断初始化

    【实现】外设的相关中断初始化

    串口的初始化函数serial_init(位于/kern/driver/console.c)中涉及中断初始化工作的很简单:

    1. ......
    2. // 使能串口1接收字符后产生中断
    3. outb(COM1 + COM_IER, COM_IER_RDI);
    4. ......
    5. // 通过中断控制器使能串口1中断
    6. pic_enable(IRQ_COM1);

    键盘的初始化函数kbd_init(位于kern/driver/console.c中)完成了对键盘的中断初始化工作,具体操作更加简单:

    1. ......
    2. // 通过中断控制器使能键盘输入中断
    3. pic_enable(IRQ_KBD);

    时钟是一种有着特殊作用的外设,其作用并不仅仅是计时。在后续章节中将讲到,正是由于有了规律的时钟中断,才使得无论当前CPU运行在哪里,操作系统都可以在预先确定的时间点上获得CPU控制权。这样当一个应用程序运行了一定时间后,操作系统会通过时钟中断获得CPU控制权,并可把CPU资源让给更需要CPU的其他应用程序。时钟的初始化函数clock_init(位于kern/driver/clock.c中)完成了对时钟控制器8253的初始化:

    1. ......
    2. //设置时钟每秒中断100次
    3. outb(IO_TIMER1, TIMER_DIV(100) % 256);
    4. outb(IO_TIMER1, TIMER_DIV(100) / 256);
    5. // 通过中断控制器使能时钟中断
    6. pic_enable(IRQ_TIMER);