GEM5中AMR全系統DVFS

首先下載編譯gem5,之前的博客說過就不再說了。

現在就開始BB。

1、既然是運行ARM的全系統,所以就要ARM的kernel和DISK。其中內核需要翻牆。

git clone --depth 10 https://gem5.googlesource.com/arm/linux-arm-legacy

wget http://www.gem5.org/dist/current/arm/arm-system-2013-07.tar.bz2

disk解壓後就能使用了,內核需要編譯才能使用,所以先下載個交叉編譯器(如果已經由arm-linux-gcc的也就不用下載了)

sudo apt-get install gcc-arm-linux-gnueabihf

 將剛剛下載的內核解壓,進入文件夾,運行

make ARCH=arm vexpress_gem5_dvfs_defconfig           
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8

第一行是進行編譯的設置,可以看到選擇arm架構(因爲linux系統最基礎的是x86架構的),其中也可以使用make menuconfig ARCH=arm 進行圖形化編譯,但最好先看看vexpress_gem5_dvfs_defconfig中是怎麼設置的。

第二行是編譯,使用的工具是剛剛下載的 arm-linux-gnueabih。

這裏有個注意點,我的是ubuntu16.04,gcc大版本是5,而這個內核比較老,所以會報錯

fatal error : linux/compiler-gcc5.h

我們只需要進入./include/linux/文件夾,將compiler-gcc4.h複製成compiler-gcc5.h就行

編譯完成後就有了vmlinux可執行文件,這就是我們需要的kernel

我們還需要dts文件在linux-arm-legacy/arch/arm/boot/dts/中類似

vexpress-v2p-ca15-tc1-gem5_dvfs_1cpus.dtb

需要啥複製啥dvfs,幾個核,是否每個核不同等

2、接下來就要修改gem5啦

首先,我將剛剛的disk和kernel都放在一個文件夾fs-image裏。

我接下來的根目錄就是gem5,用./就表示是gem5目錄下的

1) 修改./config/common/SysPath.py

將path=['/dist.m5/system','xxxxxxx'](忘記後面這個字符串了)修改成path=['/dist.m5/system','/home/xx/gem5/fs-iamge']

地址需要看着修改

2)修改./config/common/Benchmarks.py

將arm選項的disk修改爲你需要加載的,可以參考如下

    def disk(self):
        if self.diskname:
            return disk(self.diskname)
        elif buildEnv['TARGET_ISA'] == 'alpha':
            return env.get('LINUX_IMAGE', disk('linux-latest.img'))
        elif buildEnv['TARGET_ISA'] == 'x86':
            return env.get('LINUX_IMAGE', disk('x86root.img'))
        elif buildEnv['TARGET_ISA'] == 'arm':
            return env.get('LINUX_IMAGE', disk('arm-ubuntu-natty-headless.img'))
        else:
            print "Don't know what default disk image to use for %s ISA" % \
                buildEnv['TARGET_ISA']
            exit(1)

3)./configs/example/fs.py

複製fs.py爲fsdvfs.py (怕自己改錯就回不去了)。改的也不是很多,可以用刪掉的定位。

   # Create a CPU voltage domain
-    test_sys.cpu_voltage_domain = VoltageDomain()
+    test_sys.cpu_voltage_domain=VoltageDomain(voltage=['1V','0.9V','0.8V'])
   # Create a source clock for the CPUs and set the clock period
     test_sys.cpu_clk_domain = SrcClockDomain(clock = ['1 GHz','500 MHz','100 MHz'],
                                              voltage_domain =
-                                             test_sys.cpu_voltage_domain)
+                                             test_sys.cpu_voltage_domain,
+                                             domain_id = 0)
   

+    test_sys.dvfs_handler.domains = test_sys.cpu_clk_domain
+    test_sys.dvfs_handler.enable = 1

   

4)運行試一試

./build/ARM/gem5.opt ./configs/example/fsdvfs.py --cpu-type=DerivO3CPU -n 1  --machine-type=VExpress_EMM --kernel=vmlinux --dtb-filename=/home/xx/gem5/fs-image/vexpress-v2p-ca15-tc1-gem5_dvfs_1cpus.dtb  --caches

報錯

a、缺少vmlinux.xxx 文件:那是因爲 --machine-type有個默認的dbt文件,而我們沒有使用。

解決方法:在./configs/common/FSConfig.py中找到缺少的文件

 if bare_metal:
        # EOT character on UART will end the simulation
        self.realview.uart.end_on_eot = True
    else:
        if machine_type == "VExpress_EMM64":
            self.kernel = binary('vmlinux.aarch64.20140821')
        elif machine_type == "VExpress_EMM":
-            self.kernel = binary('vmlinux.armxxxx')#真記不得是什麼內容了
+            self.kernel = binary('vexpress-v2p-ca15-tc1-gem5_dvfs_1cpus.dtb')
        else:
            self.kernel = binary('vmlinux.arm.smp.fb.2.6.38.8')

        if dtb_filename:
            self.dtb_filename = binary(dtb_filename)
        self.machine_type = machine_type

目前就這個錯,如有新的歡迎討論,我記得之前有個不能運行O3cpu的錯,後來不知道怎麼修改完成的。

3、正式運行dvfs

./build/ARM/gem5.opt ./configs/example/fsdvfs.py  --debug-flags=DVFS,EnergyCtrl  --debug-file=dfvs_debug.log --cpu-type=DerivO3CPU -n 1  --machine-type=VExpress_EMM --kernel=vmlinux --dtb-filename=/home/xx/gem5/fs-image/vexpress-v2p-ca15-tc1-gem5_dvfs_1cpus.dtb  --caches

然後就和普通linux一樣,可以用cpufreq以及不同的策略啦,而在m5out中dfvs_debug.log中可以看到電壓變化


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章