青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-80  評論-24  文章-0  trackbacks-0

int.s文件的核心功能是對中斷進行設置,不過這里把一些中斷處理程序也放進來,而且還把其他文件中用到的一些庫函數放到這兒,目的是為了方便,不需再在lib/目錄下重新建立asmlib.s類似的文件。由于該文件比較長,所有分兩部分解析。

 

  1 %include "asm/int.sh"
  2 
  3 extern boot_heartbeat
  4 extern pre_schedule
  5 extern validate_buffer
  6 extern sys_call_table
  7 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  8 ; 到處中斷向量表和中斷描述符表寄存器
  9 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 10 global idt
 11 global idtr
 12 
 13 global set_idt
 14 global sys_call
 15 
 16 global out_byte
 17 global in_byte
 18 global read_port
 19 global write_port
 20 global install_int_handler
 21 global uninstall_int_handler
 22 global install_sys_call_handler
 23 global enable_hwint
 24 global disable_hwint
 25 
 26 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 27 ; 處理器能夠處理的默認中斷和異常
 28 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 29 global divide_error
 30 global debug_exception
 31 global nmi
 32 global breakpoint_exception
 33 global overflow
 34 global bounds_check
 35 global inval_opcode
 36 global copr_not_available
 37 global double_fault
 38 global copr_seg_overrun
 39 global inval_tss
 40 global segment_not_present
 41 global stack_exception
 42 global general_protection
 43 global page_fault
 44 global copr_error
 45 global exception
 46 
 47 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 48 ; 可屏蔽的硬件中斷
 49 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 50 global int_clock
 51 global int_keyboard
 52 global int_serial_port2
 53 global int_serial_port1
 54 global int_lpt2
 55 global int_floppy
 56 global int_lpt1
 57 global int_rtc
 58 global int_ps_2_mouse
 59 global int_fpu_fault
 60 global int_at_win
 61 global int_default
 62 
 63 [SECTION .text]
 64 set_idt:
 65     ; 對8259A主片寫入ICW1
 66     push 0x11
 67     push MASTER_CTL_8259
 68     call out_byte
 69     add esp, 4 * 2
 70 
 71     ; 對8259A從片寫入ICW1
 72     push 0x11
 73     push SLAVE_CTL_8259
 74     call out_byte
 75     add esp, 4 * 2
 76 
 77     ; 設置8259A主片的中斷入口地址,為IRQ0_IV
 78     push IRQ0_IV
 79     push MASTER_CTL_MASK_8259
 80     call out_byte
 81     add esp, 4 * 2
 82 
 83     ; 設置8259A從片的中斷入口地址,為IRQ8_IV
 84     push IRQ8_IV
 85     push SLAVE_CTL_MASK_8259
 86     call out_byte
 87     add esp, 4 * 2
 88 
 89     ; 向8259A主片寫入ICW3,表明IR2處級聯了從片
 90     push 0x4
 91     push MASTER_CTL_MASK_8259
 92     call out_byte
 93     add esp, 4 * 2
 94 
 95     ; 向8259A從片寫入ICW3,表明從片是連接在主片的IR2處
 96     push 0x2
 97     push SLAVE_CTL_MASK_8259
 98     call out_byte
 99     add esp, 4 * 2
