小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

如何編寫一個(gè)硬件模擬器?

 pgl147258 2015-04-04

【知乎用戶的回答(120票)】:

話題太大,不喜打字,簡單說點(diǎn)

要寫一個(gè)硬件模擬器,首先你得有那個(gè)硬件(逃,當(dāng)然,這么說其實(shí)沒啥意義,有一個(gè)spec就可以了,當(dāng)然也有只有硬件,幾乎或者根本沒有spec的時(shí)候。

一般的計(jì)算機(jī)系統(tǒng),主要有這么幾塊要模擬:CPU,memory,IO,stor,gfx。

首先是CPU,看手冊(cè),把CPU的各種模式,GPR,MSR等等都搞明白,每一條指令都模擬下來,中斷處理寫好,基本就能用了,MMU也別忘了,TLB一般可以省掉。CPU一般都是可以得到手冊(cè)的,所以寫這個(gè)模擬只是一個(gè)體力活。

然后是Memory,這個(gè)一般就是new一塊內(nèi)存,或者硬編碼一個(gè)數(shù)組(你應(yīng)該祈禱被模擬的硬件內(nèi)存不要太大,或者說memoryspace不要太大,否則處理起來很麻煩)。

IO模擬花樣繁多,這里就不細(xì)說了,舉個(gè)例子,有的游戲機(jī)是用mail slot reg來執(zhí)行IO的,這時(shí)候你的代碼只要在寫這個(gè)reg的時(shí)候,讀reg的值就知道該做什么了。當(dāng)然這里花樣多于是情況就要復(fù)雜得多,比如真實(shí)的硬件是需要時(shí)間才對(duì)的,你模擬一個(gè)光驅(qū),如果沒模擬延遲,有時(shí)候就會(huì)一塌糊涂。

stor一般都屬于IO,如果要提高模擬的速度,就要特殊處理,這里不細(xì)表了。

gfx模擬比較有技巧,一種是完全比著spec自己擼一個(gè)gfx管線,這樣的效果就是模擬很精確,代價(jià)就是慢,無以倫比的慢。另一種就是做一個(gè)到現(xiàn)代API的map,比如把gfx指令翻譯成opengl,運(yùn)氣好的話,比如你要在pc做一個(gè)gles的模擬,那可就簡單多了。

ok,上面都是入門,下面說一點(diǎn)hardcore的

首先,沒有spec怎么辦。總所周知模擬游戲機(jī),游戲機(jī)是不可能給你詳細(xì)的spec的,這就要用各種逆向的方法,首先你可以用搜索引擎找廠商的專利,這里面會(huì)有一些硬件spec的蛛絲馬跡。其次找SDK,SDK里面的手冊(cè)起碼會(huì)把執(zhí)行環(huán)境介紹一下。

然后就是最hardcore的工作了,最暴力的方法是用LA,也就是邏輯分析儀接到游戲機(jī)的或者什么玩意的pcb上,前提是你能找到你要的總線,或者猜測,然后分析各種信號(hào)時(shí)序,這樣很多外設(shè)的連接方式和總線協(xié)議就知道了,可以著手開始這類設(shè)備的模擬了。

其次是逆向SDK,把里面的lib之類的用IDA之類的反匯編,看看官方是怎么在最底層和硬件通信的,這個(gè)工作量相當(dāng)大,而且有時(shí)候靜態(tài)是看不出太多信息的,不過總比什么都沒有強(qiáng)。

再其次是用SDK寫一些spy code,在真實(shí)硬件上run,試一下reg的功能之類的,這需要極大的耐心。以上就是硬件逆向的基本工作,當(dāng)然還有別的懶得寫了。

還有最后一個(gè),就是模擬的速度,上面說的一切都是暴力模擬,每一條cpu指令,每一個(gè)硬件功能都要用很多行c代碼,老慢了,慢到什么程度?可能只有真實(shí)硬件的幾十分之一甚至萬分之一。

這種情況就需要用一些高級(jí)的技巧,比如HLE,HLE就是high level emu,簡單的說有這么幾種:

函數(shù)級(jí)HLE,比如著名的N64模擬器Ultra64,做到了SDK級(jí)函數(shù)識(shí)別,模擬的時(shí)候遇到crt會(huì)用自己的函數(shù)換掉,這樣就飛快。硬件級(jí)HLE,比如模擬BIOS,你別管BIOS里面怎么工作的,你把BIOS的接口實(shí)現(xiàn)出來就行了,光驅(qū)神馬的同理。

另外一個(gè)最著名的就是處理器的JIT了,也就是把異質(zhì)架構(gòu)的處理器指令流翻譯成本地指令流執(zhí)行,可能會(huì)快10到幾百倍,這個(gè)過程比較復(fù)雜,說起來夠?qū)懸槐緯?,這里不廢話了,以后有機(jī)會(huì)再說。

