1. 程式人生 > >gem5學習7——gem5模擬器啟動過程

gem5學習7——gem5模擬器啟動過程

本文使用X86架構為例介紹GEM5中最簡單的SE模式啟動過程。GEM5啟動的命令為:

~/simulators/gem5$ build/X86_MESI_Three_Level_sparse/gem5.opt configs/example/se.py -c test  

其中gem5.opt為GEM5的主二進位制程式,se.py為用Python語言編寫的配置檔案,test為標準Linux下gcc編譯的二進位制檔案。

執行結果如下:

[email protected]:~/simulators/gem5$ build/X86_MESI_Three_Level_sparse/gem5.opt configs/example/se.py -c test
gem5 Simulator System.  http://gem5.org
gem5 is copyrighted software; use the --copyright option for details.

gem5 compiled Jun 22 2014 15:27:09
gem5 started Jun 22 2014 15:27:28
gem5 executing on atlantis
command line: build/X86_MESI_Three_Level_sparse/gem5.opt configs/example/se.py -c test
Global frequency set at 1000000000000 ticks per second
0: system.remote_gdb.listener: listening for remote gdb #0 on port 7000
**** REAL SIMULATION ****
info: Entering event queue @ 0.  Starting simulation...
info: Increasing stack size by one page.
warn: ignoring syscall access(0, 4893217, ...)
Hello, world!
Exiting @ tick 6979500 because target called exit()

通過GDB除錯發現GEM5啟動的過程如下圖:


其中GEM5啟動使用的trigger是標準的C/C++的main函式,main函式主要工作為初始化訊號量和初始化Python環境。然後通過呼叫sim/init.cc中的initM5Python()方法來初始化GEM5使用的模組。在initM5Python()函式主要呼叫了兩個方法:

int
initM5Python()
{
    EmbeddedSwig::initAll();
    return EmbeddedPython::initAll();
}
EmbeddedSwig::initAll()用來呼叫每個模組與swig相關的初始化函式,這些函式都在xxx.i_init.cc中宣告,xxx為模組名。比如一個param_IsaFake的模組中的程式碼:
#include "sim/init.hh"

extern "C" {
    void init_param_IsaFake();
}

EmbeddedSwig embed_swig_param_IsaFake(init_param_IsaFake); //例項化一個EmbeddedSwig物件,並把初始化函式通過建構函式傳給類中的靜態變數list

//EmbeddedSwig的建構函式
EmbeddedSwig::EmbeddedSwig(void (*init_func)())
    : initFunc(init_func)
{
    getList().push_back(this);
}
    在EmbeddedSwig的建構函式中會把每個模組的初始化函式放到一個list中,InitAll()函式的主要工作就是掉用這些已經定義好的初始化函式。

    EmbeddedPython::initAll()用來整理繼承於SimObject的模組並把他們對映到m5.objects名稱空間下。這些gem5模組是分佈在不同資料夾下的,理論上Python是通過檔案的路徑來確定Python模組的名稱空間(類似Java),但是通過分析來看下gem5是通過什麼方法把分佈在不同檔案下的Python模組map到m5.objects下。

    在每個gem5的功能模組下都會有類似,xxxx.py.cc的檔案,這個檔案就是用來描述這個模組的名字、檔案的絕對路徑等資訊:

