版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、畢業(yè)設(shè)計(jì)(論文)簡(jiǎn)化的8088cpu邏輯功能的仿真實(shí)現(xiàn)論文作者姓名:申請(qǐng)學(xué)位專業(yè):申請(qǐng)學(xué)位類別:指導(dǎo)教師姓名(職稱):論文提交日期: 簡(jiǎn)化的8088cpu邏輯功能的仿真實(shí)現(xiàn)摘 要 “虛擬實(shí)驗(yàn)平臺(tái)”主要采用以“軟”代“硬”和“虛”、“實(shí)”結(jié)合的設(shè)計(jì)思路,強(qiáng)調(diào)實(shí)用性,以最大限度地仿真真實(shí)的實(shí)驗(yàn)環(huán)境。主要實(shí)現(xiàn)了“專用實(shí)驗(yàn)臺(tái)”的虛擬化,將它“搬”到了“微機(jī)”的顯示器上,而原有在微機(jī)上的實(shí)驗(yàn)操作環(huán)境和方法仍然保持不變。系統(tǒng)還提供必要的測(cè)試儀器和工具(如示波器等),以便在實(shí)驗(yàn)調(diào)試時(shí)能夠?qū)\(yùn)行結(jié)果進(jìn)行監(jiān)視或測(cè)量,如輸出電平或波形,這種虛擬的測(cè)試儀器和工具也在界面和操作方面做到了盡可能的逼真。本文介紹了該虛擬
2、試驗(yàn)平臺(tái)的整體功能特點(diǎn),主要介紹了8088cpu的結(jié)構(gòu),工作方式,以及如何用vc實(shí)現(xiàn)這些具體功能的編程方法。并加入了一些程序片段,對(duì)完成工作中遇到的困難也做了些總結(jié)。關(guān)鍵詞:仿真試驗(yàn)平臺(tái);8088cpu;vc;封裝;寄存器;移植 implementation of simplified model 8088 cpus logic functionabstract"virtual platform" principal use "soft" to instead of "hard" and "superficial"
3、, "real" combination of design ideas, emphasize practicality, to maximize the simulation of the real environment. major implementation of the "exclusive experimental station," the virtual, it will be "moved" to the "pc" display, the original pc in the lab envi
4、ronment and methods remain unchanged. the system also provides the necessary test equipment and tools (such as oscilloscopes, etc.) experimental testing in order to be able to run when the results of surveillance or measurements, such as the output level or waveform, this virtual testing equipment a
5、nd tools also interface and the operation done in a realistic as possible. this paper introduces the virtual test platform overall features, mainly on the structure of the 8088 cpu, work methods, and how to use vc these specific functional programming method. and the inclusion of some procedures foo
6、tage completed work on the difficulties encountered also made some conclusion.key words: virtual experement platform;8088cpu8; vc; encapsulation;register;port目錄論文總頁(yè)數(shù):581頁(yè)1 概述11.1課題背景及意義11.2項(xiàng)目介紹11.2.1虛擬化技術(shù)簡(jiǎn)介11.2.2 cpu虛擬化技術(shù)簡(jiǎn)介21.3項(xiàng)目要求22 vc+6.0的編程22.1 mfc編程22.2 dll相關(guān)知識(shí)23 8088cpu介紹33.1. 概述33.2 8088cpu引線及
7、其功能33.3 8088cpu的內(nèi)部結(jié)構(gòu)43.4 時(shí)序53.5 簡(jiǎn)化的8088cpu模型概述53.6移植bochs仿真實(shí)現(xiàn)8088cpu功能的基本思路74 bochs介紹74.1 bochs概述74.2 類 bx_cpu_c 介紹74.2.1 主要的數(shù)據(jù)成員74.2.2 主要的成員函數(shù)84.3 bx_cpu_c 類對(duì)cpu工作流程的簡(jiǎn)易描述94.4 基本內(nèi)存系統(tǒng)114.4內(nèi)存的訪問124.5 bochs 時(shí)鐘系統(tǒng)144.6 bochs中斷系統(tǒng)155 具體移植實(shí)現(xiàn)175.1 虛擬實(shí)驗(yàn)平臺(tái)統(tǒng)一的器件模型175.2 cpu類的主要功能及實(shí)現(xiàn)方法175.2.1 修改cpu loop185.2.2 修改
8、插庫(kù)18結(jié) 論18參考文獻(xiàn)19致 謝20聲 明21簡(jiǎn)化的8088cpu邏輯功能的仿真實(shí)現(xiàn)1 概述1.1課題背景及意義過去當(dāng)人們?cè)陂_發(fā)一個(gè)項(xiàng)目時(shí)可能會(huì)遇到以下問題(1)經(jīng)??嘤诮?jīng)費(fèi)不足,缺少足夠的硬件開發(fā)板和完善的軟件開發(fā)環(huán)境,相關(guān)的書籍對(duì)一些最新軟件的分析還不夠全面(2)高層次的軟件設(shè)計(jì)和開發(fā)一般不用過多考慮底層硬件的實(shí)現(xiàn)細(xì)節(jié),如果直接處于一具體的硬件環(huán)境下,在開發(fā)和研究中可能會(huì)陷入硬件的具體細(xì)節(jié)中不能自拔,而不能把精力放到高層次的軟件設(shè)計(jì)和開發(fā)上。(3)如果硬件開發(fā)環(huán)境不太穩(wěn)定(這種情況經(jīng)常見到),且對(duì)身體的硬件不是很了解,則可能在排除問題上花費(fèi)大量不必要的時(shí)間,所以人們利用仿真技術(shù)來解決這
9、些問題以到達(dá)節(jié)約人力物力的目的。1.2項(xiàng)目介紹1.2.1虛擬化技術(shù)簡(jiǎn)介從1965年ibm在7044機(jī)上首次實(shí)現(xiàn)虛擬技術(shù)以來,這一名詞對(duì)于計(jì)算機(jī)世界來說已經(jīng)不是一個(gè)新名詞。虛擬化是一個(gè)廣義的術(shù)語(yǔ),在計(jì)算機(jī)方面通常是指計(jì)算元件在虛擬的基礎(chǔ)上而不是真實(shí)的基礎(chǔ)上運(yùn)行。虛擬化技術(shù)可以擴(kuò)大硬件的容量,簡(jiǎn)化軟件的重新配置過程。虛擬化技術(shù)與多任務(wù)以及超線程技術(shù)是完全不同的。多任務(wù)是指在一個(gè)操作系統(tǒng)中多個(gè)程序同時(shí)并行運(yùn)行,而在虛擬化技術(shù)中,則可以同時(shí)運(yùn)行多個(gè)操作系統(tǒng),而且每一個(gè)操作系統(tǒng)中都有多個(gè)程序運(yùn)行,每一個(gè)操作系統(tǒng)都運(yùn)行在一個(gè)虛擬的cpu或者是虛擬主機(jī)上。當(dāng)我們嘗試著理解虛擬技術(shù)時(shí),首先必須要理解“虛擬”的
10、概念。“虛擬”這個(gè)詞最早來源于光學(xué),用于理解鏡子里的物體?,F(xiàn)在,“虛擬”這個(gè)詞已經(jīng)經(jīng)過演化,用來描述任何真實(shí)物體的模擬了,例如分區(qū)、虛擬機(jī)、虛擬內(nèi)存、虛擬磁盤和虛擬現(xiàn)實(shí)。在討論虛擬技術(shù)的時(shí)候,使用“虛擬”這個(gè)詞,是因?yàn)槲覀兿M摂M機(jī)看起來和工作起來都和真正的機(jī)器一模一樣。這意味著,虛擬機(jī)并不是真正的機(jī)器,但是它能像真正的機(jī)器一模一樣地工作。實(shí)際上,從原理上看,所有虛擬技術(shù)虛擬的是指令集。所有的it設(shè)備,不管是pc、服務(wù)器還是存儲(chǔ),都有一個(gè)共同點(diǎn):它們被設(shè)計(jì)用來完成一組特定的指令。這些指令組成一個(gè)指令集。對(duì)于虛擬技術(shù)而言,“虛擬”實(shí)際上就是指的這些指令集。虛擬機(jī)有許多不同的類型,但是它們有一個(gè)共
11、同的主題就是模擬一個(gè)指令集的概念。每個(gè)虛擬機(jī)都有一個(gè)用戶可以訪問的指令集。虛擬機(jī)把這些虛擬指令“映射”到計(jì)算機(jī)的實(shí)際指令集。虛擬化技術(shù)也與目前vmware workstation等同樣能達(dá)到虛擬效果的軟件不同,是一個(gè)巨大的技術(shù)進(jìn)步,具體表現(xiàn)在減少軟件虛擬機(jī)相關(guān)開銷和支持更廣泛的操作系統(tǒng)方面。按照虛擬層所處位置的不同,目前所有的虛擬技術(shù)大致可以分為硬件虛擬、邏輯虛擬、軟件虛擬和應(yīng)用虛擬四種類型。1.2.2 cpu虛擬化技術(shù)簡(jiǎn)介 cpu的虛擬化技術(shù)是一種硬件方案,支持虛擬技術(shù)的cpu帶有特別優(yōu)化過的指令集來控制虛擬過程,通過這些指令集,vmm會(huì)很容易提高性能,相比軟件的虛擬實(shí)現(xiàn)方式會(huì)很大程度上提高
12、性能。虛擬化技術(shù)可提供基于芯片的功能,借助兼容vmm軟件能夠改進(jìn)純軟件解決方案。由于虛擬化硬件可提供全新的架構(gòu),支持操作系統(tǒng)直接在上面運(yùn)行,從而無(wú)需進(jìn)行二進(jìn)制轉(zhuǎn)換,減少了相關(guān)的性能開銷,極大簡(jiǎn)化了vmm設(shè)計(jì),進(jìn)而使vmm能夠按通用標(biāo)準(zhǔn)進(jìn)行編寫,性能更加強(qiáng)大。另外,在純軟件vmm中,目前缺少對(duì)64位客戶操作系統(tǒng)的支持,而隨著64位處理器的不斷普及,這一嚴(yán)重缺點(diǎn)也日益突出。而cpu的虛擬化技術(shù)除支持廣泛的傳統(tǒng)操作系統(tǒng)之外,還支持64位客戶操作系統(tǒng)。 虛擬化技術(shù)是一套解決方案。完整的情況需要cpu、主板芯片組、bios和軟件的支持,例如vmm軟件或者某些操作系統(tǒng)本身。即使只是cpu支持虛擬化技術(shù),在
13、配合vmm的軟件情況下,也會(huì)比完全不支持虛擬化技術(shù)的系統(tǒng)有更好的性能。1.3項(xiàng)目要求綜合運(yùn)用以前所學(xué)的專業(yè)知識(shí),設(shè)計(jì)開發(fā)一個(gè)簡(jiǎn)化的8088cpu功能模擬的演示軟件;在設(shè)計(jì)與開發(fā)中,將cpu與存儲(chǔ)器整合在一起的模型,1.實(shí)現(xiàn)cpu的指令系統(tǒng) 2. 實(shí)現(xiàn)cpu的時(shí)序邏輯 2 vc+6.0的編程2.1 mfc編程mfc用類編寫windows應(yīng)用程序的c+類集,以層次結(jié)構(gòu)組織起來,其中封裝了大部分windows api函數(shù)和 windows控件,而基礎(chǔ)的虛擬平臺(tái)就是在次基礎(chǔ)之上而開發(fā)出的。使用mfc類庫(kù)和visual c+提供的高度可視的應(yīng)用程序開發(fā)工具,可是應(yīng)用程序開發(fā)變的更簡(jiǎn)單,開發(fā)周期極大地縮短
14、,提高代碼的可靠性和可重用性。它提供的類庫(kù)對(duì)程序設(shè)計(jì)的高度抽象,使得程序員不用放在程序設(shè)計(jì)的具體細(xì)節(jié)上,而是對(duì)功能的擴(kuò)展上,大大簡(jiǎn)化了開發(fā)工作。在開發(fā)過程中,我們所做的就是編寫封裝器件的程序,由平臺(tái)調(diào)用之來顯示出控件,除了編寫一些相關(guān)消息響應(yīng)函數(shù)外,大部分工作由系統(tǒng)完成。2.2 dll相關(guān)知識(shí)比較大的應(yīng)用程序都由很多模塊組成,這些模塊分別完成相對(duì)獨(dú)立的功能,它們彼此協(xié)作來完成整個(gè)軟件系統(tǒng)的工作??赡艽嬖谝恍┠K的功能較為通用,在構(gòu)造其它軟件系統(tǒng)時(shí)仍會(huì)被使用。在構(gòu)造軟件系統(tǒng)時(shí),如果將所有模塊的源代碼都靜態(tài)編譯到整個(gè)應(yīng)用程序 exe 文件中,會(huì)產(chǎn)生一些問題:一個(gè)缺點(diǎn)是增加了應(yīng)用程序的大小,它會(huì)占用
15、更多的磁盤空間,程序運(yùn)行時(shí)也會(huì)消耗較大的內(nèi)存空間,造成系統(tǒng)資源的浪費(fèi);另一個(gè)缺點(diǎn)是,在編寫大的 exe 程序時(shí),在每次修改重建時(shí)都必須調(diào)整編譯所有源代碼,增加了編譯過程的復(fù)雜性,也不利于階段性的單元測(cè)試。windows 系統(tǒng)平臺(tái)上提供了一種完全不同的較有效的編程和運(yùn)行環(huán)境,你可以將獨(dú)立的程序模塊創(chuàng)建為較小的 dll (dynamic linkable library) 文件,并可對(duì)它們單獨(dú)編譯和測(cè)試。在運(yùn)行時(shí),只有當(dāng) exe 程序確實(shí)要調(diào)用這些 dll 模塊的情況下,系統(tǒng)才會(huì)將它們裝載到內(nèi)存空間中。這種方式不僅減少了 exe 文件的大小和對(duì)內(nèi)存空間的需求,而且使這些 dll 模塊可以同時(shí)被多個(gè)
16、應(yīng)用程序使用。windows 自己就將一些主要的系統(tǒng)功能以 dll 模塊的形式實(shí)現(xiàn)。3 8088cpu介紹3.1. 概述 8088是8080和8085的改進(jìn)型,像8080和8085一樣,它的指令是以字節(jié)為基礎(chǔ)構(gòu)成的。它的性能的提高,主要依賴于采取了以下一些特殊措施。 1. 建立4字節(jié)的指令預(yù)取隊(duì)列 2. 設(shè)立地址段寄存器 3. 在結(jié)構(gòu)上和指令設(shè)置方面支持多微處理器系統(tǒng) 一般處理器與8088cpu處理器指令過程見圖表1 圖表 1 一般處理器與8088處理器指令執(zhí)行過程對(duì)比(a)一般處理器指令執(zhí)行過程;(b)8088處理器指令執(zhí)行過程3.2 8088cpu引線及其功能 8088cpu是一塊具有40
17、條引出線的集成電路芯片,其各引出線的定義如圖22所示。為了減少芯片的引線,有許多引線具有雙重定義和功能,采用分時(shí)復(fù)用方式工作,即在不同時(shí)刻,這些引線上的信號(hào)是不相同的,其管腳引線如圖表2。 圖表 2 8088處理器芯片引線圖3.3 8088cpu的內(nèi)部結(jié)構(gòu)8088微處理器內(nèi)部分為兩個(gè)部分:執(zhí)行單元(eu)和總線接口單元(biu),如圖表3所示。 圖表 3 8088cpu的內(nèi)部結(jié)構(gòu) 8088處理器中的內(nèi)部寄存器用戶能用指令改變其內(nèi)容的,主要是一組內(nèi)部寄存器,其結(jié)構(gòu)如圖表4所示。 1)數(shù)據(jù)寄存器 8088有4個(gè)16位的數(shù)據(jù)寄存器,可以存放16位的操作數(shù)。 2) 指針寄存器 8088的指針寄存器有兩
18、個(gè):sp和bp。sp是堆棧指針寄存器,由它和堆棧段寄存器一起來確定堆棧在內(nèi)存中的位置。bp是基數(shù)指針寄存器,通常用于存放基地址,以使8088的尋址更加靈活。 3)變址寄存器si是源變址寄存器,di是目的變址寄存器,都用于指令的變址尋址。 4)控制寄存器8088的控制寄存器有兩個(gè):ip,psw。ip是指令指針寄存器,用來控制cpu的指令執(zhí)行順序。 圖表 4 8088cpu的內(nèi)部結(jié)構(gòu)3.4 時(shí)序 在8088cpu中,cpu與內(nèi)存或接口間進(jìn)行通信,如將一個(gè)字節(jié)寫入內(nèi)存一個(gè)單元(或接口),或者從內(nèi)存某單元(或某接口)讀一個(gè)字節(jié)到cpu,這種讀(或)寫的過程稱為一個(gè)總線周期。3.5 簡(jiǎn)化的8088cpu
19、模型概述 本設(shè)計(jì)的設(shè)計(jì)目標(biāo)是設(shè)計(jì)一個(gè)簡(jiǎn)化的8088cpu模型,要求模型體現(xiàn)8088cpu的主要功能,省略掉其很多繁瑣的細(xì)節(jié)。基于此考慮,簡(jiǎn)化模型主要從如下幾個(gè)方面對(duì)8088cpu作了簡(jiǎn)化:1 取消8088里的取指令、執(zhí)行指令流水線2 取消8088里的指令預(yù)取對(duì)列3 取消8088里管腳的分時(shí)復(fù)用功能4 將存儲(chǔ)器與cpu融合,簡(jiǎn)化存儲(chǔ)器讀寫總線周期5 對(duì)8088的管腳也重新進(jìn)行了設(shè)置。管腳設(shè)置如圖表5所示,cpu內(nèi)部功能結(jié)構(gòu)如圖表6所示: 圖表 4簡(jiǎn)化8088cpu管腳分布 圖表 5 簡(jiǎn)化8088cpu內(nèi)部功能結(jié)構(gòu) 3.6移植bochs仿真實(shí)現(xiàn)8088cpu功能的基本思路cpu指令系統(tǒng)和時(shí)序邏輯是
20、本設(shè)計(jì)難點(diǎn),而我們解決難點(diǎn)采取的辦法是移植虛擬機(jī)bochs,它包含了8088下所有cpu指令的仿真函數(shù)實(shí)現(xiàn)。而且還專門預(yù)留了一個(gè)插槽庫(kù)供擴(kuò)展bochs使用。bochs很龐雜,也很少文獻(xiàn)資料,了解bochs成為我們前期的工作。4 bochs介紹4.1 bochs概述bochs是一個(gè)x86的模擬器,它可以模擬幾乎所有類型的x86 cpu,包括16位,32位和64位(x86_64)。一個(gè)64位的x86可以看作是32位和16位x86的超集。x86_64的工作方式包括以下兩類:1,ia-32模式:包括實(shí)模式,保護(hù)模式和虛擬8086模式三個(gè)子模式。2,ia-32e模式:包括長(zhǎng)模式和兼容模式。在bochs中
21、,用bx_cpu_c類來模擬cpu,它支持上面提到的每一種模式。4.2 類 bx_cpu_c 介紹4.2.1 主要的數(shù)據(jù)成員char name64,代表cpu的名字。unsigned bx_cpuid,cpu的id號(hào),用于smp(對(duì)稱多處理)的機(jī)器。bx_gen_reg_t gen_regbx_general_registers,bx_gen_reg_t是一個(gè)復(fù)雜的結(jié)構(gòu)體,它表示一個(gè)64位的通用寄存器,其主要成員有:rrx:表示一個(gè)完整的64位寄存器。hrx、erx:分別表示64位寄存器的高32位與低32位,這時(shí)候64位的寄存器被分割成2個(gè)32位寄存器使用。rx:表示erx的低16位,此時(shí)寄存
22、器被當(dāng)作16位寄存器使用。rh、rl:分別表示rx的高8位與低8位,此時(shí)rx被分割成2個(gè)8位寄存器。gen_reg就是一個(gè)代表通用寄存器的數(shù)組,bx_general_registers是寄存器的個(gè)數(shù),如果模擬的是64位處理器,那么bx_general_registers值為16,否則值為8。64位時(shí)通用寄存器分別是rax、rcx、rdx、rbx、rsp、rbp、rsi、rdi、r8r15;32位時(shí)沒有r8r15 。bit64u rip; bit32u eip;分別是64位模式和32位模式下的指令指示器。bx_segment_reg_t sregs6;bx_segment_reg_t是表示段寄存
23、器的結(jié)構(gòu),sregs6是表示了6個(gè)段寄存器的數(shù)組。分別是es、cs、ss、ds、fs和gs。bx_mem_c *mem;mem是指向這個(gè)cpu所使用的內(nèi)存的指針 。bx_local_apic_c local_apic;bx_local_apic是模擬本地apic的類,用于smp系統(tǒng)。 unsigned cpu_mode;就是前面提到的cpu的工作模式,主要有5種,分別是實(shí)模式(16位模式)、8086虛擬模式(32位模式下的虛擬16位模式)、保護(hù)模式(32位模式)、兼容模式(64位模式下的虛擬32位,16位模式)和長(zhǎng)模式(64位模式)。分別使用宏bx_mode_ia32_real、bx_mode
24、_ia32_v8086、bx_mode_ia32_protected、bx_mode_long_compat和bx_mode_long_64表示。4.2.2 主要的成員函數(shù)void cpu_loop(bit32s max_instr_count)cpu_loop是一個(gè)非常重要的函數(shù),所有的指令函數(shù)都在這里執(zhí)行。參數(shù)max_instr_count表示cpu_loop執(zhí)行的最大指令數(shù)。 void prefetch(void)預(yù)取指令函數(shù),計(jì)算指令的物理地址和其他相關(guān)信息,為后面的指令譯碼作準(zhǔn)備。unsigned fetchdecode(bit8u *iptr, bxinstruction_c *i
25、nstruction,unsigned remain)unsigned fetchdecode64(bit8u *iptr, bxinstruction_c *instruction,unsigned remain)這兩個(gè)函數(shù)用于對(duì)指令進(jìn)行譯碼,前者按指令長(zhǎng)度32位譯碼,后者按64位譯碼,參數(shù)意義分別是指令的物理地址,空白指令結(jié)構(gòu)和指令長(zhǎng)度的最大字節(jié)數(shù)void boundaryfetch(bit8u *fetchptr, unsigned remaininginpage, bxinstruction_c *i)x86的最長(zhǎng)指令可以達(dá)到15個(gè)字節(jié),因此指令可能出現(xiàn)跨頁(yè),此時(shí)prefetch()+
26、 fetchdecode()/fetchdecode64()失敗,必須調(diào)用boundaryfetch()函數(shù)進(jìn)行跨頁(yè)取指譯碼。4.3 bx_cpu_c 類對(duì)cpu工作流程的簡(jiǎn)易描述cpu工作流程見圖表7 圖表 6 cpu工作流程示意圖 prefetch()函數(shù)(指令預(yù)?。﹙oid bx_cpu_c:prefetch(void) 計(jì)算laddr /指令所在的線性地址 計(jì)算paddr /經(jīng)過地址翻譯得到的指令的物理地址 計(jì)算laddrpageoffset0 /指令所在的線性頁(yè)(虛頁(yè))的基地址 計(jì)算eippageoffset0 /rip - (laddr - laddrpageoffset0),指令
27、所在頁(yè)基 地址相對(duì)于cs的偏移 計(jì)算eippagebias / - eippageoffset0 計(jì)算eippagewindowsize /頁(yè)大小,值為4096; 計(jì)算paddra20page /paddr & 0xfffff000,指令所在的物理頁(yè)的基地址 計(jì)算eipfetchptr /通過gethostmemaddr()計(jì)算得到的指令所在頁(yè)在主機(jī)(真實(shí)機(jī)器)上的基地址所謂指令預(yù)取,就是計(jì)算指令的物理地址和其他相關(guān)信息,為后面的指令譯碼作準(zhǔn)備。表8是其功能流程: 圖表 7指令預(yù)取功能流程圖fetchdecode()函數(shù)(指令譯碼):指令的結(jié)構(gòu)用一個(gè)類指令結(jié)構(gòu)bxinstruction
28、_c 來表示,它的兩個(gè)主要成員函數(shù)下:void (bx_cpu_c:*resolvemodrm) (bxinstruction_c *) bx_cpp_attrregparmn(1); /獲取指令的類型,類型是由bochs定義的void (bx_cpu_c:*execute)(bxinstruction_c *); /指令對(duì)應(yīng)的執(zhí)行函數(shù)指針基本指令放在一個(gè)數(shù)組中: static bxopcodeinfo_t bxopcodeinfo512*2 第0511項(xiàng): 16bit mode 第5121023項(xiàng): 32bit mode (其中包括了fpu,x86-64,3dnow,sse等指令入口)bou
29、ndaryfetch()函數(shù)(跨頁(yè)邊界取指)void boundaryfetch(bit8u *fetchptr, unsigned remaininginpage, bxinstruction_c *i)因?yàn)橹噶羁珥?yè),不能將指令的首地址作為參數(shù)傳給fetchdecode()/fetchdecode64(),因此設(shè)立臨時(shí)變量fetchbuffer,用以保存在兩頁(yè)中取出的共15個(gè)字節(jié),并將fetchbuffer作為譯碼的參數(shù)。指令的最大長(zhǎng)度為15字節(jié),但具體每條指令的長(zhǎng)度是不定的,在本次取指過程中為了實(shí)現(xiàn)跨頁(yè)移動(dòng)了rip,因此返回之前必須將其復(fù)原,函數(shù)返回以后,在cpu_loop()里面,會(huì)根據(jù)
30、實(shí)際的指令長(zhǎng)度移動(dòng)rip。4.4 基本內(nèi)存系統(tǒng)主要文件:memory.h, memory.cc,misc_mem.cc 主要類:bx_mem_c 內(nèi)存塊基指針:bit8u *actual_vector;/實(shí)際分配的內(nèi)存塊指針 bit8u *vector; /經(jīng)過對(duì)齊處理(4k大小整數(shù)倍 )內(nèi)存大小size_t len; /以字節(jié)為單位size_t megabytes; /以兆字節(jié)為單位 內(nèi)存空間的分配: alloc_vector_aligned (size_t bytes, size_t alignment) 圖 4-3 內(nèi)存空間分配圖 圖表 8內(nèi)存空間分布圖x86處理器的分頁(yè)機(jī)制(相關(guān)寄器)
31、:cr0:當(dāng)cr0pg(表示cr0寄存器的pg位,下同)1時(shí),啟用分頁(yè)機(jī)制。cr3:x86處理器通常使用多級(jí)頁(yè)表,cr3中存放著最高級(jí)頁(yè)表的基地址。cr4:當(dāng)cr4pse1時(shí),使用4m/2m大小的頁(yè)面,否則使用4k大小的頁(yè)面;cr4pae1時(shí),啟用pae模式(支持36位地址空間的物理內(nèi)存)。4.4內(nèi)存的訪問 bochs中主要由下面三個(gè)函數(shù)處理內(nèi)存的讀寫操作:void access_linear(bx_address laddr, unsigned length, unsigned pl, unsigned rw, void *data)void readphysicalpage(bx_cpu_
32、c *cpu, bit32u addr, unsigned len, void *data)void writephysicalpage(bx_cpu_c *cpu, bit32u addr, unsigned len, void *data)access_linear()函數(shù)的作用是在以指定的(線性)地址為起始地址處讀/寫一塊數(shù)據(jù)。參數(shù)意義分別是,訪問的起始線性地址,讀或?qū)懙臄?shù)據(jù)長(zhǎng)度,特權(quán)級(jí)別,操作方式(讀、寫)和數(shù)據(jù)緩沖區(qū)。readphysicalpage() 和writephysicalpage()的功能是讀/寫主機(jī)上的內(nèi)存頁(yè)。access_linear()函數(shù)struct bx_add
33、ress rm_addr; bit32u paddress1; /數(shù)據(jù)塊在第一頁(yè)的起始地址 bit32u paddress2; /數(shù)據(jù)塊在第二頁(yè)的起始地址 bit32u len1; /數(shù)據(jù)塊在第一頁(yè)的長(zhǎng)度 bit32u len2; /數(shù)據(jù)塊在第二頁(yè)的長(zhǎng)度 bx_ptr_equiv_t pages; /數(shù)據(jù)塊所跨越的頁(yè)數(shù)(1或2) address_xlation;address_xlation是類bx_cpu_c的一個(gè)成員,包含了經(jīng)過翻譯的地址結(jié)構(gòu)和相關(guān)信息,函數(shù)access_linear()中的參數(shù)length總是小于頁(yè)面的大小,但是數(shù)據(jù)塊的起始地址可能在頁(yè)中的任意位置,所以數(shù)據(jù)塊可能在一頁(yè)內(nèi)
34、,也可能跨越兩頁(yè),但不會(huì)更多access_linear()函數(shù)void access_linear(bx_address laddr, unsigned length, unsigned pl, unsigned rw, void *data) if (bx_cpu_this_ptr cr0.pg) /啟用分頁(yè) if ( (pageoffset + length) <= 4096 ) /沒有跨頁(yè),pages1 計(jì)算paddress1和pages if (rw = bx_read) 調(diào)用readphysicalpage讀數(shù)據(jù) else 調(diào)用writephysicalpage寫數(shù)據(jù) retu
35、rn; else /跨頁(yè),pages2 計(jì)算paddress1,len1,len2,pages和paddress2#ifdef bx_little_endian /小尾端 if (rw = bx_read) 調(diào)用兩次readphysicalpage讀數(shù)據(jù) else 調(diào)用兩次writephysicalpage寫數(shù)據(jù)#else /大尾端 #endif return; else /未啟用分頁(yè) readphysicalpage()void readphysicalpage(bx_cpu_c *cpu, bit32u addr, unsigned len, void *data) a20addr = a
36、20addr(addr); struct memory_handler_struct *memory_handler = memory_handlersa20addr >> 20; 如果是特殊內(nèi)存段,用memory_handler完成讀操作#if bx_support_apic local_apic->read (addr, data, len) / ioapic->read (addr, data, len); #endifread_one: if ( (a20addr & 0xfff80000) != 0x00080000 ) *data_ptr = vec
37、tora20addr;inc_one: if (len = 1) return; len-; a20addr+;#ifdef bx_little_endian data_ptr+;#else / bx_big_endian data_ptr-;#endif goto read_one; . writephysicalpage()void writephysicalpage(bx_cpu_c *cpu, bit32u addr, unsigned len, void *data) a20addr = a20addr(addr); struct memory_handler_struct *mem
38、ory_handler = memory_handlersa20addr >> 20; 如果是特殊內(nèi)存段,用memory_handler完成讀操作#if bx_support_apic local_apic->write (a20addr, (bit32u *)data, len); / ioapic->write (a20addr, (bit32u *)data, len);#endifwrite_one: if ( (a20addr & 0xfff80000) != 0x00080000 ) vectora20addr = *data_ptr;inc_one
39、: if (len = 1) return; len-; a20addr+;#ifdef bx_little_endian data_ptr+;#else / bx_big_endian data_ptr-;#endif goto write_one; . 4.5 bochs 時(shí)鐘系統(tǒng)bochs的時(shí)鐘系統(tǒng)主要由pc_system.cc這個(gè)文件描述在bx_pc_system_c這個(gè)類中,定義了時(shí)鐘系統(tǒng)的各種變量和功能函數(shù)。timerbx_max_timers宏:bx_max_timers 定義為 64,timer數(shù)組所能注冊(cè)的最大計(jì)時(shí)器為64。這個(gè)數(shù)組注冊(cè)了所有的外設(shè),并且存儲(chǔ)了當(dāng)時(shí)間片到達(dá)時(shí)對(duì)
40、應(yīng)的處理函數(shù)。struct bx_bool inuse; / 計(jì)時(shí)器是否正在使用 bit64u period; / 兩次時(shí)鐘中斷的間隔指令數(shù) bit64u timetofire; / .下一次產(chǎn)生時(shí)鐘中斷的指令數(shù) bx_bool active; / 0=非運(yùn)行狀態(tài), 1=正在運(yùn)行狀態(tài). bx_bool continuous; / 0=非持續(xù)型計(jì)時(shí)器, 1=持續(xù)性計(jì)時(shí)器 bx_timer_handler_t funct; / 產(chǎn)生時(shí)鐘中斷時(shí)的回調(diào)(中斷處理)函數(shù) void *this_ptr; / 回調(diào)函數(shù)所屬的類實(shí)例#define bxmaxtimeridlen 32 / 計(jì)時(shí)器最大命名長(zhǎng)度
41、char idbxmaxtimeridlen; / 計(jì)時(shí)器命名 一些重要變量:unsigned numtimers (計(jì)時(shí)器的當(dāng)前數(shù)量)unsigned triggeredtimer (當(dāng)前將要處理時(shí)鐘中斷的計(jì)時(shí)器編號(hào))bit32u currcountdown (所有運(yùn)行計(jì)時(shí)器中的最小中斷間隔指令數(shù))bit64u tickstotal (總共已執(zhí)行的指令數(shù) )double m_ips (每秒執(zhí)行的百萬(wàn)條指令數(shù))計(jì)時(shí)器的注冊(cè):register_timer (void *this_ptr, void (*funct) (void *),bit32u useconds, bx_bool contin
42、uous, bx_bool active, const char *id)所有的硬件在初始化時(shí)都會(huì)調(diào)用這個(gè)函數(shù),把自己注冊(cè)到timer數(shù)組之中。4.6 bochs中斷系統(tǒng)中斷結(jié)構(gòu)如圖表10所示: 圖表 9 中斷結(jié)構(gòu) irq信號(hào)的獲取如圖表11所示: 圖表 10 irq獲取irq信號(hào)的傳遞 (pic)如圖表: 圖表 11中斷過程中斷向量的接收 (local apic): nt apic_bus_deliver_interrupt(bit8u vector, bit8u dest, bit8u delivery_mode, bit8u dest_mode, bx_bool level, bx_bo
43、ol trig_mode)中斷判斷: void bx_cpu_c:cpu_loop(bit32s max_instr_count)中斷處理: unsigned bx_cpu_c:handleasyncevent(void) bit8u bx_local_apic_c:acknowledge_int(void) 圖表 12 中斷流程圖5 具體移植實(shí)現(xiàn)5.1 虛擬實(shí)驗(yàn)平臺(tái)統(tǒng)一的器件模型 圖表 13 器件模型演示圖通過對(duì)不同的管腳施加信號(hào)后,調(diào)用bochs中的cpu庫(kù)的程序來完成8088的簡(jiǎn)單功能,為了能直觀的顯示出來,加入了一個(gè)drawobject函數(shù)。5.2 cpu類的主要功能及實(shí)現(xiàn)方法 虛擬機(jī)
44、bochs是一個(gè)龐大的工程,它包含了許多庫(kù),例如匯編庫(kù),反匯編庫(kù),cpu庫(kù),插槽庫(kù)等許多庫(kù),而我們所以要關(guān)心就是cpu庫(kù),而cpu庫(kù)又是一個(gè)復(fù)雜的工程,它具備了8088cpu的功能,在熟悉了解它后,決定通過修改插槽庫(kù)來調(diào)用cpu庫(kù),這樣既能達(dá)到8088cpu的功能又能是工作量減少。5.2.1 修改cpu loop修改cpu loop首要的工作是要熟悉這個(gè)庫(kù)的內(nèi)容,通過一段時(shí)間的分析,熟悉了重要功能部分實(shí)現(xiàn)的代碼。prefetch(); eipbiased = rip + bx_cpu_this_ptr eippagebias; bxinstruction_c *i = fetchinstruc
45、tion(&istorage, eipbiased); bxexecuteptr_tr resolvemodrm = i->resolvemodrm; / get as soon as possible for speculation bxexecuteptr_t execute = i->execute; / fetch as soon as possible for speculation該部分實(shí)現(xiàn)了cpu與寄存器之間的取指令,譯碼指令,以及指令執(zhí)行的功能。5.2.2 修改插庫(kù)插槽庫(kù)的修改主要通過修改以下函數(shù)完成: void bx_instr_init(unsigned
46、 cpu) void bx_instr_shutdown(unsigned cpu) void bx_instr_reset(unsigned cpu) void bx_instr_hlt(unsigned cpu) void bx_instr_new_instruction(unsigned cpu) void bx_instr_inp(bit16u addr, unsigned len)void bx_instr_outp(bit16u addr, unsigned len) 其中,bx_instr_inp和bx_instr_outp兩上插槽函數(shù)是cpu執(zhí)行in和out指令時(shí)將會(huì)調(diào)用的函數(shù)
47、,他在實(shí)驗(yàn)臺(tái)演示中有重要作用。結(jié) 論此8088cpu邏輯功能的仿真減少cpu里的一些細(xì)節(jié)特征,例如cpu與寄存器之間取指令,譯指令等一系列流水線過程都簡(jiǎn)化了,使cpu和寄存器整和在了一起,實(shí)現(xiàn)了其主要功能,當(dāng)用戶使用此仿真時(shí)容易理解,使得仿真時(shí)更加突出重點(diǎn),減輕了仿真的設(shè)計(jì)實(shí)現(xiàn)難度。在工作的前期首先要了解bochs,由于bochs是一個(gè)巨大的工程,它由匯編庫(kù),反匯編庫(kù),cpu庫(kù),插槽庫(kù)等許多庫(kù)組成。在前面花了大量時(shí)間來研究研究后,使我們?cè)诤笃诘墓ぷ髦杏辛嗣鞔_的方向,主要通過修改boshs中的cpu_loop和插槽庫(kù)。但是在后期工作遇到了很多困難,例如最難的是cpu的功能實(shí)現(xiàn),cpu功能復(fù)雜,它
48、包含函數(shù)相當(dāng)多,各函數(shù)之間的調(diào)很多都不能很好的實(shí)現(xiàn)。在設(shè)計(jì)設(shè)計(jì)過程中還暴露出很多基礎(chǔ)問題,例如對(duì)工具不能熟練的掌握。通過這次畢業(yè)設(shè)計(jì)的編程,使我對(duì)bochs和8088cou有了新的認(rèn)識(shí),同時(shí)我也對(duì)vc+這一編程語(yǔ)言有了更深的了解,對(duì)以后的學(xué)習(xí)和工作都有很大的幫助。參考文獻(xiàn)1 peter abel,ibm pc 匯編語(yǔ)言程序設(shè)計(jì)(第五版),人民郵電出版社發(fā)行,2002.9.12 孫鑫,余安萍,vc+深入詳解,電子工業(yè)出版社,2006.063 stephen prata,c+ primer plus(第四版)中文版,人民郵電出版社,20054 steven holzner.visual c+ 6.
49、0輕松進(jìn)階m.北京:電子工業(yè)出版社,2005。5 john e.swanke.visual c+mfc編程實(shí)例m.北京:機(jī)械工業(yè)出版社,2005。6 張海棠.visual c+ 6.0編程指南m.北京:航空工業(yè)出版社,2002。7 馬群生等 微計(jì)算機(jī)技術(shù) 清華大學(xué)出版社 2006.18 潘愛民等 visual c+ 技術(shù)內(nèi)幕 清華大學(xué)出版社 2001.49 10 11 /projects/bochs-rfb/致 謝在整個(gè)系統(tǒng)的開發(fā)過程中,同事、老師和同學(xué)給了我很大的幫助。感謝我的指導(dǎo)老師王中科老師他在畢業(yè)設(shè)計(jì)期間,細(xì)心為我指導(dǎo),給了我許多寶貴的意見。使我的
50、論文更加規(guī)范,更加流暢。真心謝謝!還有我要感謝全體同學(xué),他們的鼓勵(lì)和指導(dǎo)讓我受益非淺。他們?yōu)槲姨峁┝颂嗟募夹g(shù)指導(dǎo)和實(shí)踐機(jī)會(huì)。還要感謝理解,幫助,支持過我的各位朋友。最后向在百忙之中評(píng)審本文的各位專家、老師表示衷心的感謝。作者簡(jiǎn)介姓 名:馮坷欣 性別:男出生年月:1983-08-19 民族:漢e-mail:wisely731聲 明本論文的工作是2007年2月至2007年6月在成都信息工程學(xué)院網(wǎng)絡(luò)工程系完成的。文中不包含他人已經(jīng)發(fā)表或撰寫過的研究成果,也不包含為獲得成都信息工程學(xué)院或其他教學(xué)機(jī)構(gòu)的學(xué)位或證書而使用過的材料。除非另有說明,本文的工作是原始性工作。關(guān)于學(xué)位論文使用權(quán)和研究成果知識(shí)產(chǎn)權(quán)
51、的說明本人完全了解成都信息工程學(xué)院有關(guān)保管使用學(xué)位論文的規(guī)定,其中包括:(1)學(xué)校有權(quán)保管并向有關(guān)部門遞交學(xué)位論文的原件與復(fù)印件。(2)學(xué)校可以采用影印、縮印或其他復(fù)制方式保存學(xué)位論文。(3)學(xué)校可以學(xué)術(shù)交流為目的復(fù)制、贈(zèng)送和交換學(xué)位論文。(4)學(xué)??稍试S學(xué)位論文被查閱或借閱。(5)學(xué)校可以公布學(xué)位論文的全部或部分內(nèi)容(保密學(xué)位論文在解密后遵守此規(guī)定)。除非另有科研合同和其他法律文書的制約,本論文的科研成果屬于成都信息工程學(xué)院。特此聲明! 畢業(yè)設(shè)計(jì)(論文)簡(jiǎn)化的8088cpu邏輯功能的仿真實(shí)現(xiàn)論文作者姓名:申請(qǐng)學(xué)位專業(yè):申請(qǐng)學(xué)位類別:指導(dǎo)教師姓名(職稱):論文提交日期: 簡(jiǎn)化的8088cpu邏輯功能的仿真實(shí)現(xiàn)摘 要 “虛擬實(shí)驗(yàn)平臺(tái)”主要采用以“軟”代“硬”和“虛”、“實(shí)”結(jié)合的設(shè)計(jì)思路,強(qiáng)調(diào)實(shí)用性,以最大限度地仿真真實(shí)的實(shí)驗(yàn)環(huán)境。主要實(shí)現(xiàn)了“專用實(shí)驗(yàn)臺(tái)”的虛擬化,將它“搬”到了“微機(jī)”的顯示器上,而原有在微機(jī)上的實(shí)驗(yàn)操作環(huán)境和方法仍然保持不變。系統(tǒng)還提供必要的測(cè)試儀器和工具(如示波器等),以
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度城市公共交通車輛運(yùn)營(yíng)管理合同3篇
- 2025年度柴油市場(chǎng)分析與預(yù)測(cè)服務(wù)合同范本4篇
- 專業(yè)設(shè)備銷售協(xié)議模板集(2024版)版
- 2025年廠區(qū)綠化生態(tài)教育推廣與培訓(xùn)服務(wù)協(xié)議4篇
- 2024年起重機(jī)研發(fā)與購(gòu)銷合作項(xiàng)目合同范本3篇
- 二零二四家居建材店員工勞動(dòng)合同模板3篇
- 2025年度智能機(jī)器人技術(shù)研發(fā)合作協(xié)議4篇
- 2024版企業(yè)技術(shù)改造借款的合同范本
- 二零二五版醫(yī)療設(shè)備采購(gòu)與租賃合同范本3篇
- 2024年04月吉林銀行總行投資銀行部2024年社會(huì)招考1名負(fù)責(zé)人筆試歷年參考題庫(kù)附帶答案詳解
- GB/T 6913-2008鍋爐用水和冷卻水分析方法磷酸鹽的測(cè)定
- GB/T 18717.2-2002用于機(jī)械安全的人類工效學(xué)設(shè)計(jì)第2部分:人體局部進(jìn)入機(jī)械的開口尺寸確定原則
- 教案:第三章 公共管理職能(《公共管理學(xué)》課程)
- 中國(guó)文化概論(第三版)全套課件
- 117-鋼結(jié)構(gòu)工程質(zhì)量常見問題與管控措施
- SHS5230三星指紋鎖中文說明書
- 諾和關(guān)懷俱樂部對(duì)外介紹
- 保定市縣級(jí)地圖PPT可編輯矢量行政區(qū)劃(河北省)
- 新蘇教版科學(xué)六年級(jí)下冊(cè)全冊(cè)教案(含反思)
- 供方注冊(cè)指南-ZTE
- 真心英雄合唱歌詞
評(píng)論
0/150
提交評(píng)論