【陳俊直的回答(3票)】:

看到“Arduino”,估計(jì)題主是不想做硬件而直接用計(jì)算機(jī)仿真一個(gè)硬件系統(tǒng)出來,然后寫軟件程序?

而我們做EE的在沒有硬件的情況下,會(huì)使用Protues、Multisim等專業(yè)的EDA仿真軟件來測試調(diào)試電路和MCU程序。如:

不過我現(xiàn)在已經(jīng)很少用仿真軟件了,都是直接焊實(shí)際電路。以前用過的軟件好像都沒有ARM系列的芯片,不知現(xiàn)在的新版是否有。

【XiangLian的回答(1票)】:

因?yàn)槟M有不同抽象層次之分,相應(yīng)的實(shí)現(xiàn)的復(fù)雜程度也有天壤之別。

行為級(jí)的模擬抽象層次比較高,實(shí)現(xiàn)起來簡單,只要黑箱模型實(shí)現(xiàn)即可。

函數(shù)級(jí)的模擬就要進(jìn)—步,需要實(shí)現(xiàn)系統(tǒng)響應(yīng)的內(nèi)部子流程。

硬件級(jí)的模擬更需要了解信號(hào)傳播的時(shí)間特性。

具體來說,如果要實(shí)現(xiàn)虛擬機(jī),只到函數(shù)級(jí),把虛擬機(jī)讀入的每條指令以函數(shù)形式實(shí)現(xiàn)即可;如果要實(shí)現(xiàn)系統(tǒng)中處理器的時(shí)序模擬,最笨的辦法是把處理器內(nèi)每個(gè)子部件的運(yùn)轉(zhuǎn)時(shí)間特性都模擬出來;往往也可以簡化到函數(shù)級(jí),只要把每條機(jī)器指令的執(zhí)行時(shí)間和數(shù)據(jù)在內(nèi)外總線的傳遞時(shí)間模擬出來就足夠了。

【書旭Lee的回答(1票)】:

首先硬件模擬器按照精確度來說分為以下幾類:

1. 功能級(jí)模擬器,這個(gè)應(yīng)該是題主所說的硬件模擬器。

此類模擬器實(shí)現(xiàn)硬件的功能,能夠像真實(shí)硬件一樣運(yùn)行上層的軟件。例如在PC上開發(fā)安卓就需要arm的模擬器,在x86上運(yùn)行arm程序,當(dāng)前安卓模擬器是基于開源模擬器QEMU實(shí)現(xiàn)的。

2. 時(shí)序精確級(jí)模擬器,此類模擬器不僅能夠?qū)崿F(xiàn)硬件的功能,還能夠模擬硬件內(nèi)部的時(shí)序。在進(jìn)行芯片和SOC架構(gòu)探索的時(shí)候需要用到此類模擬器,用于評(píng)估、分析硬件架構(gòu)的性能。設(shè)計(jì)階段之所需使用模擬器是因?yàn)橐环矫嫘酒牧髌芷诤荛L、成本高昂(百萬級(jí)),

另一方面在真實(shí)芯片上缺少調(diào)測定位的手段。

