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

隨筆-80  評論-24  文章-0  trackbacks-0
上一篇日志主要講解了對8259A以及中斷向量表的初始化。
下面的程序主要是時鐘中斷、硬盤中斷以及系統(tǒng)調(diào)用入口函數(shù)的實現(xiàn)。

  1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2 ; 每個進程的內(nèi)核態(tài)堆棧頂部棧幀應(yīng)該是這樣的
  3 ; ss
  4 ; esp
  5 ; eflags
  6 ; cs
  7 ; eip
  8 ; eax
  9 ; ecx
 10 ; edx
 11 ; ebx
 12 ; ebp
 13 ; esi
 14 ; edi
 15 ; ds
 16 ; es
 17 ; fs
 18 ; gs
 19 ; 其中ss、esp、eflags、cs、eip是在發(fā)生中斷時CPU自動壓棧的
 20 ; 而其他的是由中斷程序壓棧的,這個順序不能改變,否則后果自負
 21 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 22 
 23 CS_OFFSET    equ 0x30
 24 ESP_OFFSET    equ 0x38
 25 SS_OFFSET    equ 0x3c
 26 
 27 ; 一個宏,因為所有的irq中斷函數(shù)都是先保存現(xiàn)場并將數(shù)據(jù)段等堆棧段
 28 ; 切換到內(nèi)核態(tài),因此,該操作所有的irq中斷入口函數(shù)均相同
 29 ; 故寫成宏節(jié)省空間^_!
 30 %macro save_all 0
 31     push eax
 32     push ecx
 33     push edx
 34     push ebx
 35     push ebp
 36     push esi
 37     push edi
 38     push ds
 39     push es
 40     push fs
 41     push gs
 42     mov si, ss
 43     mov ds, si
 44     mov es, si
 45     mov gs, si
 46     mov fs, si
 47 %endmacro
 48 
 49 ; 一個宏,恢復(fù)現(xiàn)場
 50 %macro recover_all 0
 51     pop gs
 52     pop fs
 53     pop es
 54     pop ds
 55     pop edi
 56     pop esi
 57     pop ebp
 58     pop ebx
 59     pop edx
 60     pop ecx
 61     pop eax
 62 %endmacro
 63 
 64 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 65 ; 時鐘中斷處理程序
 66 ; 這是整個系統(tǒng)中最要求“速度快”的程序,因為時鐘中斷沒隔1/HZ(s)
 67 ; 就發(fā)生一次,大概它是整個系統(tǒng)調(diào)用最頻繁的函數(shù),所以需要該函數(shù)
 68 ; 盡量短,沒有必要的函數(shù)調(diào)用盡量避免。
 69 ; 另外判斷中斷重入minix和linux采取的方法也是不一樣的,minix采用
 70 ; 一個全局變量,類似于信號量的概念;而linux的方法則比較簡單,它
 71 ; 直接獲取存儲在內(nèi)核堆棧中的cs段寄存器的RPL值來判斷被中斷的程序
 72 ; 是內(nèi)核態(tài)程序的還是用戶態(tài)的進程;我們打算采用linux的辦法,雖然
 73 ; minix方法更酷,但是linux的顯然更加簡單:)
 74 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 75 int_clock:
 76     save_all
 77     ; 增加心跳數(shù)
 78     inc dword [boot_heartbeat]
 79 
 80     ; 發(fā)送EOI指令結(jié)束本次中斷
 81     mov ax, 0x20
 82     out 0x20, al
 83     sti
 84     
 85     mov eax, [esp + CS_OFFSET]
 86     and eax, 0x03
 87     cmp eax, 0x0 ; 如果CS段寄存器的RPL為0,則說明是由內(nèi)核態(tài)進入時鐘中斷,則是中斷重入
 88     je return
 89     call pre_schedule
 90 return:
 91     recover_all
 92     iretd
 93 
 94 int_keyboard:
 95     save_all
 96 
 97     recover_all
 98     iretd
 99 
