⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 traps.c

📁 一个用于学习的操作系统
💻 C
字号:
/*文件名: traps.c
  说明:   异常处理程序
  作者:   marsinfan
  日期:   2005/12/20
*/

#include <fairysky/types.h>
#include <fairysky/defs.h>
#include <fairysky/kernel.h>
#include <fairysky/scheduler.h>
#include <asm/io.h>
#include <asm/segment.h>
#include <asm/memory.h>

extern int panic(const char *s);

#ifdef WINDOWS_CYGWIN
void exc_handler(u32 exc_no, u32 cs, u32 ip, u32 error)
#else
void _exc_handler(u32 exc_no, u32 cs, u32 ip, u32 error)
#endif
{
    printk("at address  : %04XH:%08XH\n", cs, ip);
    printk("exception no: %02XH\n", exc_no);

    switch (exc_no) {
    case 0X00:
    case 0X01:
    case 0X02:
    case 0X03:
    case 0X04:
    case 0X05:
    case 0X06:
    case 0X07:
    case 0X08:
    case 0X09:
    case 0X0A:
    case 0X0B:
    case 0X0C:
    case 0X0D:
        while (1)      ;
        break;
    case 0X0E:
        printk("error: %02XH, cr2: %02XH\n", error, get_cr2());
        if (error & 1) {   //页已经写保护了,取消页写保护
            do_wp_page(get_cr2());
        } else {           //页还没有映射
            do_no_page(get_cr2());
        }
        break;
    case 0X0F:
        while (1)      ;
        break;
    default:
        while (1)      ;
    }
    /*if (exc_has_error[exc_no]) {
        printk ("error code  : %04XH [ Index:%04XH, Type:%d ]\n",
        error, error >> 3, error & 7);
     }
    printk ("TR: %04XH\n", tr);
    */

}

//时钟中断处理函数
#ifdef WINDOWS_CYGWIN
#define TIMER_HANDLER timer_handler
#else
#define TIMER_HANDLER _timer_handler
#endif
void TIMER_HANDLER(int dpl)
{
    ++jiffies;


    if (3 == dpl) {                     //对进程进行计时
        current->user_time++;           //用户态的执行时间
    } else {
        current->system_time++;         //内核态的执行时间
    }

    spring_timer();                     //触发定时器

    outb_p(EOI, PORT_8259M);

    if ((--current->counter) <= 0) {    //如果时间片被用完则需要进行调度
        current->counter = 0;
        need_resched = 1;
    } else {                            //如果时间片没有用完则继续执行
        return;
    }

    if (dpl == 3) {                     //如果进程在用户态下被中断
        scheduler();                    //进行调度
    }
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -