首先下载编译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中可以看到电压变化