[優(yōu)秀畢業(yè)論文]在虛擬機(jī)中編程實(shí)現(xiàn)IO中斷處理機(jī)制_第1頁
[優(yōu)秀畢業(yè)論文]在虛擬機(jī)中編程實(shí)現(xiàn)IO中斷處理機(jī)制_第2頁
[優(yōu)秀畢業(yè)論文]在虛擬機(jī)中編程實(shí)現(xiàn)IO中斷處理機(jī)制_第3頁
[優(yōu)秀畢業(yè)論文]在虛擬機(jī)中編程實(shí)現(xiàn)IO中斷處理機(jī)制_第4頁
[優(yōu)秀畢業(yè)論文]在虛擬機(jī)中編程實(shí)現(xiàn)IO中斷處理機(jī)制_第5頁
已閱讀5頁,還剩52頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、本科畢業(yè)設(shè)計(jì)(論文)畢業(yè)設(shè)計(jì)(論文) 題 目 在虛擬機(jī)中編程實(shí)現(xiàn)i/o 中斷處理機(jī)制 專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) 學(xué) 號(hào) 學(xué) 生 指 導(dǎo) 教 師 答 辯 日 期 2008年6月23日 摘 要本論文主要研究了中斷處理機(jī)制,并在此基礎(chǔ)上實(shí)現(xiàn)了鍵盤驅(qū)動(dòng)程序。在實(shí)現(xiàn)中斷處理機(jī)制的過程中,首先介紹了中斷及中斷源的概念,分析了中斷的處理流程;其次介紹了中斷處理機(jī)制的硬件和軟件實(shí)現(xiàn)過程,其中硬件方面主要介紹了8259a的內(nèi)部結(jié)構(gòu),工作原理及相關(guān)配置;軟件方面主要介紹了中斷描述符表idt的建立過程。在實(shí)現(xiàn)鍵盤驅(qū)動(dòng)程序的過程中,主要介紹了鍵盤的內(nèi)部結(jié)構(gòu)及工作原理,建立了掃描碼表數(shù)組,總結(jié)了鍵盤的工作過程,并實(shí)現(xiàn)了

2、對(duì)鍵盤上單鍵和復(fù)合鍵的響應(yīng)。在分析中斷處理機(jī)制的過程,發(fā)現(xiàn)了linux 2.6.25內(nèi)核中斷部分關(guān)于s3c2410上的dma通道映射的上的一個(gè)bug,并實(shí)際的調(diào)試跟蹤了相應(yīng)的內(nèi)核源碼,解決了這個(gè)bug。關(guān)鍵詞中斷;8259a;中斷描述符;掃描碼 abstractthis paper mostly researchs the interrupt handing mechanism, on the basis of which, realizes the keyboard driver.in the process of realizing the interrupt handing mechan

3、ism, firstly, it introduces the conception of interrupt and interrupt source, and analyses the flow of interrupt handing. secondly, it introduces the process of achieving the hardware and software in the interrupt handing mechanism, of which, mostly describes the internal structure, operational prin

4、ciple and configure in the 8259a, then, describes the build process of the interrupt descriptor table idt.in the process of realizing the keyboard driver, it describes the internal structure and operational principle of the keyboard, and sets up scan code table array, then sums up the working proces

5、s of the keyboard and achieves the responding of the single and complex keys.finally, it discovers a bug in the 2.6.25 kernel , which is about dma channel mapping on the s3c2410 board, and debug the kernel code , then resolves the bug.key wordsinterrupt 8259a interrupt descriptor scan code不要?jiǎng)h除行尾的分節(jié)符

6、,此行不會(huì)被打印- ii -本科畢業(yè)設(shè)計(jì)(論文)目 錄摘 要iabstractii第1章 緒論11.1 課題背景11.2 課題來源、目的和意義11.2.1 課題來源11.2.2 課題目的和意義11.3 主要研究內(nèi)容21.4 本文結(jié)構(gòu)2第2章 中斷概論32.1 中斷簡介32.1.1 中斷的概念及作用32.1.2 中斷源32.2 i/o中斷的處理過程42.2.1 標(biāo)志寄存器if位42.2.2 中斷處理流程42.3 本章小結(jié)6第3章 中斷處理機(jī)制的實(shí)現(xiàn)73.1 中斷機(jī)制硬件部分實(shí)現(xiàn)73.1.1 8259a簡述73.1.2 8259a工作原理103.1.3 8259a相關(guān)配置113.2 中斷機(jī)制軟件部

7、分實(shí)現(xiàn)163.2.1 保護(hù)模式簡述163.2.2 中斷描述符表idt173.2.3 編程實(shí)現(xiàn)中斷處理過程213.3 本章小結(jié)24第4章 鍵盤驅(qū)動(dòng)的實(shí)現(xiàn)264.1 鍵盤簡述264.1.1 鍵盤種類264.1.2 鍵盤內(nèi)部結(jié)構(gòu)264.2 鍵盤工作原理284.2.1 鍵盤掃描碼284.2.2 鍵盤的工作過程及實(shí)現(xiàn)304.3 鍵盤按鍵的實(shí)現(xiàn)314.3.1 單鍵的實(shí)現(xiàn)314.3.2 復(fù)合鍵的實(shí)現(xiàn)324.4 本章小結(jié)32第5章 內(nèi)核中斷相關(guān)bug的簡述345.1 引言345.2 內(nèi)核中斷相關(guān)bug的描述345.3 內(nèi)核中斷相關(guān)bug的修改365.4 本章小結(jié)38結(jié) 論39致 謝40參考文獻(xiàn)41千萬不要?jiǎng)h除