EmbeddedPython embedded_m5_objects_AtomicSimpleCPU(
    "m5/objects/AtomicSimpleCPU.py",  //理論上這個檔案該在的位置
    "/home/wgh/simulators/gem5/src/cpu/simple/AtomicSimpleCPU.py", //實際在的位置
    "m5.objects.AtomicSimpleCPU",   //模組的名字
    data_m5_objects_AtomicSimpleCPU,  //是一個大陣列,I don't know what the fuck it is!
    766,   //上面那個大陣列的長度
    1610);  //?
}
    通過例項化EmbeddedPython物件,建構函式會把這些模組的資訊新增到內部的一個list上,這為gem5未來載入這些模組提供資訊。InitAll()函式會呼叫每個模組自身的AddModule()把自己對映到它理論上該在的位置。

    初始化完畢,模擬器呼叫main.cc的m5Main()函式,在m5Main()函式中使用PyRun_String來啟動Python模組,PyRun_String()函式為c/c++呼叫python的介面,其中函式第一個引數為python命令,在這個地方使用了兩個命令:import m5和m5.main(),第二個命令是呼叫python模組的main()函式。在m5.main()函式中使用

    if options.pdb:    
	......
         pdb.run(filecode, scope) #除錯模式下執行se.py,在gem5.opt的執行引數下加上--pdb引數。pdb偵錯程式類似gdb,
    	.....
    else:
        exec filecode in scope   #正常執行
    來執行se.py檔案。se.py為SE模式的配置檔案。在se.py中會呼叫Simulation模組的run()函式,run()函式中呼叫了m5的simulate(),從圖中可以看出在src/python/m5/simulate.py檔案中的simulate()函式最終呼叫了被封裝過的C++模組,模組已經被對映到m5.internal.event下。到此為止,GEM5的啟動基本結束。

相關推薦

gem5學習7——gem5模擬器啟動過程

本文使用X86架構為例介紹GEM5中最簡單的SE模式啟動過程。GEM5啟動的命令為: ~/simulators/gem5$ build/X86_MESI_Three_Level_sparse/gem5.opt configs/example/se.py -c test

每天學習Linux之-系統啟動過程

POST-->BIOS(Boot Sequence)-->MBR(bootloader,446)-->Kernel-->initrd-->(ROOTFS)/sbin/init(/etc/inittab) 說明:BIOS自檢-->從BIOS中讀取啟動順序-->讀取MB

Hadoop 學習研究(九): NameNode啟動過程

每個datanode在啟動時都會掃描其機器上對應儲存hdfs block的目錄下(dfs.data.dir)所儲存的所有檔案塊,然後通過namenode的rpc呼叫將這些block資訊以一個long陣列的方式傳送給namenode,namenode在接收到一個datanode的blockReport rpc呼

Android原始碼學習之八—系統啟動過程

Android原始碼數量龐大,雖然對它的學習從未停止,但是整理成這樣的文字,實在是費時費力的一件事情,不過好在前文已經對其基本機制加以分析,相信以此為基礎,其他的內容學習起來就沒那麼困難了。 今天是20

深入理解 JBoss 7/WildFly Domain 模式啟動過程

ket builder 代碼調試 ref finished rop mas stopped rgs 概述JBoss 7/WildFly 以 domain 模式啟動時會啟動多個 JVM。比如例如以下通過啟動腳本啟動 domain 模式:./domain.sh啟動後我們查看進

嵌入式開發學習(2)<S5PV210啟動過程詳解>

nan ios eight img 啟動方式 margin 需要 外部 啟動 基本概念: 內存:   SRAM 靜態內存 特點:容量小、價格高,優點:不需要軟件初始化,上電就能用。   DRAM 動態內存 特點:容量大、價格低,缺點:上電不能用,需要軟件初始化。  

[中英對照]Booting Process in Linux RHEL 7 | Linux RHEL 7啟動過程

quick .org org lin really conf linked 傳統 temp Booting Process in Linux RHEL 7 | Linux RHEL 7啟動過程 In this post, I will guide you booting p

linux學習-Linux系統啟動過程

linux 關機 mage 模式 服務 關機 win sin class windows系統 linux系統啟動過程 Linux系統的啟動過程並不是大家想象中的那麽復雜,其過程可以分為5個階段: 內核的引導。 運行init。 系統初始化。 建立終端 。 用戶登錄系統。

操作系統學習(四)、系統啟動過程

中斷向量 初始化 地址 I/O 向量 錯誤 cpu 系統初始 系統初始化 一、操作系統啟動部分主要執行流程 當PC電源打開後,80x86結構的CPU將自動進入實時模式。並從地址0xFFFF0 (FFFF:0) 開始自動執行程序代碼,這個地址通常是是ROM-BIOS中的地址