100 int_serial_port2:
101     save_all
102 
103     recover_all
104     iretd
105 
106 int_serial_port1:
107     save_all
108 
109     recover_all
110     iretd
111 
112 int_lpt2:
113     save_all
114 
115     recover_all
116     iretd
117 
118 int_floppy:
119     save_all
120 
121     recover_all
122     iretd
123 
124 int_lpt1:
125     save_all
126 
127     recover_all
128     iretd
129 
130 int_rtc:
131     save_all
132 
133     recover_all
134     iretd
135 
136 int_ps_2_mouse:
137     save_all
138 
139     recover_all
140     iretd
141 
142 int_fpu_fault:
143     save_all
144 
145     recover_all
146     iretd
147 
148 ;硬盤中斷處理程序
149 int_at_win:
150     save_all
151 
152     mov byte [gs:0xb8006], 'e'; 試驗硬盤中斷是否成功:)
153 
154     ; 發(fā)送EOI指令給從8259A結(jié)束本次中斷
155     mov ax, 0x20
156     out 0xa0, al
157     nop
158     nop
159     ; 發(fā)送EOI指令給主8259A結(jié)束本次中斷
160     out 0x20, al
161     nop
162     nop
163 
164     ; 調(diào)用該函數(shù)使buf_info緩沖區(qū)生效
165     call validate_buffer
166 
167     recover_all
168     iretd
169 
170 ; 默認的中斷處理函數(shù),所有的未定義中斷都會調(diào)用此函數(shù)
171 int_default:
172     save_all
173     recover_all
174     iretd
175 
176 ; 注意從系統(tǒng)調(diào)用返回時不需要從棧中彈出eax的值,因為eax保存著調(diào)用
177 ; 對應(yīng)系統(tǒng)調(diào)用之后的返回值
178 %macro recover_from_sys_call 0
179     pop gs
180     pop fs
181     pop es
182     pop ds
183     pop edi
184     pop esi
185     pop ebp
186     pop ebx
187     pop edx
188     pop ecx
189     add esp, 4 * 1
190 %endmacro
191 
192 ; 系統(tǒng)調(diào)用框架,系統(tǒng)調(diào)用采用0x30號中斷向量,利用int 0x30指令產(chǎn)
193 ; 生一個軟中斷,之后便進入sys_call函數(shù),該函數(shù)先調(diào)用save_all框
194 ; 架保存所有寄存器值,然后調(diào)用對應(yīng)系統(tǒng)調(diào)用號的入口函數(shù)完成系統(tǒng)調(diào)用
195 ; 注意!!!!!系統(tǒng)調(diào)用默認有三個參數(shù),分別利用ebx、ecx、edx來
196 ; 傳遞,其中eax保存系統(tǒng)調(diào)用號
197 sys_call:
198     save_all
199 
200     sti
201 
202     push ebx
203     push ecx
204     push edx
205     call [sys_call_table + eax * 4]
206     add esp, 4 * 3
207 
208     recover_from_sys_call
209 
210     cli
211 
212     iretd
213 