8、行尾的分節(jié)符,此行不會(huì)被打印。在目錄上點(diǎn)右鍵“更新域”,然后“更新整個(gè)目錄”。打印前,不要忘記把上面“abstract”這一行后加一空行- 51 -本科畢業(yè)設(shè)計(jì)(論文)第1章 緒論1.1 課題背景現(xiàn)代通用處理器都通過中斷處理機(jī)制來處理中斷。硬件中斷發(fā)生時(shí),cpu將停止執(zhí)行當(dāng)前指令并將跳轉(zhuǎn)到內(nèi)存中包含中斷處理代碼或中斷處理代碼指令分支的位置繼續(xù)執(zhí)行。這些代碼在一種特殊cpu模式:中斷模式下執(zhí)行1。隨著計(jì)算機(jī)系統(tǒng)的不斷發(fā)展,中斷處理機(jī)制也在不斷的完善。在嵌入式系統(tǒng)在實(shí)時(shí)控制領(lǐng)域的廣泛應(yīng)用的今天, 系統(tǒng)對(duì)嵌入式微處理器和嵌入式軟件的要求越來越高。不僅要求系統(tǒng)支持實(shí)時(shí)多任務(wù)、支持搶占式任務(wù)切換而且具有

9、較短的中斷響應(yīng)時(shí)間, 及時(shí)處理現(xiàn)場(chǎng)環(huán)境的實(shí)時(shí)請(qǐng)求。這就要求中斷處理機(jī)制不僅要執(zhí)行中斷處理程序,還有在短時(shí)間內(nèi)快速對(duì)外部的中斷請(qǐng)求進(jìn)行處理2。1.2 課題來源、目的和意義1.2.1 課題來源中斷處理是由內(nèi)核執(zhí)行的最敏感的任務(wù)之一,當(dāng)內(nèi)核正打算去做一些別的事情時(shí),中斷隨時(shí)會(huì)到來,中斷當(dāng)前的任務(wù)進(jìn)而執(zhí)行中斷處理程序。因此內(nèi)核的目標(biāo)就是讓中斷盡可能快的處理完, 盡其所能把更多的處理工作向后推遲。為此linux把中斷的處理分成上半部分和下半部分。上半部分立即執(zhí)行, 下半部分將喚醒相應(yīng)的和中斷處理相關(guān)的進(jìn)程稍后執(zhí)行。這種中斷處理機(jī)制使得中斷處理變得更加高效和易于維護(hù)。鑒于中斷處理機(jī)制在計(jì)算機(jī)系統(tǒng)中的重要地

10、位以及對(duì)中斷處理機(jī)制的濃厚興趣,并在和導(dǎo)師的溝通交流下獲得了本課題。1.2.2 課題目的和意義通過編程實(shí)現(xiàn)i/o中斷處理機(jī)制,想進(jìn)一步了解中斷處理機(jī)制的工作原理和一些相關(guān)的硬件的知識(shí)。同時(shí)閱讀大量linux內(nèi)核源碼,掌握內(nèi)核中斷的基本流程,為將來從事嵌入式開發(fā)行業(yè)打下基礎(chǔ)。1.3 主要研究內(nèi)容本論文主要研究了中斷處理機(jī)制,編程實(shí)現(xiàn)了中斷處理的全過程,并在此基礎(chǔ)上實(shí)現(xiàn)了鍵盤驅(qū)動(dòng),最后對(duì)linux 內(nèi)核關(guān)于中斷處理的一個(gè)bug加以解決。1.4 本文結(jié)構(gòu)本文主要內(nèi)容如下:第2章中,主要介紹了中斷的基本概念和中斷的處理流程及原理。 第3章中,主要介紹了中斷處理機(jī)制在硬件和軟件方面的實(shí)現(xiàn)。第4章中,主要

11、介紹了鍵盤驅(qū)動(dòng)的實(shí)現(xiàn)。第5章中,主要介紹了linux 2.6.25內(nèi)核上的關(guān)于dma的一個(gè)bug,并加以解決。第2章 中斷概論2.1 中斷簡介2.1.1 中斷的概念及作用中斷是一種使cpu中止正在執(zhí)行的程序而轉(zhuǎn)去處理特殊事件的操作。一方面,有了中斷功能, pc系統(tǒng)就可以使cpu和外設(shè)同時(shí)工作,使系統(tǒng)可以及時(shí)地響應(yīng)外部事件,這樣就大大提高了cpu的利用率,也提高了輸入、輸出的速度,從而提高了系統(tǒng)的實(shí)現(xiàn)性;另一方面,有了中斷功能,就可以使cpu及時(shí)處理各種軟硬件故障。計(jì)算機(jī)在運(yùn)行過程中,往往會(huì)出現(xiàn)事先預(yù)料不到的情況或出現(xiàn)一些故障,如電源掉電、存儲(chǔ)出錯(cuò)、運(yùn)算溢出等等。計(jì)算機(jī)可以利用中斷系統(tǒng)自行處理,

12、而不必停機(jī)或報(bào)告工作人員3。2.1.2 中斷源2.1.2.1 中斷源概念cpu要響應(yīng)中斷,必須有外部設(shè)備或應(yīng)用程序向cpu發(fā)出中斷請(qǐng)求,這種引起中斷的原因或設(shè)備就叫中斷源4。2.1.2.2 中斷源分類中斷源一般有以下幾種5: (1) 外部i/o設(shè)備,如鍵盤,其可以產(chǎn)生i/o中斷;(2) 系統(tǒng)定時(shí)器,其可以產(chǎn)生的系統(tǒng)時(shí)鐘中斷;(3) 計(jì)算機(jī)硬件故障或者程序出錯(cuò),這種中斷是隨機(jī)發(fā)生的,又叫異常;(4) 程序中斷,這種中斷是由應(yīng)用程序通過執(zhí)行特殊的中斷指令而產(chǎn)生中斷調(diào)用的,所以又叫程序中斷或者軟中斷。 其中(1),(2)兩種設(shè)備產(chǎn)生的中斷叫做硬中斷,而本論文中所討論的i/o中斷就為此類中斷。2.2

