首先下載編譯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中可以看到電壓變化