猜測題主所說的模擬器應(yīng)該指的是功能級(jí)模擬器,這里對(duì)功能機(jī)模擬器做大概的介紹:

實(shí)現(xiàn)一個(gè)功能機(jī)模擬器主要包含以下幾大塊:

1.處理器模擬

模擬處理器其實(shí)主要做的就是使用軟件實(shí)現(xiàn)硬件的指令。處理器的模擬其實(shí)跟芯片內(nèi)部的大概流程很類似。以ARM的模擬器為例,經(jīng)過ARM的編譯器編譯出來一個(gè)ARM程序,需要在我們的模擬器上運(yùn)行:

首先要按照ARM可執(zhí)行程序的格式(linux下同意為ELF格式文件)解析可執(zhí)行文件-->從ELF文件中讀取指令-->按照ARM的指令集說明對(duì)讀取的二進(jìn)制指令進(jìn)行解碼-->執(zhí)行解析出的指令-->獲取下一條指令-->循環(huán)

這里的主要工作就是要對(duì)ARM的每條指令進(jìn)行實(shí)現(xiàn),例如add加法指令、load/store內(nèi)存操作指令、乘法指令等。。。

2.內(nèi)存模擬

處理器運(yùn)行時(shí)需要不停對(duì)外部IO進(jìn)行操作,最多就是load/store仿寸,我們必須模擬處理器的內(nèi)存。對(duì)于功能機(jī)仿真器來說只需要malloc一塊內(nèi)存,映射給處理器即可。當(dāng)然,如果硬件設(shè)計(jì)有MMU時(shí)還需要對(duì)實(shí)現(xiàn)MMU功能。Cache一般不需要進(jìn)行模擬。

3. 外設(shè)模擬

如果要整個(gè)系統(tǒng)運(yùn)行起來,還需要對(duì)外設(shè)進(jìn)行模擬,例如ARM程序用到了DMA,那么我們就需要對(duì)DMA部件進(jìn)行模擬,硬件規(guī)格會(huì)定義出DMA寄存器的行為,我們需要對(duì)這些行為進(jìn)行模擬。

4. 總線的模擬

OK,假設(shè)處理器,內(nèi)存,外設(shè)我們都模擬好了,接下來我們還需要將這些部件進(jìn)行互聯(lián)。系統(tǒng)會(huì)對(duì)每個(gè)部件在系統(tǒng)中的地址進(jìn)行定義,我們需要正確的進(jìn)行地址映射,如此一個(gè)store指令我們才能根據(jù)地址說這條指令是訪問了內(nèi)存還是DMA。

其次需要對(duì)中斷進(jìn)行互聯(lián),例如DMA完成了,需要通過中斷告訴CPU,我們就需要通過句柄等是DMA能夠更新CPU的狀態(tài)(中斷寄存器)。

此時(shí),我們純手工版的模擬器就OK了,開發(fā)工作兩肯定不小。

未完待續(xù)。。。

【徐釀泉的回答(0票)】:

去看看半加器,擼一個(gè)出來。

【cinwell的回答(0票)】:

第一步也是最最重要的一步應(yīng)該是對(duì)模擬對(duì)象有徹底的了解,完全清楚實(shí)際邏輯流程。其次,需要用事件驅(qū)動(dòng)來模擬實(shí)際流程。然后,需要對(duì)模擬器進(jìn)行反復(fù)的validation。再之后,就是各種bug的修改,版本的改進(jìn)了。精確又易用的模擬器實(shí)現(xiàn)真不是容易的事,知名的cpu模擬器像marssx86,gem5都是很多研究組/公司經(jīng)過幾代積累完成的,內(nèi)存模擬器DRAMSim看起來要比CPU簡單的多,但依然耗費(fèi)了20 student-year。

【SuperNG6的回答(0票)】:

現(xiàn)在網(wǎng)上流傳的PS3是不是也是假的,模擬CELL難度應(yīng)該非常的大

【TaterLi的回答(0票)】:

EDA級(jí)別仿真很多,真要寫仿真器估計(jì)挺難.

原文地址:知乎

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多