ucore-lab1-练习6report
練習6--完善中斷初始化和處理
1.? 中斷向量表中一個表項占多少個字節(jié)?其中哪幾位代表中斷處理代碼的入口?
答:系統(tǒng)將所有的中斷事件統(tǒng)一進行編號(0~255),這個編號稱為中斷向量。中斷向量表的一個表項占8個字節(jié),其結構如下:
?
0~15位:偏移地址的0~15位;
16~31位:段選擇子;
32~47位:屬性信息(包括DPL等);
48~63位:偏移地址的16~31位。
其中第16~32位是段選擇子,用于索引全局描述符表GDT來獲取中斷處理代碼對應的 段地址,再加上第0~15、48~63位構成的偏移地址,即可得到中斷處理代碼的入口。
?
2. 請編程完善kern/trap/trap.c中對中斷向量表進行初始化的函數(shù)idt_init。在idt_init函數(shù)中,依次對所有中斷入口進行初始化。使用mmu.h中的SETGATE宏,填充idt數(shù)組內容。每個中斷的入口由tools/vectors.c生成,使用trap.c中聲明的vectors數(shù)組即可。
答:分析如下,
1)?Ucore啟動后,通過idt_init函數(shù)初始化IDT表,IDT表的每個元素均為門描述符,記錄一個中斷向量對應的中斷處理函數(shù)的段選擇子、偏移量和屬性(門類型、DPL等),所以初始化IDT表就是初始化每個中斷向量的這些屬性。
2)?除了系統(tǒng)調用(T_SYSCALL)的門類型為陷阱門、DPL=3(用戶級權限)以外,其它終端的門類型均為中斷門、DPL=0(內核級權限,即僅能夠使用int 0x30指令)。
3)?vectors中存儲了中斷處理程序的入口程序和入口地址,即該數(shù)組中第i個元素對應第i個中斷向量的中斷處理函數(shù)地址。vectors定義在vector.S文件中,通過一個工具程序vector.c生成。而且由vector.S文件開頭可知,中斷處理函數(shù)屬于.text的內容。因此,中斷處理函數(shù)的段選擇子即.text的段選擇子GD_KTEXT。從kern/mm/pmm.c可知.text的段基址為0,因此中斷處理函數(shù)地址的偏移量等于其地址本身。
4)?使用mmu.h中的SETGATE宏來填充idt數(shù)組的內容,傳遞的參數(shù)有向量的首地址、門的類型、是否為系統(tǒng)調用、段選擇子、偏移地址和DPL。
5)?完成IDT表的初始化之后,還需執(zhí)行’LIDT’命令將IDT表的起始地址加載到IDTR寄存器中。LIDT指令的作用:使用一個包含線性地址基址和界限的內存操作數(shù)來加載IDT。用來在OS創(chuàng)建IDT時設定IDT的起始地址。該指令只能在特權級0執(zhí)行。
根據(jù)上面分析,寫出idt_init函數(shù)的源代碼:
?
?
3. 請編程完善trap.c中的中斷處理函數(shù)trap,在對時鐘中斷進行處理的部分填寫trap函數(shù)中處理時鐘中斷的部分,使操作系統(tǒng)每遇到100次時鐘中斷后,調用print_ticks子程序,向屏幕上打印一行文字”100 ticks”。
答:分析如下,
1)?Trap函數(shù)只是調用了trap_dispatch函數(shù),而trap_dispatch函數(shù)實現(xiàn)了對各種中斷的處理,這題只要我們完成對時鐘中斷的處理,也就是trap_dispatch函數(shù)中第一個case語句。
2)?可以使用kern/driver/clock.c中的全局變量ticks記錄當前始終中斷次數(shù),每次發(fā)生時鐘中斷則將ticks加一,如果加一之后ticks==100,則調用print_ticks子函數(shù)打印相關信息,并將ticks置0.
經過以上分析,寫出如下源代碼:
?
?
實現(xiàn)效果:
在lab1目錄下執(zhí)行’make qemu’,觀察到如下結果,發(fā)現(xiàn)每過1s屏幕打印一次’100 ticks’,并且按下的鍵也會在屏幕上顯示:
?
?
參考鏈接:https://www.cnblogs.com/wuhualong/p/ucore_lab1_exercise6_report.html
轉載于:https://www.cnblogs.com/FrankChen831X/p/10772472.html
總結
以上是生活随笔為你收集整理的ucore-lab1-练习6report的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dubbo提供者主配置文件applica
- 下一篇: 如何实现分享网站文章到微信朋友圈时显示指