13、i/o中斷的處理過程2.2.1 標(biāo)志寄存器if位eflags為32位標(biāo)志寄存器,又稱為程序狀態(tài)寄存器。這是一個(gè)存放條件碼標(biāo)志,控制標(biāo)志和系統(tǒng)標(biāo)志的寄存器。其結(jié)構(gòu)如表1-1所示。表2-1 標(biāo)志寄存器低16位ofdfiftfsfzfafpfcf其中標(biāo)志寄存器的第9位為if即為中斷標(biāo)志位。當(dāng)if位為1時(shí),允許cpu響應(yīng)中斷請(qǐng)求即開中斷;當(dāng)if位為0時(shí),cpu不響應(yīng)外部中斷即關(guān)閉中斷。2.2.2 中斷處理流程當(dāng)外部i/o設(shè)備產(chǎn)生中斷后,系統(tǒng)將按照下面的過程進(jìn)行處理:(1) 中斷控制器接受設(shè)備產(chǎn)生的中斷,并向cpu發(fā)出中斷請(qǐng)求;(2) cpu接受請(qǐng)求,并關(guān)閉中斷即if位置0。因?yàn)橄乱徊绞潜4鏀帱c(diǎn)和現(xiàn)場(chǎng),

14、在此過程中,cpu不應(yīng)該響應(yīng)別的中斷,否則,現(xiàn)場(chǎng)保存不完整,在中斷服務(wù)程序結(jié)束后,cpu就不能正確的回到斷點(diǎn)繼續(xù)執(zhí)行程序; (3) 保存斷點(diǎn)和現(xiàn)場(chǎng)。為了保證程序在中斷服務(wù)程序執(zhí)行后返回?cái)帱c(diǎn)繼續(xù)執(zhí)行,必須保存當(dāng)前cpu中寄存器的內(nèi)容和斷點(diǎn)的位置; (4) 開啟中斷。因?yàn)橄旅鎸?zhí)行中斷服務(wù)程序,為了保證此時(shí)cpu能響應(yīng)更高級(jí)別的中斷,必須將標(biāo)志寄存器中的if位置1,即開中斷; (5) 執(zhí)行中斷服務(wù)程序; (6) 關(guān)閉中斷。因?yàn)橄乱徊揭謴?fù)現(xiàn)場(chǎng)和斷點(diǎn),否則將破環(huán)恢復(fù)過程; (7) 恢復(fù)現(xiàn)場(chǎng)和斷點(diǎn); (8) 開啟中斷,以便繼續(xù)接受外部中斷; (9) 返回?cái)帱c(diǎn)。其流程圖如圖2-1所示。圖2-1 中斷處理

15、流程2.3 本章小結(jié) 本章首先介紹了中斷的概念,其就是一種使cpu中止正在執(zhí)行的程序而轉(zhuǎn)去處理特殊事件的操作。接著又介紹了中斷源及其分類,中斷按中斷源可分為硬中斷,軟中斷和異常。而本論文中所涉及的i/o中斷即為硬中斷。本章又介紹標(biāo)志寄存器if位的作用,if為0時(shí),即關(guān)中斷;if為1時(shí),即開中斷。并重點(diǎn)的介紹了中斷的處理流程。第3章 中斷處理機(jī)制的實(shí)現(xiàn)3.1 中斷機(jī)制硬件部分實(shí)現(xiàn)3.1.1 8259a簡述3.1.1.1 8259a簡介8259a為intel公司生產(chǎn)的中斷控制器6,其是專為定時(shí)、中斷驅(qū)動(dòng)的微計(jì)算機(jī)應(yīng)用系統(tǒng)進(jìn)行中斷控制而設(shè)計(jì)的芯片,并且是可編程的,即可以由軟件設(shè)置該中斷控制器的工作模

16、式,在使用中非常靈活方便。另外,8259a中斷控制器的功能也比較強(qiáng)大,1片8259a能管理8級(jí)中斷,并可以利用兩片8259a芯片來實(shí)現(xiàn)主從式中斷系統(tǒng),在目前的大多數(shù)計(jì)算機(jī)系統(tǒng)中就是采用這種主從式結(jié)構(gòu),在本論文中,也是采用的此種結(jié)構(gòu)。其詳細(xì)結(jié)構(gòu)如圖3-1所示。 圖3-1 8259a主從結(jié)構(gòu)3.1.1.2 8259a外部引腳 8259a共有28個(gè)外部引腳,其詳細(xì)引腳位置如圖3-2所示。 圖3-2 8259a外部引腳每一個(gè)引腳都有特定的功能及作用,其具體功能如表3-1所示。 表3-1 8259a的引腳說明符號(hào)名稱管腳號(hào)類型功能vcc電源28輸入+5v電源gnd地14輸入地cs片選1輸入為低電平時(shí),8

17、259a工作。wr寫2輸入為寫信號(hào)線,低電平有效,當(dāng)其有效時(shí),控制信息從cpu寫入至8259芯片。 rd讀3輸入為低電平有效,當(dāng)其有效時(shí),控制信息從8259芯片讀至cpu。表3-1 8259a的引腳說明續(xù)符號(hào)名稱管腳號(hào)類型功能d7d0雙向數(shù)據(jù)總線411輸入/輸出傳送控制狀態(tài)和中斷向量號(hào)cas2cas0級(jí)連信號(hào)線12,13,15輸入/輸出8259a專用總線,以便構(gòu)成多個(gè)主從結(jié)構(gòu),對(duì)于主片來說,為輸出;對(duì)于從片來說,為輸入。sp/en從片/開啟緩沖器16輸入/輸出在緩沖器方式下,為輸出,控制緩沖收發(fā)器。在其他方式下,為輸入,主片sp=1,從片sp=0。int中斷17輸出向cpu發(fā)出中斷請(qǐng)求ir0i