100 
101     ; 向8259A主片寫入ICW4
102     push 0x1
103     push MASTER_CTL_MASK_8259
104     call out_byte
105     add esp, 4 * 2
106 
107     ; 向8259A從片寫入ICW4
108     push 0x1
109     push SLAVE_CTL_MASK_8259
110     call out_byte
111     add esp, 4 * 2
112 
113     ; 屏蔽8259A主片的所有硬件中斷
114     push 0xff
115     push MASTER_CTL_MASK_8259
116     call out_byte
117     add esp, 4 * 2
118 
119     ; 屏蔽8259A從片的所有硬件中斷
120     push 0xff
121     push SLAVE_CTL_MASK_8259
122     call out_byte
123     add esp, 4 * 2
124 
125     ; 除零錯誤(內核態允許的中斷)
126     ; 指令div or idiv
127     push PRIVILEGE_KERNEL
128     push divide_error
129     push INT_GATE_386
130     push DIVIDE_IV
131     call init_idt
132     add esp, 4 * 4
133 
134     ; 調試異常(內核態允許的中斷)
135     push PRIVILEGE_KERNEL
136     push debug_exception
137     push INT_GATE_386
138     push DEBUG_IV
139     call init_idt
140     add esp, 4 * 4
141 
142     ; 非屏蔽中斷(內核態允許的中斷)
143     push PRIVILEGE_KERNEL
144     push nmi
145     push INT_GATE_386
146     push NMI_IV
147     call init_idt
148     add esp, 4 * 4
149 
150     ; 調試斷點異常(用戶態允許的中斷)
151     ; 指令int3
152     push PRIVILEGE_USER
153     push breakpoint_exception
154     push INT_GATE_386
155     push BREAKPOINT_IV
156     call init_idt
157     add esp, 4 * 4
158 
159     ; 溢出異常(用戶態允許的中斷)
160     ; 指令into
161     push PRIVILEGE_USER
162     push overflow
163     push INT_GATE_386
164     push OVERFLOW_IV
165     call init_idt
166     add esp, 4 * 4
167 
168     ; 越界錯誤(內核態允許的中斷)
169     ; linux將其設置為用戶態也允許的中斷
170     ; 指令bound
171     push PRIVILEGE_KERNEL
172     push bounds_check
173     push INT_GATE_386
174     push BOUNDS_IV
175     call init_idt
176     add esp, 4 * 4
177 
178     ; 無效操作碼錯誤(內核態允許的中斷)
179     ; 主要由ud2或無效指令引起
180     push PRIVILEGE_KERNEL
181     push inval_opcode
182     push INT_GATE_386
183     push INVAL_OP_IV
184     call init_idt
185     add esp, 4 * 4
186 
187     ; 設備不可用/無數學協處理器(內核態允許的中斷)
188     ; 浮點數或wait/fwait指令
189     push PRIVILEGE_KERNEL
190     push copr_not_available
191     push INT_GATE_386
192     push COPROC_NOT_IV
193     call init_idt
194     add esp, 4 * 4
195 
196     ; 雙重錯誤(內核態允許的中斷)
197     ; 所有能產生異常或NMI或intr的指令
198     push PRIVILEGE_KERNEL
199     push double_fault
200     push INT_GATE_386
201     push DOUBLE_FAULT_IV
202     call init_idt
203     add esp, 4 * 4
204 
205     ; 386機器不再產生此種異常
206     push PRIVILEGE_KERNEL
207     push copr_seg_overrun
208     push INT_GATE_386
209     push COPROC_SEG_IV
210     call init_idt
211     add esp, 4 * 4
212 
213     ; 無效TSS錯誤(內核態允許的中斷)
214     ; 任務切換或訪問TSS段時
215     push PRIVILEGE_KERNEL
216     push inval_tss
217     push INT_GATE_386
218     push INVAL_TSS_IV
219     call init_idt
220     add esp, 4 * 4
221 
222     ; 段不存在錯誤(內核態允許的中斷)
223     ; 加載段寄存器或訪問系統段時
224     push PRIVILEGE_KERNEL
225     push segment_not_present
226     push INT_GATE_386
227     push SEG_NOT_IV
228     call init_idt
229     add esp, 4 * 4
230 
231     ; 堆棧段錯誤(內核態允許的中斷)
232     ; 堆棧段操作或加載ss時
233     push PRIVILEGE_KERNEL
234     push stack_exception
235     push INT_GATE_386
236     push STACK_FAULT_IV
237     call init_idt
238     add esp, 4 * 4
239 
240     ; 常規保護錯誤(內核態允許的中斷)
241     ; 內存或其他保護檢驗時
242     push PRIVILEGE_KERNEL
243     push general_protection
244     push INT_GATE_386
245     push PROTECTION_IV
246     call init_idt
247     add esp, 4 * 4
248 
249     ; 頁錯誤(內核態允許的中斷)
250     ; 內存訪問時
251     push PRIVILEGE_KERNEL
252     push page_fault
253     push INT_GATE_386
254     push PAGE_FAULT_IV
255     call init_idt
256     add esp, 4 * 4
257 
258 
259     ;;;;;;;;;;;;;;;;注意這里0x0f號中斷保留,未使用
260 
261 
262     ; x87FPU浮點錯誤(內核態允許的中斷)
263     ; x87FPU浮點指令或WAIT/FWAIT指令
264     push PRIVILEGE_KERNEL
265     push copr_error
266     push INT_GATE_386
267     push COPROC_ERR_IV
268     call init_idt
269     add esp, 4 * 4


