在做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等宏定义