Ucore------Lab1_Practice6

完善中断初始化和处理

请完成编码工作和回答如下问题:

  1. 中断描述符表(也可简称为保护模式下的中断向量表)中一个表项占多少字节?其中哪几位代表中断处理代码的入口?

表项的结构定义: 在这里插入图片描述
+ 一个表项占8个字节。
+ 哪几位代表中断处理代码的入口:16:32的段选择字加上0~ :15 和 48:63构成终端代码的处理代码的入口。

  1. 请编程完善 kern/trap/trap.c 中对中断向量表进行初始化的函数 idt_init。在 idt_init 函数中,依次对所有中断入口进行初始化。使用 mmu.h 中的 SETGATE 宏,填充 idt 数组内容。每个中断的入口由 tools/vectors.c 生成,使用 trap.c 中声明的 vectors 数组即可.

1) Ucore启动后,通过idt_init函数初始化IDT表,IDT表的每个元素均为門描述符,记录一个中断向量对应的中断处理函数的段选择子、偏移量和属性(门类型、DPL等),所以初始化IDT表就是初始化每个中断向量的这些属性。

2) 除了系统调用(T_SYSCALL)的门类型为陷阱門、DPL=3(用户级权限)以外,其它终端的门类型均为中断門、DPL=0(内核级权限,即仅能够使用int 0x30指令)。

3) vectors中存储了中断处理程序的入口程序和入口地址,即该数组中第i个元素对应第i个中断向量的中断处理函数地址。vectors定义在vector.S文件中,通过一个工具程序vector.c生成。而且由vector.S文件开头可知,中断处理函数属于.text的内容。因此,中断处理函数的段选择子即.text的段选择子GD_KTEXT。从kern/mm/pmm.c可知.text的段基址为0,因此中断处理函数地址的偏移量等于其地址本身。

4) 使用mmu.h中的SETGATE宏来填充idt数组的内容,传递的参数有向量的首地址、門的类型、是否为系统调用、段选择子、偏移地址和DPL。

5) 完成IDT表的初始化之后,还需执行’LIDT’命令将IDT表的起始地址加载到IDTR寄存器中。LIDT指令的作用:使用一个包含线性地址基址和界限的内存操作数来加载IDT。用来在OS创建IDT时设定IDT的起始地址。该指令只能在特权级0执行。

/* idt_init - initialize IDT to each of the entry points in kern/trap/vectors.S */
void idt_init(void) {
    extern uintptr_t __vectors[];  
    int i;
    /* along: how to set istrap and dpl? */
    for (i = 0; i < sizeof(idt) / sizeof(struct gatedesc); i ++) { //IDT表项的个数
     SETGATE(idt[i], 0, GD_KTEXT, __vectors[i], DPL_KERNEL);
    }
    SETGATE(idt[T_SWITCH_TOK], 0, GD_KTEXT,     
    __vectors[T_SWITCH_TOK], DPL_USER);
    lidt(&idt_pd);
}

  1. 请编程完善 trap.c 中的中断处理函数 trap,在对时钟中断进行处理的部分填写 trap 函数中处理时钟中断的部分,使操作系统每遇到 100 次时钟中断后,调用 print_ticks 子程序,向屏幕上打印一行文字”100 ticks”。
    1) Trap函数只是调用了trap_dispatch函数,而trap_dispatch函数实现了对各种中断的处理,这题只要我们完成对时钟中断的处理,也就是trap_dispatch函数中第一个case语句。

2) 可以使用kern/driver/clock.c中的全局变量ticks记录当前始终中断次数,每次发生时钟中断则将ticks加一,如果加一之后ticks==100,则调用print_ticks子函数打印相关信息,并将ticks置0.

  case IRQ_OFFSET + IRQ_TIMER:
	if (((++ticks) % TICK_NUM) == 0) {
		print_ticks();
		ticks = 0;
        }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值