六、分割源文件和中斷處理

分割源文件:
整理makefile
bootpack.nas : bookpack.gas Makefile
     $(GAS2NASK) bootpack.gas bootpack.nas
graphic.nas : graphic.gas Makefile
     $(GAS2NASK) graphic.gas graphic.nas
dsctbl.nas : dsctbl.gas Makefile
     $(GAS2NASK) dsctbl.gas dsctbl.nas

這些重複的,可以改爲通用的
%.gas : %.c Makefile
     $(CC1) -o $*.gas $*.c
%.nas : %.gas Makefile
     $(GAS2NASK) $*.gas $*.nas


_load_gdtr:          ; void load_gdtr(int limit, int addr);
          MOV          AX,[ESP+4]          ; limit
          MOV          [ESP+6],AX
          LGDT     [ESP+6]
          RET
函數分析:這個是將指定值的段上限和地址值賦給48位的GDTR寄存器的。
_load_idtr:          ; void load_idtr(int limit, int addr);
          MOV          AX,[ESP+4]          ; limit
          MOV          [ESP+6],AX
          LIDT     [ESP+6]
          RET


下面說一下段上限
     表示一個段有多少個字節。段上限最大有4GB,也就是32位的數值,如果直接放進去,這個數值本身佔用4個字節,再加上基地址4個字節,佔滿了8個字節,因此就沒有保存段管理屬性的地方了,因此段上限只能使用20位,這樣一來。最大就只能1MB了,相當於又回到了16位的時代,很可悲,於是INTEL工程師中想了個辦法,在屬性裏面設置了一個標誌位Gbit,當Gbit設置爲1的時候,limit的單位不解釋爲字節,而是解釋爲頁。。頁大小爲4KB
     這樣一來4KB*1M = 4GB

windows下32位模式:
     CPU有系統模式和應用模式,比如說,在應用模式下調用LGDT指令,CPU則對該指令不予執行,同時會告訴操作系統,應用程序試圖執行LGDT指令,有問題需要處理!同樣的,應用程序向執行操作系統專用段的時候,CPU也會中斷執行,並且馬上向操作系統來報告。因爲如果普通應用程序在應用模式下還能執行LGDT指令的話,歹心程序員說不定會根據自己的需要寫GDT,那麼就是系統漏洞而且防不勝防啊。

CPU到底處於應用模式還是系統模式,取決於執行中的應用程序是位於訪問權0x9a的段還是0xfa的段。。。。。。


************************************************華麗的分割線*****************************************************
使用中斷前,首先需要正確初始化GDT和IDT啊,然後在初始化PIC啊,也就是可編程中斷控制器!

什麼是PIC呢?
     設計上CPU單獨只能處理一箇中斷,這不夠用,IBM的大叔們設計電腦時候,就在主板上增加了幾個輔助芯片,現如今已經集成到了芯片組中,
PIC是將8箇中斷信號集合成一箇中斷信號的裝置。PIC監視着輸入管腳的8箇中斷信號,只要有一箇中斷信號傳遞進來,就將唯一的輸出管腳信號變爲ON,並且通知CPU,後來要處理個更多中斷,只需要通過增加PIC,例如倆個PIC可以處理15箇中斷信號。
     結構如下,靠近CPU的PIC叫做主PIC,與主PIC相連的叫做從PIC,主PIC負責0到7號,從負責8-15號,

中斷髮生以後,如果CPU可以受理這個中斷,CPU就會命令PIC發送倆個字節的數據,CPU和PIC之間有根信號線用來傳遞數據的,利用in和out來傳送,比如PIC傳遞一個0xcd 0x10進CPU,在CPU看來,這和內存讀進來的程序是一樣的,所以CPU就把這個0xcd 0x10作爲機器語言執行,這裏的0xcd就是調用BIOS中斷的那個INT指令。
xx

pushad和popad就是把所有寄存器壓棧出棧


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章