18、r7中斷請(qǐng)求1825輸入中斷請(qǐng)求輸入端inta中斷響應(yīng)26輸入中斷響應(yīng)輸入端a0a0地址線27輸入來選擇芯片內(nèi)部不同的寄存器,通常接至地址總線的a0。3.1.1.3 8259a內(nèi)部結(jié)構(gòu)8259a的內(nèi)部結(jié)構(gòu)主要由中斷請(qǐng)求寄存器、當(dāng)前服務(wù)寄存器、中斷屏蔽寄存器構(gòu)成的。其具體結(jié)構(gòu)如圖3-3所示。 圖3-3 8259a內(nèi)部結(jié)構(gòu) 其中相關(guān)部件的功能為:(1) 中斷請(qǐng)求寄存器(irr)。用于存放正在請(qǐng)求的服務(wù)的所有中斷源;(2) 當(dāng)前服務(wù)寄存器(isr)。用于存放正在服務(wù)的中斷源;(3) 中斷屏蔽寄存器(imr)。對(duì)irr寄存器起屏蔽作用;(4) 優(yōu)先級(jí)電路。該部件確定irr寄存器中置“1”位的優(yōu)先級(jí);(

19、5) 數(shù)據(jù)總線緩沖器。用于發(fā)送或接收狀態(tài)字和控制字信息;(6) 讀/寫控制邏輯。用于接收cpu來的命令字,并把它們保存到寄存器。3.1.2 8259a工作原理8259a的工作流程如下:(1) 當(dāng)外部產(chǎn)生中斷時(shí),某一條或多條中斷線(ir07)變?yōu)楦唠娖?,使irr 寄存器的對(duì)應(yīng)位為1,即對(duì)這一中斷進(jìn)行鎖存;(2) 如果中斷沒有被屏蔽且沒有更高優(yōu)先級(jí)的中斷被受理,8259a的int引腳將輸出1,向cpu發(fā)出中斷請(qǐng)求;(3) cpu響應(yīng)后,會(huì)發(fā)出兩個(gè)負(fù)脈沖,當(dāng)?shù)谝粋€(gè)負(fù)脈沖到達(dá)inta后,8259a將isr寄存器中優(yōu)先級(jí)最高的一位置1,并將irr中的全部對(duì)應(yīng)位置0,并且封鎖ir07上的中斷請(qǐng)求,即使ir

20、r的鎖存功能失效;(4) 當(dāng)?shù)诙€(gè)負(fù)脈沖到達(dá)inta后,8259a將中斷類型碼,即中斷號(hào)送至數(shù)據(jù)總線的d0d7,并送至cpu開始執(zhí)行相應(yīng)的中斷處理程序。與此同時(shí)8259a允許ir07的中斷請(qǐng)求,即使irr的鎖存功能有效;(5) 當(dāng)cpu正在執(zhí)行中斷處理程序的時(shí)候,如有更高級(jí)的中斷請(qǐng)求時(shí),8259a會(huì)將此中斷與isr中的標(biāo)識(shí)的中斷(即cpu正在處理的中斷)進(jìn)行優(yōu)先級(jí)比較,如果請(qǐng)求中斷的優(yōu)先級(jí)高于正在執(zhí)行的中斷的優(yōu)先級(jí),那么cpu必須停止執(zhí)行當(dāng)前的中斷的處理程序,去響應(yīng)正在請(qǐng)求的中斷,即產(chǎn)生中斷嵌套。對(duì)新中斷的響應(yīng)過程如(1),(2),(3),(4)。3.1.3 8259a相關(guān)配置3.1.3.1

21、8259a命令字簡介如果要使8259a正常工作,首先需要向8259a中的寄存器中寫入對(duì)應(yīng)的命令字。每片8259a有7個(gè)寄存器,它們都是8位的。這7個(gè)寄存器分為兩組,第一組寄存器4個(gè),用來存放初始化命令字;第二組寄存器3個(gè),用來存放操作命令字。8259a中的命令字分為兩種:初始化命令字(icw)和操作命令字(ocw)。其中icw包括icw1、icw2、icw3、icw4;ocw包括ocw1、ocw2、ocw3。3.1.3.2 初始化命令字icw初始化命令字往往是計(jì)算機(jī)系統(tǒng)初始化時(shí)設(shè)置的。其一旦設(shè)定,一般在系統(tǒng)工作過程中不再改變。8259a中的初始化命令字包括icw1,icw2,icw3,icw4

22、。其具體格式如下:(1) 在主從結(jié)構(gòu)中,主從片的icw1格式相同。如圖3-4所示。 圖 3-4 icw1格式 在本論文中,主從片的icw1都設(shè)置為0x11。(2) 在主從結(jié)構(gòu)中,主從片的icw2格式相同。如圖3-5所示。 圖 3-5 icw2格式在本論文中,主片的icw2設(shè)置為0x20。從片的icw2設(shè)置為0x28。(3) 在主從結(jié)構(gòu)中,主從片的icw3格式是不同的。主從片的icw3格式分別如圖3-6所示和圖3-7所示。 圖 3-6 主片icw3格式 圖 3-7 從片icw3格式在本論文中,主片的icw3設(shè)置為0x04,從片的icw3設(shè)置為0x02。(4) 在主從結(jié)構(gòu)中,主從片的icw4格式相

23、同。如圖3-8所示。 圖 3-8 icw4格式在本論文中,主從片的icw4都設(shè)置為0x01。其中第3,2位都為0,采用非緩沖模式。第4位為0,采用非特定的全嵌套的方式即不允許同級(jí)中斷,因?yàn)閮H僅實(shí)現(xiàn)鍵盤中斷,無需從片上的中斷即主片的irq2不會(huì)產(chǎn)生中斷,因此沒必要采用同級(jí)中斷。3.1.3.3 操作命令字ocw操作命令字用來對(duì)中斷處理過程作動(dòng)態(tài)控制。在一個(gè)系統(tǒng)運(yùn)行過程中,操作命令字可以被多次設(shè)置。8259a中的操作控制字包括ocw1,ocw2,ocw3,在設(shè)計(jì)過程中沒有使用ocw3。其中ocw1,ocw2具體格式為:(1) ocw1主要用于對(duì)中斷屏蔽寄存器(imr)進(jìn)行置位/復(fù)位。主從片格式相同,