以上代碼雖然比較長,但是任務很簡單主要完成的有:
1、設置8259A,80X86架構里面內置有兩片8259A,通過設置達到如下效果:分為主8259A和從8259A,從片連接在主片的IRQ2引腳上;設置主片的IRQ0引腳(時鐘中斷)的中斷號為IRQ0_IV(0x20),從8259A的IRQ0引腳的中斷號為IRQ8_IV;然后設置默認屏蔽所有的主片和從片的中斷(這樣是為了在初始化對應的硬件的時候再打開對應中斷);
2、設置0~15號中斷向量,這些中斷向量都是Intel規定的中斷;設置中斷的核心函數是init_idt,該函數稍后會講解。

  1     ; 從0x20開始到中斷向量表尾部,統一初始化成默認的中斷處理程序
  2     mov ecx, IRQ0_IV
  3     push PRIVILEGE_KERNEL
  4     push int_default
  5     push INT_GATE_386
  6 init_rest:
  7     push ecx
  8     call init_idt
  9     pop ecx
 10     inc ecx
 11     cmp ecx, 255
 12     jna init_rest
 13     add esp, 4 * 3
 14 
 15     ; 全部中斷向量入口程序加載完成之后便加載中斷描述符表
 16     lidt [idtr] ; 加載中斷描述符表
 17     ret
 18 
 19 init_idt:
 20     mov eax, [esp + 4 * 1] ; 中斷向量號
 21     mov ebx, [esp + 4 * 2] ; 描述符類型(中斷門/調用門/陷阱門)
 22     mov ecx, [esp + 4 * 3] ; 中斷處理程序入口
 23     mov edx, [esp + 4 * 4] ; 特權級
 24     mov esi, idt
 25     shl eax, 3
 26     add esi, eax ; 中斷向量號乘以8然后加上idt基地址就能找到對用中斷向量號的idt描述符
 27     mov word [esi], cx
 28     add esi, 2
 29     mov word [esi], 0x8 ; CS段描述符
 30     add esi, 2
 31     mov byte [esi], 0x0
 32     add esi, 1
 33     shl edx, 5
 34     and bl, 0x0f
 35     or bl, 0x80
 36     or bl, dl
 37     mov byte [esi], bl
 38     add esi, 1
 39     shr ecx, 16
 40     mov word [esi], cx
 41     ret
 42     
 43 ; 在發生中斷時,eflags、cs、eip將自動被壓入棧中
 44 ; 如果有出錯碼的話,那么出錯碼緊接著繼續被壓入棧中(同樣被自動壓入棧中)
 45 ; 如果有堆棧切換,也就是說有特權級變化,那么原ss和esp將被壓入內層堆棧,之后才是eflags、cs、eip
 46 ; 從中斷或者異常中返回時必須用iretd,它與ret不同的時它會改變eflags的值
 47 divide_error:
 48     push 0xffffffff
 49     push DIVIDE_IV
 50     jmp exception
 51 
 52 debug_exception:
 53     push 0xffffffff
 54     push DEBUG_IV
 55     jmp exception
 56 
 57 nmi:
 58     push 0xffffffff
 59     push NMI_IV
 60     jmp exception
 61 
 62 breakpoint_exception:
 63     push 0xffffffff
 64     push BREAKPOINT_IV
 65     jmp exception
 66 
 67 overflow:
 68     push 0xffffffff
 69     push OVERFLOW_IV
 70     jmp exception
 71 
 72 bounds_check:
 73     push 0xffffffff
 74     push BOUNDS_IV
 75     jmp exception
 76 
 77 inval_opcode:
 78     push 0xffffffff
 79     push INVAL_OP_IV
 80     jmp exception
 81 
 82 copr_not_available:
 83     push 0xffffffff
 84     push COPROC_NOT_IV
 85     jmp exception
 86 
 87 double_fault:
 88     push DOUBLE_FAULT_IV
 89     jmp exception
 90 
 91 copr_seg_overrun:
 92     push 0xffffffff
 93     push COPROC_SEG_IV
 94     jmp exception
 95 
 96 inval_tss: ; 系統將出錯碼自動壓棧
 97     push INVAL_TSS_IV
 98     jmp exception
 99 