目前不打算對時鐘中斷處理函數(shù)、硬盤中斷處理函數(shù)以及系統(tǒng)調(diào)用入口框架做解釋,因為后序部分將會專門分章節(jié)進行講解。這里只說在發(fā)生類似時鐘中斷、硬盤中斷以及軟中斷int X的系統(tǒng)調(diào)用時,CPU如何處理的。
初始情況下假設(shè)CPU正在用戶態(tài)執(zhí)行某一個進程a,此時的CS、DS、ES、FS、SS均指向用戶態(tài)進程a的段基地址。
當時鐘中斷等中斷抑或int X的系統(tǒng)調(diào)用到來的時候,CPU會自動從TSS中尋找用戶態(tài)進程a預(yù)先保存的ring0下的SS0和ESP0,然后將SS和ESP寄存器值轉(zhuǎn)換成SS0和ESP0,即切換到核心態(tài)堆棧段(注意,每個進程都可能會有一個自己獨立的ring0堆棧段,這樣可以更好的實現(xiàn)進程切換時對內(nèi)核態(tài)的保護,linux對此的做法是在創(chuàng)建一個進程的時候在進程頁的末尾申請一塊空間作為該進程對應(yīng)的ring0堆棧段),然后將用戶態(tài)下的SS、ESP、EFLAGS、CS、EIP的值保存在新的SS0:ESP0堆棧段中。注意以上過程都是CPU自動完成的,然后再通過save_all宏手工將eax、ecx、edx、ebx、ebp、esi、edi、ds、es、fs、gs壓入堆棧,然后再執(zhí)行相應(yīng)的中斷處理程序。完成之后會通過recover_all再按序恢復(fù)所有的常規(guī)寄存器。然后調(diào)用iretd命令從堆棧中彈出EIP、CS、EFLAGS、ESP、SS寄存器,然后再重新恢復(fù)進程a的運行。這一過程需要對GDT、IDT、TSS以及保護模式下的中斷門、陷阱門有所了解才可以。
不過還有一種情況此處沒有涉及:當發(fā)生進程切換的時候現(xiàn)場保護與恢復(fù)的過程如何呢?這一過程將在后面敘述。

  1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2 ; 以下為庫函數(shù)
  3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  4 
  5 ; 對端口進行寫操作
  6 void out_byte(unsigned short port, unsigned char value);
  7 out_byte:
  8     mov edx, [esp + 4 * 1]
  9     mov al, [esp + 4 * 2]
 10     out dx, al
 11     nop
 12     nop
 13     ret
 14 
 15 ; 對端口進行讀操作
 16 ; uint8 in_byte(unsigned short port);
 17 in_byte:
 18     mov edx, [esp + 4 * 1]
 19     xor eax, eax
 20     in al, dx
 21     nop
 22     nop
 23     ret
 24 
 25 ; 對從指定端口進行讀操作,讀出的n個字節(jié)數(shù)據(jù)放入buf緩沖區(qū)中
 26 void read_port(uint16 port, void* buf, int n);
 27 read_port:
 28     mov    edx, [esp + 4 * 1]    ; port
 29     mov    edi, [esp + 4 * 2]    ; buf
 30     mov    ecx, [esp + 4 * 3]    ; n
 31     shr    ecx, 1
 32     cld
 33     rep    insw
 34     ret
 35 
 36 ; 對從指定端口進行寫操作,數(shù)據(jù)源在buf緩沖區(qū)中,寫n個字節(jié)
 37 void write_port(uint16 port, void* buf, int n);
 38 write_port:
 39     mov    edx, [esp + 4 * 1]    ; port
 40     mov    edi, [esp + 4 * 2]    ; buf
 41     mov    ecx, [esp + 4 * 3]    ; n
 42     shr    ecx, 1
 43     cld
 44     rep    outsw
 45     ret
 46 
 47 ; 安裝指定中斷號的中斷處理程序
 48 extern int install_int_handler(uint8 INT_IV, void* handler);
 49 install_int_handler:
 50     mov eax, [esp + 4 * 1] ; 中斷向量號
 51     mov ebx, [esp + 4 * 2] ; 中斷程序入口
 52     cmp eax, 256
 53     jae failed
 54     cmp eax, 0
 55     jbe failed
 56     push PRIVILEGE_KERNEL
 57     push ebx
 58     push INT_GATE_386
 59     push eax
 60     call init_idt
 61     add esp, 4 * 4
 62 failed:
 63     ret
 64     
 65 ; 卸載指定中斷號的中斷處理程序
 66 extern int uninstall_int_handler(uint8 INT_IV);
 67 uninstall_int_handler:
 68     mov eax, [esp + 4 * 1] ; 中斷向量號
 69     cmp eax, 256
 70     jae failed
 71     cmp eax, 0
 72     jbe failed
 73     push PRIVILEGE_KERNEL
 74     push int_default
 75     push INT_GATE_386
 76     push eax
 77     call init_idt
 78     add esp, 4 * 4
 79     ret
 80     
 81 ; 安裝指定中斷號的系統(tǒng)調(diào)用入口
 82 extern int install_sys_call_handler(uint8 INT_IV, void* handler);
 83 install_sys_call_handler:
 84     mov eax, [esp + 4 * 1] ; 中斷向量號
 85     mov ebx, [esp + 4 * 2] ; 中斷程序入口
 86     cmp eax, 256
 87     jae failed_inst_sys
 88     cmp eax, 0
 89     jbe failed_inst_sys
 90     push PRIVILEGE_USER
 91     push ebx
 92     push INT_TRAP_386
 93     push eax
 94     call init_idt
 95     add esp, 4 * 4
 96 failed_inst_sys:
 97     ret
 98 
 99 ; 打開對應(yīng)向量號的硬件中斷
