关于idt_init()中的SETGATE宏的疑问
匿名2023/07/31 19:50:27提问
    lab1lecture4student
334

在做lab1 练习6时,有几点疑问

1.为何extern uintptr_t __vectors[] 可以识别到在汇编文件vectors.S中定义的数组?

2.SETGATE的宏定义为 SETGATE(gate, istrap, sel, off, dpl) 

   为什么第三个参数填GD_KTEXT 就表示GDT的段选择子呢?

   GD_KTEXT这个宏的值是如何确定的?为何是8?

   为何__vectors[i]数组里的内容就是 中断服务程序的偏移地址OFFSET?

3. SETGATE(idt[T_SWITCH_TOK], 0, GD_KTEXT, __vectors[T_SWITCH_TOK], DPL_USER); 

    这个是必须的吗?没写怎么也能输出正确结果,不写的话对以后的实验会有影响吗?

4.struct gatedesc{} 该结构体有何用处? 结构体数组idt如何被调用?

(虽然已经知道 中断发生后,会根据中断号查询IDT,但是在代码中如何体现? 中断号-->IDT-->GDT-->基址+OFFSET=ISR入口地址 找到入口地址之前的函数具体如何调用的能否讲解?)

5.idt的起始地址为何是这样定义?

struct pseudodesc idt_pd = {
    sizeof(idt) - 1, (uintptr_t)idt
};

6.有时候流程理解了,但是代码中有很多数据结构不知道为什么是这么定义的,怎么办?

比如说上面提到的gatedesc 以及memlayout.h中的global segment numbers ,global descriptor numbers等宏定义

回答(1
    推荐问答
      Simple Empty
      暂无数据