24、其格式如圖3-9所示。 圖3-9 ocw1格式 在本論文中,實(shí)現(xiàn)的是鍵盤中斷,因此僅僅irq1打開,所以主片的ocw1為0xfd,從片的ocw1為0xff。(2) ocw2主要用于控制8259a的中斷工作方式。主從片格式相同,其格式如表3-2所示。 表3-2 ocw2格式76543210rsleoi00l2l1l0在本論文中,采用的是普通工作方式,且采用的是非特殊的eoi命令即r=0,sl=0,eoi=1。因此主從片的ocw2都設(shè)置為0x20。3.1.3.4 編程實(shí)現(xiàn)8259a配置要編程實(shí)現(xiàn)對(duì)8259a的初始化,首先要知道8259a的端口地址。主8259a的端口地址為20h和21h,從8259

25、a的端口地址是a0h和a1h。并按照以下順序進(jìn)行初始化:(1) 往端口20h(主片),a0h(從片)寫入icw1。(2) 往端口21h(主片),a1h(從片)寫入icw2。(3) 往端口21h(主片),a1h(從片)寫入icw3。(4) 往端口21h(主片),a1h(從片)寫入icw4。(5) 往端口21h(主片),a1h(從片)寫入ocw1。 其對(duì)應(yīng)的代碼如下:out_byte(int_m_ctl,0x11);/ 設(shè)置主8259a的icw1。out_byte(int_s_ctl,0x11); / 設(shè)置從8259a的icw1。out_byte(int_m_ctlmask,0x20);/ 設(shè)置主

26、8259a的起始中斷號(hào)為0x20。out_byte(int_s_ctlmask,0x28); /設(shè)置從8259a的起始中斷號(hào)為0x28。out_byte(int_m_ctlmask,0x4);/設(shè)置主8259a的icw3。即ir2對(duì)應(yīng)從8259a。out_byte(int_s_ctlmask,0x2);/設(shè)置從8259a的icw3。即對(duì)應(yīng)主8259a的ir2。out_byte(int_m_ctlmask,0x1);/設(shè)置主8259a的icw4。out_byte(int_s_ctlmask,0x1); /設(shè)置從8259a的icw4。out_byte(int_m_ctlmask,0xfd); /設(shè)

27、置主8259a的ocw1。out_byte(int_s_ctlmask,0xff); /設(shè)置從8259a的ocw1。其中,out_byte()函數(shù)是在c語言中調(diào)用的匯編代碼,因?yàn)閷?duì)相關(guān)寄存器這類硬件的設(shè)置必須用到匯編語言。相應(yīng)的匯編代碼如下:out_byte:movedx, esp + 4; portmoval, esp + 8 ; valueoutdx, alnop; 一點(diǎn)延遲ret在這需要說明一下,在c語言中調(diào)用匯編代碼的一些規(guī)則。首先在c語言中必須聲明此匯編代碼所對(duì)應(yīng)的c語言函數(shù)。聲明如下:void out_byte(t_port port, t_8 value); 其次,在匯編中必須將

28、相應(yīng)的代碼的標(biāo)號(hào)導(dǎo)出即聲明為全局。代碼如下: global out_byte 最后,也是最重要的就是其函數(shù)中參數(shù)的壓棧順序是最后一個(gè)參數(shù)先入棧,第一個(gè)參數(shù)最后入棧的,即由后至前的入棧順序。因此在上述匯編代碼中先取出的是端口地址,然后取出的是寫入的值。3.2 中斷機(jī)制軟件部分實(shí)現(xiàn)3.2.1 保護(hù)模式簡述因?yàn)槭窃诒Wo(hù)模式下實(shí)現(xiàn)中斷處理機(jī)制的,因此有必要先了解一下什么是保護(hù)模式。在8086/8088系統(tǒng)中,cpu對(duì)外僅有20根地址總線,因此采用的是實(shí)模式下1mb的尋址空間,但在386以后的后繼機(jī)型中,cpu對(duì)外的地址總線已增加到32根,其已經(jīng)擁有4gb的地址空間,而僅僅用實(shí)模式下的1mb的尋址空間是

29、顯然是不夠的,因此提出了保護(hù)模式這一概念,在保護(hù)模式中其對(duì)應(yīng)的尋址空間為4gb。 在實(shí)模式中,采用的是“段:偏移”方式達(dá)到1mb的尋址能力,而在保護(hù)模式下,引入了32位寄存器,同時(shí)仍然使用16位的段寄存器,但不同的是,此時(shí)的段寄存器不再是存放某一段的基址了,而是存放一個(gè)索引,這個(gè)索引指向一個(gè)數(shù)據(jù)結(jié)構(gòu)的表項(xiàng),表項(xiàng)中詳細(xì)的定義了段的起始地址、界限、屬性等內(nèi)容。這個(gè)是數(shù)據(jù)結(jié)構(gòu)就是gdt(全局描述符表),而其中的表項(xiàng)也有一個(gè)專門的名字叫做描述符,而這個(gè)索引就是選擇子。在保護(hù)模式下,描述符可分為四種:數(shù)據(jù)段描述符、代碼段描述符、系統(tǒng)段描述符和門描述符。其中的代碼段描述符提供中斷處理程序的段基址,其具體結(jié)

30、構(gòu)如圖3-10所示。byte7byte6byte5byte4byte3byte2byte1byte031.24段基址屬性(見下圖) 23.0 段基址 15.0 段界限7654321076543210gd/b0avl段界限2(19.16)pdplstype圖3-10 代碼段描述符 代碼段描述符共8個(gè)字節(jié),其中對(duì)應(yīng)代碼段的段基址占4個(gè)字節(jié),在中斷處理過程中其存放的是中斷處理程序的所在代碼段的段基址。段界限占2.5個(gè)字節(jié),其規(guī)定著代碼段的大小范圍。段屬性占1.5個(gè)字節(jié),對(duì)于其具體含義作用將在下一節(jié)中詳細(xì)敘述。在描述符表中的描述符的數(shù)量是很多的,因此怎樣才能找到所需要的描述符呢,在這里有必要引出另一個(gè)