100 ; 注意,這里傳入的參數(shù)是硬件中斷對應(yīng)的中斷向量號
101 ; 需要將該中斷向量號轉(zhuǎn)化為在8259A上的索引號
102 void enable_hwint(uint8 IV);
103 enable_hwint:
104     mov ecx, [esp + 4 * 1]
105     cmp cl, IRQ0_IV
106     jae master_1
107     jmp ret_1
108 master_1:
109     cmp cl, IRQ8_IV
110     jae slave_1
111     push MASTER_CTL_MASK_8259
112     call in_byte
113     add esp, 4 * 1
114     sub cl, IRQ0_IV
115     mov bl, 1
116     shl bl, cl
117     xor bl, 0xff
118     and al, bl
119     push eax
120     push MASTER_CTL_MASK_8259
121     call out_byte
122     add esp, 4 * 2
123     jmp ret_1
124 slave_1:
125     cmp cl, IRQ15_IV
126     ja ret_1
127     push SLAVE_CTL_MASK_8259
128     call in_byte
129     add esp, 4 * 1
130     sub cl, IRQ8_IV
131     mov bl, 1
132     shl bl, cl
133     xor bl, 0xff
134     and al, bl
135     push eax
136     push SLAVE_CTL_MASK_8259
137     call out_byte
138     add esp, 4 * 2
139 ret_1:
140     ret
141 
142 ; 關(guān)閉對應(yīng)向量號的硬件中斷
143 ; 注意,這里傳入的參數(shù)是硬件中斷對應(yīng)的中斷向量號
144 ; 需要將該中斷向量號轉(zhuǎn)化為在8259A上的索引號
145 void disable_hwint(uint8 IV);
146 disable_hwint:
147     mov ecx, [esp + 4 * 1]
148     cmp cl, IRQ0_IV
149     jae master_2
150     jmp ret_2
151 master_2:
152     cmp cl, IRQ8_IV
153     jae slave_2
154     push MASTER_CTL_MASK_8259
155     call in_byte
156     add esp, 4 * 1
157     sub cl, IRQ0_IV
158     mov bl, 1
159     shl bl, cl
160     or al, bl
161     push eax
162     push MASTER_CTL_MASK_8259
163     call out_byte
164     add esp, 4 * 2
165     jmp ret_2
166 slave_2:
167     cmp cl, IRQ15_IV
168     ja ret_2
169     push SLAVE_CTL_MASK_8259
170     call in_byte
171     add esp, 4 * 1
172     sub cl, IRQ8_IV
173     mov bl, 1
174     shl bl, cl
175     or al, bl
176     push eax
177     push SLAVE_CTL_MASK_8259
178     call out_byte
179     add esp, 4 * 2
180 ret_2:
181     ret
182 
183 [SECTION .data]
184 idt:
185         ; idt表共可存放256個中斷門描述符
186         times 256 * 8 db 0
187 
188 idtr:    dw $ - idt - 1
189         dd idt
190 