Flask學習-Flask app啟動過程

als sock 一個 sources host .html 執行 session targe 因為0.1版本整體代碼大概只有350行,比較簡單。所以本篇文章會以Flask 0.1版本源碼為基礎進行剖析Flask應用的啟動過程。 Flask參考資料flask,官網有一個最

安卓彩38平臺出租開發學習之SystemServer啟動過程

ble 持續時間 snap not lock power dex finger can 這兩天彩38平臺出租 haozbbs.com Q1446595067 有一個需求得聯調,在等待服務端同事完事,等待過程中,閱讀了一下Android8.0裏SystemServer的啟

Android SyetemServer程序啟動過程(基於7.0 N版本原始碼)

前言 上一篇我們學習了Zygote程序,並且知道Zygote程序啟動了SyetemServer程序,那麼這一篇我們就來學習Android7.0版本的SyetemServer程序的啟動過程。 1.Zygote啟動SyetemServer程序 在上一篇文章中我們講到在ZygoteInit.j

STM32之啟動過程分析學習筆記

 System memory內建了ST提供的boot loader,可以通過該boot loader下載程式到Flash中。 使用者程式實際只能儲存在Flash中,且能在Flash和SRAM中執行(因為cortex-m3核採用哈佛結構,程式

linux rhel 7系統啟動過程

rhel 7的系統啟動過程有別與之前的版本,不僅體現在systemd取代了upstart,而且linux一切皆檔案也可以說轉變成了一切皆單元,怪不得李那斯如此暴怒,那究竟systemd和upstart有何不同呢 一 ,systemd 1.systemd將執行級別

Linux學習:Linux的系統啟動過程

引用:《鳥哥的Linux私房菜基礎篇第三版》 啟動過程一覽 既然啟動是很嚴肅的一件事,那我們就來了解一下整個啟動的過程吧!好讓大家比較容易發現啟動過程裡面可能會發生問題的地方,以及出現問題後的解決之道! 不過,由於啟動的過程中,那個啟動管理程式(Boot Loader)

TBSchedule原始碼學習筆記-啟動過程 轉自https://blog.csdn.net/weiythi/article/details/78742651

TBSchedule基本概念及原理 概念介紹 TBSchedule是一個支援分散式的排程框架,能讓一種批量任務或者不斷變化的任務,被動態的分配到多個主機的JVM中,不同的執行緒組中並行執行。基於ZooKeeper的純Java實現,由Alibaba開源。 程式碼實

Android SyetemServer程序啟動過程(基於7.0 N版本原始碼)

前言 上一篇我們學習了Zygote程序,並且知道Zygote程序啟動了SyetemServer程序,那麼這一篇我們就來學習Android7.0版本的SyetemServer程序的啟動過程。 1.Zygote啟動SyetemServer程序 在上一篇文章中我們講到在Zyg

朱老師ARM裸機學習筆記(四):S5PV210啟動過程詳解

常用器件特性 記憶體: SRAM 靜態記憶體 特點就是容量小、價格高,優點是不需要軟體初始化直接上電就能用 DRAM 動態記憶體 特點就是容量大、價格低,缺點就是上電後不能直接使用,需要軟體初始化後才可以使用。 微

Windows 7啟動過程常識和故障修復

Windows7的啟動過程的常識 電腦加電後,首先是啟動BIOS程式,BIOS自檢完畢後,找到硬碟上的主引導記錄MBR,MBR讀取DPT(分割槽表),從中找出活動的主分割槽,然後讀取活動主分割槽的PBR(分割槽引導記錄,也叫dbr),PBR再搜尋分割槽內的啟動管理器檔案 B

Android應用程式的Activity啟動過程簡要介紹和學習計劃

        在Android系統中,Activity和Service是應用程式的核心元件,它們以鬆藕合的方式組合在一起構成了一個完整的應用程式,這得益於應用程式框架層提供了一套完整的機制來協助應用程式啟動這些Activity和Service,以及提供Binder機制幫助它