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中可以看到电压变化

 

你可能感兴趣的:(gem5,GEM5,DVFS)