31、概念:選擇子。其結(jié)構(gòu)如表3-2所示。 表3-3 選擇子1514131211109876543210描述符索引tirpl選擇子由16位組成,其存放的是對(duì)應(yīng)描述符的索引,也就是描述符在描述符表中的偏移。其中第二位ti規(guī)定選擇子指向何種描述符表,ti=0指向全局描述符表;ti=1指向局部描述符表。rpl規(guī)定了選擇子擁有的特權(quán)級(jí),也就是訪問相應(yīng)段的權(quán)限。段描述符表有兩種,即全局描述符表(gdt)和局部描述符表(ldt),而與中斷處理程序相關(guān)的段描述符一般是存放在gdt中。與普通用戶程序相關(guān)的段描述符一般存放在局部描述符表中。cpu為了能找到相應(yīng)的描述符表,提供了兩個(gè)寄存器gdtr和ldtr,這兩個(gè)寄存

32、器分別提供gdt和ldt的物理地址,并可以用lgdt 和lldt匯編指令分別將其物理地址加載至寄存器。3.2.2 中斷描述符表idt3.2.2.1 中斷描述符簡介中斷描述符又稱為中斷門描述符,其為門描述符的一種。與段描述符一樣,中斷描述符也有8個(gè)字節(jié)。但與段描述符不同的是,在中斷描述符中有四個(gè)字節(jié)為偏移地址,這32位的偏移地址提供了中斷處理程序在代碼段中的偏移地址。同時(shí)還有2個(gè)字節(jié)為選擇子,其提供了對(duì)應(yīng)段描述符的選擇子,也就是間接的提供了中斷處理程序所在代碼段的段基址,因此構(gòu)建中斷描述符成為執(zhí)行中斷處理程序的前提條件。中斷描述符的具體結(jié)構(gòu)如圖3-11所示。byte7byte6byte5byte

33、4byte3byte2byte1byte031.16偏移屬性(見下圖)選擇子15.0偏移7654321076543210pdplstype000保留圖3-11 中斷描述符在中斷描述符中有兩個(gè)字節(jié)即16位為屬性,其每一位都有不同的意義。其具體意義如表3-4所示。 表3-4 中斷描述符屬性屬性概括說明具體說明p存在位p=1段在內(nèi)存中存在p=2段在內(nèi)存中不存在dpl表示描述符的特權(quán)級(jí)其范圍為03s說明描述符的類型s=1數(shù)據(jù)段和代碼段描述符s=0系統(tǒng)段和門描述符type描述符類型type=0xe386以上中斷門描述符其中dpl為描述符所擁有的特權(quán)級(jí),也就是其所對(duì)應(yīng)的段擁有的特權(quán)級(jí),特權(quán)級(jí)的分類如圖3-

34、12。level 1level 0level 2level 3操作系統(tǒng)內(nèi)核系統(tǒng)服務(wù)應(yīng)用進(jìn)程圖3-12 特權(quán)級(jí)特權(quán)級(jí)共有4個(gè)特權(quán)級(jí)別,從高到低分別是0、1、2、3,數(shù)字越小表示特權(quán)級(jí)越大。較為核心的代碼和數(shù)據(jù),將被放在特權(quán)級(jí)較高的層級(jí)中,如中斷處理程序就處在內(nèi)核級(jí)的代碼段中,其特權(quán)級(jí)為0。cpu使用這樣的機(jī)制來避免低特權(quán)級(jí)的任務(wù)在不被允許的情況下訪問位于高特權(quán)級(jí)的段,使段與段間的訪問更為安全。中斷描述符存放在中斷描述符表(idt)中,idt可容納256個(gè)中斷描述符,其用中斷號(hào)0255來標(biāo)識(shí),但中斷號(hào)為031為系統(tǒng)異常和保留的,用戶不能使用。同樣,cpu提供一個(gè)idtr寄存器用來保存中斷描述符表的

35、物理地址,并可使用lidt匯編指令將物理地址加載入寄存器中。3.2.2.2 中斷描述符表的實(shí)現(xiàn)idt表由中斷描述符構(gòu)成,因此需先創(chuàng)建中斷描述符結(jié)構(gòu)體gate。typedef struct s_gatet_16offset_low;/* 偏移地址的低16位 */t_16selector;/* 代碼段描述符的選擇子*/t_8dcount;/*屬性的低8位*/t_8attr;/* 屬性的高8位*/t_16offset_high;/*偏移地址的高16位*/gate;其中,t_16,t_8分別為unsigned short和unsigned char。將中斷描述符表定義成一個(gè)數(shù)組idtidt_size,

36、其大小idt_size 為256,每一個(gè)數(shù)組元素即為一個(gè)中斷描述符。為了存放idt表的物理地址,定義了數(shù)組idt_ptr,大小為6。其中idt_ptr01存放idt表的界限,idt_ptr25存放idt表的段基址。并同時(shí)對(duì)其進(jìn)行了賦值。t_8idt_ptr6;/ 015:limit 1647:baset_16* p_idt_limit = (t_16*)(&idt_ptr0);t_32* p_idt_base = (t_32*)(&idt_ptr2);*p_idt_limit = idt_size * sizeof(gate) - 1;*p_idt_base = (t_32)&idt;并在相應(yīng)

37、的匯編代碼中將其物理地址進(jìn)行加載至idtr寄存器中。lidtidt_ptr調(diào)用初始化中斷描述符函數(shù)init_idt_desc,因?yàn)閮H僅使用的是鍵盤中斷,因此這里僅僅初始化了鍵盤中斷所對(duì)應(yīng)的中斷描述符。init_idt_desc(int_vector_irq0 + 1,da_386igate, hwint01,privilege_krnl);其中 int_vector_irq0為0x20/即irq0的中斷號(hào)。da_386igate為0x8e即 386 中斷門類型值。hwint01為相應(yīng)的鍵盤中斷處理程序。privilege_krnl為0即為最高特權(quán)級(jí)。此函數(shù)的具體定義為:void init_id

