📄 traps.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 + -