上面這段函數(shù)比較簡單,是一些庫函數(shù),主要包括對端口進行讀、寫操作;以及安裝或者卸載中斷處理程序,方法就是通過接受中斷號,將IDT中對應(yīng)的中斷描述符置空或初始化;還有安裝系統(tǒng)調(diào)用,安裝系統(tǒng)調(diào)用和安裝中斷處理程序幾乎相同,唯一的區(qū)別就是門描述符的類型以及門描述符的特權(quán)級不同,中斷處理程序是中斷門,對應(yīng)的門描述符DPL為0,系統(tǒng)調(diào)用是陷阱門,對應(yīng)的DPL為3,這是因為中斷門只需要檢查CPL>=處理程序的DPL,而陷阱門除了檢查該條件以外還檢查CPL<=陷阱門描述符的DPL。這樣做的原因是陷阱門是由程序引起的,諸如系統(tǒng)調(diào)用之類的,需要從程序中跳入;而中斷是硬件引起的。
再后面函數(shù)就是打開或關(guān)閉8259A上的硬件中斷。

關(guān)于init.s文件的描述就到此為止。之后還會對進程切換做進一步的闡釋。
posted on 2012-02-14 01:06 myjfm 閱讀(542) 評論(0)  編輯 收藏 引用 所屬分類: 操作系統(tǒng)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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精品国产亚洲性色 | 亚洲日产国产精品| 激情欧美一区二区| 在线精品视频免费观看| 亚洲国产女人aaa毛片在线| 亚洲国产精品v| 宅男噜噜噜66一区二区| 午夜精品99久久免费| 亚洲欧美视频一区| 久久午夜精品一区二区| 欧美成人午夜激情视频| 日韩午夜电影av| 亚洲欧美电影院| 久久综合一区二区三区| 欧美久久影院| 国产亚洲精品久久久久动| 狠狠色丁香久久婷婷综合丁香| 在线成人国产| 亚洲一区二区三区色| 久久综合激情| 夜夜爽99久久国产综合精品女不卡| 亚洲欧美日韩在线高清直播| 蜜桃av综合| 国产欧美短视频| 最新成人av网站| 欧美中文字幕第一页| 亚洲韩国日本中文字幕| 亚洲欧洲免费视频| 午夜在线视频观看日韩17c| 老鸭窝亚洲一区二区三区| 国产精品黄视频| 亚洲精品一区二区三区福利| 欧美一区二区三区四区高清| 亚洲韩国青草视频| 久久永久免费| 国产欧美一区二区精品仙草咪 | 欧美日本在线| 国产综合精品一区| 亚洲欧美一区二区三区久久| 亚洲丁香婷深爱综合| 久久美女性网| 国产一区白浆| 亚洲午夜国产一区99re久久 | 久久成人精品无人区| 亚洲国产精品一区在线观看不卡 | 久久在精品线影院精品国产| 亚洲美女毛片| 欧美福利电影网| 在线欧美福利| 久久久久久久一区二区三区| 亚洲影院一区| 国产精品乱码| 亚洲伊人一本大道中文字幕| 亚洲精品国产精品乱码不99 | 欧美日韩国产专区| 亚洲片国产一区一级在线观看| 久久久免费精品视频| 亚洲欧美激情在线视频| 国产精品久久福利| 亚洲欧美国产另类| 亚洲一区二区三区免费在线观看 | 久久久久久久国产| 在线看片一区| 欧美丰满高潮xxxx喷水动漫| 久久一区二区三区av| 在线观看91久久久久久| 免费中文日韩| 免费日韩精品中文字幕视频在线| 在线精品视频免费观看| 亚洲大胆人体在线| 欧美成人免费va影院高清| 亚洲人成网站在线观看播放| 亚洲高清不卡| 欧美日韩人人澡狠狠躁视频| 一本大道久久a久久精品综合| 亚洲毛片在线免费观看| 国产精品高潮久久| 久久国产欧美精品| 久久野战av| 亚洲美女在线视频| 国产精品99久久不卡二区| 国产欧美高清| 欧美激情中文字幕乱码免费| 欧美交受高潮1| 香蕉成人久久| 久久久久成人精品| 一区二区三区日韩欧美| 亚洲欧美日韩国产成人| 亚洲第一精品电影| 极品尤物久久久av免费看| 久久精品国语| 欧美在线视频一区二区三区| 亚洲国产99| 一区二区三区毛片| 狠狠做深爱婷婷久久综合一区| 欧美国产日韩精品免费观看| 欧美日韩成人免费| 久久精品人人做人人综合| 男男成人高潮片免费网站| 亚洲一二三四久久| 免费av成人在线| 欧美一级黄色网| 欧美国产日本| 久久久久久久综合色一本| 欧美精品在线视频观看| 久久久久成人精品免费播放动漫| 欧美精品激情在线观看| 久久久久欧美精品| 国产精品美女| 亚洲人成小说网站色在线| 国产亚洲精品久久飘花| 中日韩高清电影网| 99综合电影在线视频| 蜜桃精品久久久久久久免费影院| 久久国产一区二区| 国产精品理论片在线观看| 最新亚洲激情| 亚洲狠狠丁香婷婷综合久久久| 亚洲欧美三级在线| 亚洲在线中文字幕| 欧美日韩成人综合| 亚洲国产欧美在线| 亚洲国产毛片完整版| 久久精品国产第一区二区三区最新章节| avtt综合网| 欧美激情一区三区| 亚洲二区精品| 亚洲精品乱码久久久久久| 久久久久久9999| 久久字幕精品一区| 国产亚洲女人久久久久毛片| 亚洲午夜免费福利视频| 亚洲天堂免费观看| 欧美视频中文一区二区三区在线观看| 欧美激情无毛| 亚洲啪啪91| 欧美国产精品一区| 亚洲裸体视频| 亚洲一区二区在线播放| 欧美特黄一级大片| 亚洲一区欧美一区| 久久电影一区| 黑人巨大精品欧美一区二区| 久久不射2019中文字幕| 免费观看成人网| 亚洲区免费影片| 欧美日韩二区三区| 亚洲最新合集| 欧美午夜片欧美片在线观看| 在线亚洲国产精品网站| 欧美一级黄色网| 亚洲电影第1页| 欧美激情视频在线免费观看 欧美视频免费一 | 国产精品视频yy9099| 亚洲欧美日韩综合| 欧美久久99| 免费亚洲婷婷| 激情综合视频| 欧美成人一区二区三区片免费| 亚洲丰满少妇videoshd| 99成人在线| 国产精品一区免费观看| 久久国产精品72免费观看| 欧美风情在线观看| 中文国产成人精品| 国产欧美日韩视频| 免费观看成人网| 亚洲少妇自拍| 久久综合九色| 99re6热在线精品视频播放速度| 欧美精品成人91久久久久久久| 一区二区三区日韩欧美| 久久成人综合网| 99riav久久精品riav| 国产免费成人在线视频| 你懂的网址国产 欧美| 亚洲视频免费| 亚洲国产美女| 欧美一区亚洲| 99国产精品视频免费观看| 国产精品视频导航| 欧美激情成人在线| 久久精品国语| 亚洲欧美另类在线| 亚洲精品欧美一区二区三区| 久久av资源网| 一区二区三区日韩欧美精品| 一色屋精品视频免费看| 国产精品免费一区二区三区在线观看| 久久免费视频观看| 午夜精品久久久久久久99樱桃| 亚洲日本中文字幕区| 久久噜噜亚洲综合| 亚洲欧美综合v| 在线视频一区观看| 日韩视频一区二区三区在线播放| 一区二区三区亚洲| 国产一区视频在线观看免费| 国产精品久久久久久妇女6080|