38、t_desc(unsigned char vector, t_8 desc_type, t_pf_int_handler handler, unsigned char privilege)gate *p_gate= &idtvector;/*指定idt中的中斷描述符*/t_32base= (t_32)handler;p_gate-offset_low= base & 0xffff;p_gate-selector= selector_kernel_cs;/*指向系統(tǒng)的代碼段*/p_gate-dcount= 0;p_gate-attr= desc_type | (privilege offset_

39、high= (base 16) & 0xffff;至此中斷描述符表創(chuàng)建并初始化完畢。3.2.3 編程實(shí)現(xiàn)中斷處理過程cpu利用中斷號(hào)在idt表找到相應(yīng)的中斷描述符,并根據(jù)此中斷描述符找到相應(yīng)的中斷處理程序,其具體過程如圖3-13所示。目標(biāo)代碼段idt偏移中斷號(hào)中斷描述符中斷處理程序idt物理地址段gdt 段基址 段描述符idtr圖3-13 idt到中斷處理程序的對(duì)應(yīng)過程以鍵盤中斷為例,cpu首先從idtr寄存器中得到中斷描述符表idt的物理地址,即確定了idt表在內(nèi)存中的位置,再利用8259a傳遞來的中斷號(hào)在表中找到相應(yīng)的中斷描述符,然后利用中斷描述符所提供的選擇子找到相應(yīng)的段描述符,也就是找

40、到了中斷處理程序所在段的段基址,再利用中斷描述符所提供的偏移地址找到中斷處理程序的具體位置。在鍵盤中斷描述符表中,中斷處理程序的偏移地址hwint01,其定義如下:hwint01:hwint_master1 ;其中“1”為傳遞參數(shù)其中hwint_master為匯編中的宏,定義如下:%macrohwint_master1 ;其中“1”為參數(shù)的個(gè)數(shù),%1表示第一個(gè)參數(shù)。pushad ;將寄存器的內(nèi)容和相關(guān)信息壓入進(jìn)程表pushdspushes pushfs pushgs inal, int_m_ctlmaskoral, (1 %1) outint_m_ctlmask, al ;屏蔽當(dāng)前中斷即屏蔽i

41、rq1。sti ;開中斷push%1 callirq_table + 4 * %1 ;執(zhí)行相應(yīng)的中斷處理程序popecx cli ;關(guān)中斷moval, eoi ;置eoi位,為正常eoi結(jié)束方式。outint_m_ctl, al inal, int_m_ctlmask andal, (1 %1) ;恢復(fù)接受當(dāng)前中斷outint_m_ctlmask, alsti ;開中斷popgs ;將進(jìn)程表中的值依次出棧popfspopespopdspopadret%endmacro其中置eoi位,即是往相應(yīng)的寄存器中寫入ocw2命令字。其中eoi定義為0x20。其中irq_table是一個(gè)數(shù)組,其中斷處理程

42、序就放在此數(shù)組中。在執(zhí)行中斷處理程序的時(shí)候,要中斷當(dāng)前正在執(zhí)行的進(jìn)程,因而需要保存當(dāng)前正在執(zhí)行的進(jìn)程的狀態(tài)和信息,即要把當(dāng)前進(jìn)程所使用的段寄存器、通用寄存器的值進(jìn)行壓棧。因此需建立進(jìn)程表,其就是用來存放當(dāng)前進(jìn)程所使用的各種寄存器的值和必要的信息。對(duì)應(yīng)每個(gè)進(jìn)程來說,都有一個(gè)進(jìn)程表與之對(duì)應(yīng)。當(dāng)中斷發(fā)生時(shí),就將各種寄存器的內(nèi)容和必要的信息壓入相應(yīng)的進(jìn)程表中;當(dāng)中斷結(jié)束后, 就將進(jìn)程表中的值依次出棧,即恢復(fù)到進(jìn)程被中斷前的狀態(tài),繼續(xù)執(zhí)行進(jìn)程。其進(jìn)程表的結(jié)構(gòu)如表3-5所示。表3-5 進(jìn)程表gsfsesdsediesiebpespebxedxecxeaxretaddreipcseflagsespssldt

43、 selectordescriptor1descriptor2當(dāng)某個(gè)進(jìn)程在執(zhí)行的過程中,ss,esp分別指向是當(dāng)前進(jìn)程的內(nèi)部堆棧段的段基址和偏移地址。當(dāng)發(fā)生中斷時(shí),為了保存進(jìn)程所使用的寄存器的內(nèi)容和必要的信息,ss及esp必須指向其對(duì)應(yīng)進(jìn)程表的棧頂,可如何得到該進(jìn)程表的棧頂?shù)刂纺亍pu提供一個(gè)的棧來存放進(jìn)程表的ss及esp,這個(gè)棧就是tss(task-state stack)。tss的結(jié)構(gòu)中ss,esp部分如表3-6所示。 表3-6 tss中ss及esp31 15 0 ss2 esp2 ss1 esp1 ss0 esp0其中ss0,esp0代表特權(quán)級(jí)0下的ss,esp,而進(jìn)程表的所在堆棧段的

44、選擇子和偏移地址也正是由ss0和esp0提供的。因此只需將進(jìn)程表相應(yīng)的相應(yīng)地址賦給tss中的ss0和esp0即可。同樣cpu提供了tr寄存器用于存放tss的所在段的選擇子,并通過ltr指令將其加載至寄存器。當(dāng)發(fā)生中斷時(shí),cpu會(huì)自動(dòng)從tr寄存器中讀取其中的選擇子,并找到相應(yīng)的tss,進(jìn)而找到tss中的ss0和esp0。esp由進(jìn)程的堆棧段到進(jìn)程表的切換過程如圖3-14所示。進(jìn)程p代碼段esp數(shù)據(jù)段堆棧段進(jìn)程運(yùn)行時(shí),esp指向進(jìn)程堆棧的某個(gè)位置中斷發(fā)生時(shí),從ring1跳到ring0,esp的值變成了tss中預(yù)設(shè)的ring0下的值esp進(jìn)程x進(jìn)程p 圖3-14 esp切換過程3.3 本章小結(jié)在本章