100 segment_not_present: ; 系統將出錯碼自動壓棧
101     push SEG_NOT_IV
102     jmp exception
103 
104 stack_exception: ; 系統將出錯碼自動壓棧
105     push STACK_FAULT_IV
106     jmp exception
107 
108 general_protection: ; 系統將出錯碼自動壓棧
109     push PROTECTION_IV
110     jmp $
111     jmp exception
112 
113 page_fault: ; 系統將出錯碼自動壓棧
114     push PAGE_FAULT_IV
115     jmp exception
116 
117 copr_error:
118     push 0xffffffff
119     push COPROC_ERR_IV
120     jmp exception
121 
122 exception:
123     add esp, 4 * 2 ; 跳過出錯碼和向量號
124     cli
125     hlt ; 我們目前不處理錯誤,只要出錯就讓機器hlt
126     ;iretd
127 


上面這段代碼主要完成的工作有:
1、初始化從0x20-0xff的所有中斷向量,使得這些中斷向量均指向默認的中斷處理函數int_default;
2、init_idt函數的實現,該函數有如下形式:void init_idt(int iv, int privil, void *fun, int descr_type); 接受的四個參數依次是中斷向量號,該中斷特權級,中斷處理函數,描述符類型(是中斷門or調用門or陷阱門);該函數通過設置對應IDT中的描述符項的屬性完成設置。
3、0x00-0x0f的中斷處理函數的實現,其實這些函數都跳轉到(不是調用,是直接跳轉)exception函數,該函數直接將系統hlt,意思是我們的系統目前不支持例如除零錯誤等的異常中斷。

