LAB4 PARTC的中断

195 views
Skip to first unread message

Sunus Lee

unread,
Feb 6, 2011, 2:01:34 AM2/6/11
to xv6...@googlegroups.com
hi大家新年好
lab4 part的时钟中断那有个地方挺不理解的
在env_alloc之里设置EF_IF位之后

在哪里对EF_IF位做一个 保存/还原 的过程
只要一对EF_IF设置后 , 就通过不了trap函数里的那个断言
assert(!(read_eflags() & FL_IF));

究竟该怎么弄呢?

Lin Yuning

unread,
Feb 6, 2011, 2:55:45 AM2/6/11
to xv6...@googlegroups.com
在这是IDT的时候,将SETGATE的is_trap设置为0,CPU进入中断后会自动清掉FL_IF

好象是这样的,人在家手头没手册……

2011/2/6 Sunus Lee <sunu...@gmail.com>

Lin Yuning

unread,
Feb 6, 2011, 2:56:04 AM2/6/11
to xv6...@googlegroups.com
×设置×IDT的时候

2011/2/6 Lin Yuning <l2y...@gmail.com>

sunus

unread,
Feb 6, 2011, 3:02:29 AM2/6/11
to xv6...@googlegroups.com

对啊,我在SETGATE那trap参数是使用了0的。。。

Lin Yuning

unread,
Feb 6, 2011, 3:34:35 AM2/6/11
to xv6...@googlegroups.com
那应该没有问题啊?你进中断之后那个assert(!(read_eflags() & FL_IF));过不去么?

2011/2/6 sunus <sunu...@gmail.com>

sunus

unread,
Feb 6, 2011, 5:04:22 AM2/6/11
to xv6...@googlegroups.com

对 过不不去,而且在前俩个ENV那断言就失败了。在env_alloc里是直接给FL—IF位或运算置位的。

Sunus Lee

unread,
Feb 6, 2011, 5:19:58 AM2/6/11
to xv6...@googlegroups.com
env_alloc:
e->env_tf.tf_eflags |= FL_IF;

trapEntry.S
TRAPHANDLER_NOEC(irq_timer_entry,IRQ_OFFSET + IRQ_TIMER);

idt_init:
SETGATE(idt[IRQ_OFFSET + IRQ_TIMER], 0, GD_KT, irq_timer_entry, 0);

目前是这样
输出:
check_page_alloc() succeeded!
page_check() succeeded!
check_boot_pgdir() succeeded!
enabled interrupts: 1 2
             Setup timer interrupts via 8259A
enabled interrupts: 0 1 2
             unmasked timer interrupt
[00000000] new env 00001000
[00000000] new env 00001001
kernel panic at kern/trap.c:249: assertion failed: !(read_eflags() & FL_IF)
Welcome to the JOS kernel monitor!
Type 'help' for a list of commands.
K>

Sunus Lee

unread,
Feb 7, 2011, 8:20:15 AM2/7/11
to xv6...@googlegroups.com
现在过去了
我把lab3里init_idt里的各种SETGATE的trap位全部设置为0之后过了
一时不懂怎么想的就这样做了

可是为什么呢?
 96         SETGATE(idt[T_DIVIDE], 0, GD_KT, divide_entry, 0);
 97         SETGATE(idt[T_DEBUG], 0, GD_KT, debug_entry, 0);
 98         SETGATE(idt[T_NMI], 0, GD_KT, nmi_entry, 0);
 99         SETGATE(idt[T_BRKPT], 0, GD_KT, brkpt_entry, 0);
100         SETGATE(idt[T_OFLOW], 0, GD_KT, oflow_entry, 0);
101         SETGATE(idt[T_BOUND], 0, GD_KT, bound_entry, 0);
102         SETGATE(idt[T_ILLOP], 0, GD_KT, illop_entry, 0);
103         SETGATE(idt[T_DEVICE], 0, GD_KT, device_entry, 0);
104         SETGATE(idt[T_DBLFLT], 0, GD_KT, dblflt_entry, 0);
105         SETGATE(idt[T_TSS], 0, GD_KT, tts_entry, 0);
106         SETGATE(idt[T_STACK], 0, GD_KT, stack_entry, 0);
107         SETGATE(idt[T_GPFLT], 0, GD_KT, gpflt_entry, 0);
108         SETGATE(idt[T_PGFLT], 0, GD_KT, pgflt_entry, 3);
109         SETGATE(idt[T_FPERR], 0, GD_KT, fperr_entry, 0);
110         SETGATE(idt[T_ALIGN], 0, GD_KT, align_entry, 0);
111         SETGATE(idt[T_MCHK], 0, GD_KT, mchk_entry, 0);
112         SETGATE(idt[T_SIMDERR], 0, GD_KT, simderr_entry, 0);
113         SETGATE(idt[T_SYSCALL],0, GD_KT, syscall_entry, 3);
114         /* lab4 irqs */
115         SETGATE(idt[IRQ_OFFSET + IRQ_TIMER], 0, GD_KT, irq_timer_entry, 0);
116         /* lab4 irqs */
lab3的那些该都是trap啊?

Lin Yuning

unread,
Feb 7, 2011, 8:56:36 PM2/7/11
to xv6...@googlegroups.com
我是全部设置成0的,那个断言好象是全部中断都要测试的吧?

2011/2/7 Sunus Lee <sunu...@gmail.com>

Yan Hong

unread,
Feb 9, 2011, 8:27:52 AM2/9/11
to xv6...@googlegroups.com
为什么我搜不到这个assert。。。。。。

Trap与中断的区别在于转入内核态后是否自动关闭中断。JOS好像对内核态的情况做了简化,规定进入内核态之后不允许中断,所以所有的trap位都应该是0。

2011/2/6 Sunus Lee <sunu...@gmail.com>

Sunus Lee

unread,
Feb 9, 2011, 8:41:49 AM2/9/11
to xv6...@googlegroups.com
trap.c

trap函数 前几行就有

因为之前LAB3有一部分是设置成1(trap)的
现在到LAB4我又改成0(interrupt)了
蛮奇怪

Lin Yuning

unread,
Feb 10, 2011, 1:40:16 AM2/10/11
to xv6...@googlegroups.com
嗯,我也中途改来改去了好多次,具体这个is_trap到底有没有什么约定俗成之类的东西也不是很清楚……

2011/2/9 Sunus Lee <sunu...@gmail.com>

mei shaoming

unread,
Mar 6, 2011, 5:53:56 AM3/6/11
to xv6...@googlegroups.com
hi, sunus, 接你这个问题, 我现在在设置FL_IF之后, 也碰到了问题。
具体表现为, 一旦设置这个中断标志后, 就会出现pagefault, 而且
pagefault的错误地址是一个陌名的地址。很奇怪。

代码见附件。 忘指点。谢谢。
lab4-boot.tar.gz
Reply all
Reply to author
Forward
0 new messages