45、中分別從軟硬件兩方面對(duì)中斷處理機(jī)制進(jìn)行了實(shí)現(xiàn)。在硬件實(shí)現(xiàn)方面,詳細(xì)的介紹了8259a的外部引腳,內(nèi)部結(jié)構(gòu)及其工作原理,并編程實(shí)現(xiàn)了相關(guān)配置,也就是對(duì)8259a的內(nèi)部寄存器進(jìn)行了設(shè)置。在軟件實(shí)現(xiàn)方面,詳細(xì)的介紹了保護(hù)模式,中斷描述符表idt,并編程實(shí)現(xiàn)了中斷處理流程,其中重點(diǎn)的講解了中斷描述符表的建立過程。在編寫代碼的過程中,需要在c語言中調(diào)用相關(guān)的匯編代碼,因此總結(jié)了在c語言中的如何使用匯編代碼,這在編寫代碼的過程中是十分重要的。第4章 鍵盤驅(qū)動(dòng)的實(shí)現(xiàn)4.1 鍵盤簡述4.1.1 鍵盤種類鍵盤按其接口可分為at鍵盤,ps/2鍵盤和usb鍵盤,其中at和ps/2鍵盤分別采用的是”5-pin din

46、”和”6-pin mini-din”接口7。其具體結(jié)構(gòu)如圖4-1所示。5-pin din342516421356-pin mini-din 圖4-1 at和ps/2鍵盤接口ps/2鍵盤是在at鍵盤的基礎(chǔ)上,在功能上進(jìn)行了一些擴(kuò)展,因?yàn)楸菊撐氖褂玫氖莗s/2鍵盤,因此在這里簡單的介紹一下ps/2接口。ps/2接口是ibm公司生產(chǎn)的6針的圓型接口。其中的4針傳輸數(shù)據(jù)和供電,其余2個(gè)為空腳。ps/2接口的傳輸速率比com接口稍快一些,而且是atx主板的標(biāo)準(zhǔn)接口,是目前應(yīng)用最為廣泛的鍵盤接口之一8。4.1.2 鍵盤內(nèi)部結(jié)構(gòu)鍵盤主要有鍵盤編碼器8048和鍵盤控制器8042組成。其中8048在鍵盤中,80

47、42在主機(jī)中。其具體位置如圖4-2所示。圖4-2 鍵盤硬件結(jié)構(gòu)鍵盤編碼器8048的作用是監(jiān)視鍵盤輸入,對(duì)按鍵進(jìn)行編碼,并把適當(dāng)?shù)臄?shù)據(jù)傳送給計(jì)算機(jī)9。鍵盤控制器8042用來接收和解碼來自鍵盤的數(shù)據(jù),并與8259a以及軟件等進(jìn)行通信。cpu從8042的數(shù)據(jù)寄存器中讀取到鍵盤發(fā)送的數(shù)據(jù),并對(duì)其進(jìn)行處理10。8042的寄存器如表4-1所示。 表4-1 8042的寄存器寄存器名稱寄存器大小端口r/w用法數(shù)據(jù)寄存器1byte0x60read/write接收發(fā)送數(shù)據(jù)狀態(tài)寄存器1byte0x64read讀狀態(tài)寄存器控制寄存器1byte0x64write發(fā)送命令4.2 鍵盤工作原理4.2.1 鍵盤掃描碼當(dāng)敲擊鍵

48、盤時(shí),會(huì)產(chǎn)生兩方面的含義:動(dòng)作和內(nèi)容。動(dòng)作可分解為成三類:按下、保持按住的狀態(tài)以及放開;內(nèi)容則是鍵盤上不同的鍵,字母鍵還是數(shù)字鍵,回車鍵還是箭頭鍵。所以,根據(jù)敲擊動(dòng)作產(chǎn)生的編碼,8048既要反映”哪個(gè)”按鍵產(chǎn)生了動(dòng)作,還要反映產(chǎn)生了”什么”動(dòng)作。敲擊鍵盤所產(chǎn)生的編碼被稱做掃描碼(scan code),它分為make code和break code兩類。當(dāng)一個(gè)鍵被按下或者保持按住按下時(shí),將會(huì)產(chǎn)生make code,當(dāng)鍵彈起時(shí),會(huì)產(chǎn)生break code。除了pause鍵之外,每一個(gè)按鍵都對(duì)應(yīng)一個(gè)make code和一個(gè)break code。掃描碼總共有三套,分別叫做scan code set 1

49、、scan code set 2和scan code set 3。scan code set 1是早期鍵盤使用的,現(xiàn)在鍵盤默認(rèn)都支持scan code set 2,而scan code set 3很少使用。雖然鍵盤支持scan code set 2,但為了和早期的鍵盤進(jìn)行兼容,鍵盤控制器8042又將掃描碼轉(zhuǎn)化為scan code set 1。由于鍵盤的按鍵有很多,這里僅僅列出部分按鍵的scan code set 1掃描碼。如表4-2所示。 表4-2 部分按鍵的掃描碼表keymake codebreak codea0x1e0x9eb0x300x2ec0x2e0xaed0x200xa0e0x120x92f0x210xa1g0x220xa2h0x230xa3i0x170x97j0x240xa4k0x250xa5l0x260xa6m0x320xb200x0b0x8b10x20x8220x30x8330x40x8440x50x8550x60x8660x70x8770x80x8880x90x89l shift0x2a0xaal ctrl0x1d0x9dl alt0x380xb8e

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論