posted on 2012-02-14 00:21 myjfm 閱讀(555) 評論(0)  編輯 收藏 引用 所屬分類: 操作系統
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品久久久亚洲一区 | 久久久亚洲精品一区二区三区 | 狠狠久久五月精品中文字幕| 亚洲精品久久嫩草网站秘色 | 久久中文字幕导航| 欧美午夜片在线免费观看| 麻豆久久婷婷| 国内精品久久久久久久影视蜜臀| 一区二区三区高清在线观看| 亚洲另类在线视频| 久久手机免费观看| 另类成人小视频在线| 国产精品一区二区黑丝| 亚洲精品在线视频| 99这里有精品| 欧美日韩高清在线播放| 亚洲黄色免费| 亚洲精品视频免费在线观看| 免费成人性网站| 欧美国产第二页| 1000精品久久久久久久久| 久久精品日产第一区二区| 久久精品国产久精国产爱| 国产精品午夜av在线| 亚洲一区三区电影在线观看| 亚洲欧美日韩另类精品一区二区三区| 欧美视频一区在线| 亚洲特级片在线| 翔田千里一区二区| 国产视频丨精品|在线观看| 欧美一区二区在线播放| 久久天天狠狠| 最新亚洲视频| 欧美日韩精品在线观看| 亚洲天堂网在线观看| 午夜综合激情| 影音先锋日韩资源| 欧美成人国产一区二区| 日韩一级黄色片| 午夜精品影院| 在线观看日韩www视频免费 | 国产精品每日更新在线播放网址| 亚洲综合999| 久久影院午夜论| 亚洲另类视频| 国产午夜精品美女视频明星a级| 久久久精品午夜少妇| 亚洲国产精品一区| 亚洲你懂的在线视频| 国产亚洲一区在线| 欧美成年视频| 亚洲女同性videos| 欧美va天堂| 亚洲综合色自拍一区| 国语自产精品视频在线看| 欧美www视频| 亚洲综合视频一区| 欧美激情亚洲精品| 欧美在线关看| 亚洲精品国久久99热| 国产精品人人爽人人做我的可爱| 久久嫩草精品久久久精品一| 亚洲毛片在线看| 久久一区激情| 午夜久久影院| 99综合电影在线视频| 国产一区二区三区网站| 欧美日韩视频在线第一区| 欧美伊人久久久久久午夜久久久久| 亚洲国产一区在线观看| 欧美一区二区性| 在线一区二区三区四区五区| 在线国产欧美| 国产精品综合久久久| 欧美人在线观看| 久久久久久夜| 香蕉亚洲视频| 亚洲视频国产视频| 亚洲国产精品一区二区尤物区| 久久久精品999| 亚洲免费人成在线视频观看| 亚洲精品一二三| 激情久久一区| 国产综合18久久久久久| 国产精品久久久久一区| 欧美日本一道本| 欧美二区在线观看| 久久综合国产精品| 久久国产一区二区三区| 亚洲男同1069视频| 亚洲无限av看| 一区二区三区色| 日韩午夜剧场| 91久久黄色| 亚洲二区三区四区| 欧美电影免费观看大全| 久热这里只精品99re8久| 久久九九久精品国产免费直播| 性欧美激情精品| 午夜激情综合网| 午夜精品久久久久久| 亚洲女同精品视频| 亚洲主播在线| 欧美一区二区免费视频| 香蕉久久一区二区不卡无毒影院| 午夜精品视频一区| 欧美一区二区三区四区在线| 午夜精品久久久久久久99热浪潮| 亚洲自拍另类| 欧美在线一级va免费观看| 欧美一区二区三区免费看 | 欧美国产日韩免费| 欧美韩日一区| 亚洲人成网站影音先锋播放| 91久久久国产精品| 99视频热这里只有精品免费| 99这里只有久久精品视频| 一区二区三区视频免费在线观看| 中文欧美日韩| 久久福利资源站| 狂野欧美一区| 欧美日韩黄色一区二区| 国产精品男人爽免费视频1| 国产伦一区二区三区色一情| 狠狠色狠狠色综合日日91app| 亚洲大片在线观看| 日韩视频亚洲视频| 亚洲欧美日韩在线高清直播| 久久精品99国产精品| 你懂的国产精品永久在线| 91久久精品日日躁夜夜躁国产| 99精品欧美| 欧美在线黄色| 欧美激情综合亚洲一二区 | 在线观看亚洲a| 99精品国产一区二区青青牛奶| 亚洲女人天堂av| 蜜臀a∨国产成人精品| 亚洲久久视频| 午夜一级在线看亚洲| 欧美大色视频| 国产欧美亚洲一区| 亚洲人成亚洲人成在线观看图片| 午夜精品影院| 亚洲激情小视频| 亚洲欧美日韩在线观看a三区| 牛牛影视久久网| 国产精品亚洲激情| 亚洲精品乱码久久久久久久久| 欧美一区二区三区精品| 亚洲国产成人一区| 欧美一区二区三区视频在线观看| 欧美激情区在线播放| 国产日韩欧美91| 中文亚洲欧美| 欧美激情视频在线播放 | 亚洲三级视频在线观看| 欧美一区二区在线播放| 亚洲美女在线国产| 久久青青草原一区二区| 国产精品免费看| 亚洲老板91色精品久久| 免费黄网站欧美| 亚洲欧美日韩在线观看a三区 | 欧美伦理视频网站| 一区二区自拍| 欧美一区二区三区视频在线观看| 亚洲黑丝一区二区| 久久久久久午夜| 国内精品久久久久久久果冻传媒| 亚洲欧美日韩中文在线制服| 亚洲福利视频专区| 久久乐国产精品| 国产亚洲电影| 欧美在线综合视频| 亚洲一区在线看| 欧美系列精品| 亚洲一区二区免费在线| 亚洲精品综合久久中文字幕| 蜜桃av噜噜一区| 亚洲激情在线观看| 农村妇女精品| 噜噜噜噜噜久久久久久91| 国产一区二区精品久久99| 欧美一区视频| 欧美亚洲视频一区二区| 国产欧美精品一区| 性色av一区二区三区在线观看| 亚洲午夜国产成人av电影男同| 欧美日韩国产综合一区二区| av成人免费在线| av成人黄色| 国产精品成人播放| 欧美亚洲视频在线看网址| 亚洲一区美女视频在线观看免费| 国产喷白浆一区二区三区| 久久精品亚洲| 久久亚洲精选| 亚洲免费大片| 一区二区三区 在线观看视|