Procesadores modernos con s
´
olo unos Clicks
Modern processors with just a few clicks
Lilian Bossuet
1
and Carlos Andres Lara-Nino
2
Universit
´
e Jean Monnet Saint-
´
etienne, CNRS, Laboratoire Hubert Curien UMR 5516, F-42023
SAINT-ETIENNE 42000, France
1
lilian.bossuet@univ-st-etienne.fr
Universitat Rovira i Virgili, Departament d’Enginyeria, Inform
`
atica i Mathem
`
atiques
TARRAGONA 43003, Espanya
2
carlos.lara@fundacio.urv.cat
Resumen—Algunos programas educativos en
´
areas de
ingenier
´
ıa y tecnolog
´
ıas a menudo tienen dificultades para
proveer a sus estudiantes con los instrumentos necesarios
para realizar trabajos experimentales. Esto puede deberse
a dificultades econ
´
omicas o simplemente por falta de
oportunidades para adquirir suficientes dispositivos. En estos
casos, el dise
˜
no asistido por computadora podr
´
ıa adoptarse
para modelar un gran n
´
umero de dispositivos con bajos costos
de operaci
´
on. En este art
´
ıculo se describe el uso del simulador
gem5 como una herramienta que puede ser de utilidad para
estudiantes de educaci
´
on superior en las
´
areas de ingenier
´
ıa
e inform
´
atica. Revisaremos el reto que representa para los
estudiantes el tener acceso a placas de prototipado modernas
y describiremos c
´
omo el uso de un simulador puede resolver
este problema hasta cierto punto. Finalmente, ilustraremos
paso a paso el uso del simulador gem5 para emular un
microprocesador moderno.
Palabras clave: ARM; RISC-V; gem5; emulaci
´
on de
microprocesadores.
Abstract— Some educational programs in areas of engineering
and technology often have difficulties providing their students
with the necessary instruments to carry out experimental
work. This may be due to financial difficulties or simply a
lack of opportunities to purchase enough devices. In these
cases, computer-aided design could be adopted to model a
large number of devices with low operating costs. This article
describes the use of the gem5 simulator as a tool that can be
useful for higher education students in the areas of engineering
and computer sciences. We will review the challenge for
students of having access to modern prototyping boards and
describe how the use of a simulator can solve this problem
to some extent. Finally, we will illustrate step by step the
use of the gem5 simulator to emulate a modern microprocessor.
Keywords: ARM; RISC-V; gem5; microprocessor emulation.
I. INTRODUCCI
´
ON
El desarrollo de la educaci
´
on en las
´
areas de ingenier
´
ıa
y computaci
´
on va de la mano con el uso de plataformas
de prototipado que permiten al alumno efectuar actividades
pr
´
acticas y conducir experimentos para enriquecer su for-
maci
´
on profesional [1], [2]. Desafortunadamente, muchos
estudiantes carecen de acceso a estos dispositivos. Dada la
realidad socioecon
´
omica de Latinoam
´
erica [3], no es una
expectativa razonable pensar que todos los alumnos podr
´
ıan
adquirir una tarjeta de pruebas s
´
olo porque una asignatura
la requiere. Si la instituci
´
on educativa tiene la posibilidad
de prestar estas tecnolog
´
ıas a sus estudiantes, este servicio
generalmente viene con restricciones horarias y est
´
a sujeto
a la disponibilidad del material. Sin mencionar que, para
un programa acad
´
emico promedio, resultar
´
a complicado
adquirir distintas versiones de la misma tecnolog
´
ıa. Por
ejemplo, se tendr
´
a acceso a tarjetas Arduino con un pro-
cesador AVR
®
. Sistemas que son generalmente reservados
para tareas b
´
asicas de prototipado [4], [5].
Aunado a esto, quienes hayan tenido la experiencia
de gestionar la adquisici
´
on de sistemas de procesamiento
modernos en cantidades moderadas (unos 12 dispositivos)
estar
´
an al tanto del impacto de la escasez global de semi-
conductores [6], [7]. Hay largas listas de espera con tiempos
de entrega que van de meses a a
˜
nos. Para un centro de for-
maci
´
on esto se traducir
´
ıa en al menos una promoci
´
on que no
tendr
´
a acceso a la tecnolog
´
ıa recientemente adquirida. Para
un alumno esto resultar
´
a en tener que buscar los dispositivos
en mercados alternos, usualmente con sobreprecios.
Sin duda, habr
´
a un grupo significativo de centros de
educaci
´
on superior con ofertas formativas en ingenier
´
ıas y
computaci
´
on en los que los alumnos no puedan acceder
a plataformas de pruebas para desarrollar las actividades
pr
´
acticas deseables. Desafortunadamente, un alto n
´
umero de
estudiantes llegar
´
a a optar por estas alternativas de forma-
ci
´
on, ya sea por limitantes econ
´
omicos o por la proximidad
a sus lugares de origen.
En todos estos casos, es imperativo identificar alternativas
que permitan un acceso a la tecnolog
´
ıa con bajo costo y
alta disponibilidad [8], [9]. Que sean flexibles y puedan
adaptarse a los avances en la investigaci
´
on y desarrollo para
brindar a los usuarios la oportunidad de generar experiencia
con tecnolog
´
ıas de punta. Esto sin duda se ver
´
a reflejado en
mejores oportunidades laborales y un mercado m
´
as laboral
m
´
as competitivo.
En este art
´
ıculo, proponemos hacer uso de gem5, un
emulador de arquitecturas hardware preciso a nivel de ciclos
(cycle accurate) para enriquecer los procesos de formaci
´
on
que involucren el estudio de sistemas de c
´
omputo embe-
bido. Estos dispositivos, llamados procesadores modernos,
incluyen arquitecturas como ARM y RISC-V, tecnolog
´
ıas
muy utilizadas en la industria y la investigaci
´
on avanzada.
Mediante el uso de la emulaci
´
on de estos sistemas, buscamos
solventar problemas relacionados con la adquisici
´
on y acce-
so a las tecnolog
´
ıas. No obstante, existen retos asociados con
la adopci
´
on de gem5. Uno de los principales su complejidad
Revista elektron, Vol. 8, No. 1, pp. 5-12 (2024)
ISSN 2525-0159
5
Recibido: 16/04/24; Aceptado: 17/05/24
Creative Commons License - Attribution-NonCommercial-
NoDerivatives 4.0 International (CC BY-NC-ND 4.0)
https://doi.org/10.37537/rev.elektron.8.1.189.2024
Original Article
inicial de uso. Por eso parte de este documento detalla paso
a paso el proceso para utilizar esta herramienta.
El resto del documento se estructura de la siguiente ma-
nera. En la Secci
´
on II proporcionamos nociones b
´
asicas de
virtualizaci
´
on para permitir al lector comprender a grandes
rasgos la estrategia propuesta. Despu
´
es, en la Secci
´
on III
hablamos sobre distintos sistemas existentes que permiten
la emulaci
´
on de circuitos digitales. En la Secci
´
on IV se
introduce gem5 y se detallan sus particularidades mientras
que la Secci
´
on V proporciona distintos ejemplos para su
uso. Finalmente, la Secci
´
on VI cierra el art
´
ıculo con nuestras
conclusiones y comentarios finales.
II. UNA COMPUTADORA DENTRO DE OTRA
En mayor o menor medida, se puede constatar que
el acceso en Latinoam
´
erica a equipos de c
´
omputo se ha
incrementado a lo largo de los a
˜
nos. Estos sistemas de
c
´
omputo distan mucho de los microcontroladores requeridos
en la formaci
´
on de ingenier
´
ıas y computaci
´
on. Primero, su
tama
˜
no y especificaciones difieren: la cantidad de memoria
disponible ser
´
a superior en una computadora, est
´
a tendr
´
a
uno o varios procesadores m
´
as potentes, y el sistema de
alimentaci
´
on es generalmente constante. Podr
´
ıamos llegar
a la conclusi
´
on que una computadora (procesador) ser
´
a
generalmente superior a una tarjeta de prototipado (micro-
procesador). Pero al mismo tiempo, no es sencillo programar
los procesadores de una computadora como lo har
´
ıamos
con una tarjeta Arduino, o tener el mismo grado de acceso
a sus perif
´
ericos. ¿C
´
omo hacer entonces para utilizar los
equipos de c
´
omputo con mayor disponibilidad para emular
el comportamiento de un microprocesador que es dif
´
ıcil de
conseguir?
Figura 1: Si consideramos que una computadora es un
procesador grande, es l
´
ogico pensar que ser
´
ıa posible mo-
delar un procesador m
´
as peque
˜
no dentro de este sistema.
El procesador m
´
as peque
˜
no puede entonces contener sus
propias aplicaciones o programas.
En las ciencias de la computaci
´
on existe la noci
´
on de
m
´
aquina virtual, que se aplica para el caso donde utilizamos
un programa de computadora que va a emular otra compu-
tadora dentro del equipo. Claramente, como se ilustra en
la Fig. 1, la computadora interna ser
´
a m
´
as limitada que la
m
´
aquina f
´
ısica. No obstante, esta estrategia puede ser de
utilidad para tener acceso a un sistema operativo distinto sin
necesidad de modificar el equipo, o para probar la ejecuci
´
on
de algunas aplicaciones en un entorno controlado.
Una de las herramientas m
´
as ampliamente utilizada para
virtualizar microprocesadores es qemu [10], que toma su
nombre del ingl
´
es quick emulator. Este programa de
computadora permite emular el procesador de un sistema
mediante la traducci
´
on binaria din
´
amica y proporciona
m
´
ultiples modelos de hardware que permiten ejecutar una
variedad de sistemas operativos o tambi
´
en aplicaciones en
bare metal (sin sistema operativo).
Sin embargo, un entorno virtual permite simplemente
replicar el comportamiento l
´
ogico del sistema que deseamos
emular. En el mejor de los casos, trasladar
´
a todas las
instrucciones del entorno virtual en c
´
odigo m
´
aquina que
puede interpretar el hardware. En contraste, si se desea
estudiar la cantidad de accesos a memoria, los fallos en la
cache, o incluso la disipaci
´
on de potencia de una plataforma,
ser
´
a necesario buscar otras alternativas.
III. EMULACI
´
ON DE HARDWARE
Al igual que hay emuladores del comportamiento l
´
ogico
de una computadora, existe software dedicado a modelar la
respuesta de un circuito electr
´
onico, sea este anal
´
ogico o
digital. El m
´
as popular es sin duda SPICE [11] (del ingl
´
es
Simulation Program with Integrated Circuit Emphasis”).
Esta herramienta permite, entre otras cosas, verificar que la
operaci
´
on de un circuito anal
´
ogicos sea correcta y predecir
su funcionamiento, como se muestra en la Fig. 2a. Desde
su introducci
´
on en 1989, el
´
exito de este simulador se debe
en gran medida a que es Open Source, esto quiere decir que
el c
´
odigo fuente est
´
a disponible para todos, adem
´
as que su
uso es gratuito para actividades no lucrativas. Su desventaja
principal es la complejidad de uso, ya que es necesario
contar con los modelos matem
´
aticos precisos de todos los
componentes del sistema a analizar. Esto hace que el estudio
de sistemas complejos, como un procesador moderno, sea
pr
´
acticamente imposible.
A pesar de la complejidad de los sistemas digitales, se
tiene la ventaja de que su comportamiento est
´
a definido por
ciclos de reloj. Esto se ilustra en la Fig. 2b. Evidentemente,
para modelar fen
´
omenos t
´
ermicos o el
´
ectricos se necesitar
´
a
una resoluci
´
on menor, pero en general se considera que
un modelo cycle accurate (preciso a nivel de ciclos) es
aceptable. Para estas tareas se tienen herramientas como
KTechLab que son de c
´
odigo abierto y gratuitas y que
permiten analizar circuitos digitales complejos.
En la industria, encontramos soluciones m
´
as potentes
como Proteus Design Suite
®
, que permiten estudiar el
funcionamiento de componentes anal
´
ogicos y digitales, as
´
ı
como microprocesadores con c
´
odigos internos modificables.
La principal limitaci
´
on para su uso en educaci
´
on es su
costo elevado. Es posible solicitar una licencia temporal
para estudiantes, pero esta no permite guardar el estado
del proyecto. Otra limitaci
´
on de esta herramienta es que
los modelos de los componentes son limitados y crear u
obtener nuevos modelos resulta dif
´
ıcil si hemos de respetar
la licencia de uso. Adem
´
as, ¿qu
´
e pasa cuando es de inter
´
es
estudiar rutinas de procesamiento m
´
as complicadas como un
sistema operativo completo?
Revista elektron, Vol. 8, No. 1, pp. 5-12 (2024)
ISSN 2525-0159
6
http://elektron.fi.uba.ar
(a) Estudio de una se
˜
nal anal
´
ogica (b) Comportamiento de un circuito digital
Figura 2: Para analizar una magnitud como el voltaje o la temperatura del circuito es necesario usar un periodo de
simulaci
´
on acorde a la variaci
´
on de la se
˜
nal. Por el contrario, para estudiar el comportamiento de un circuito digital es
posible efectuar un an
´
alisis a la frecuencia del procesador.
IV. UN SIMULADOR PARA HARDWARE Y SOFTWARE
Las limitaciones mencionadas en las previas secciones no
aplican
´
unicamente al caso de los estudiantes, sino que son
problemas frecuentes alrededor del mundo. As
´
ı que algunos
investigadores han respondido a las preguntas planteadas
creando un sistema de simulaci
´
on completo, gratuito y de
c
´
odigo abierto, que permite la emulaci
´
on de sistemas l
´
ogicos
complejos, pero tambi
´
en modela el hardware subyacente.
Al combinar una iniciativa de la Universidad de Wiscon-
sin llamada GEMS [12], que viene de General Execution-
driven Multiprocessor Simulator, con un proyecto de la
Universidad de Michigan llamado M5 [13] (ambas insti-
tuciones de los EE. UU.) fue posible crear un simulador
ahora conocido como gem5 [14]. El logotipo del proyecto
se muestra en la Fig. 3.
Figura 3: El simulador gem5 es gratuito y de c
´
odigo abierto.
Este sistema ofrece soporte nativo para la simulaci
´
on de
procesadores con arquitecturas del conjunto de instrucciones
de tipo Alpha, ARM, SPARC, MIPS, POWER, RISC-V y
x86. Es posible lanzar una simulaci
´
on reducida del sistema
conocida como system-call emulation (SE) o una simulaci
´
on
completa conocida como full system simulation (FS) que
permite interactuar con el procesador y obtener estad
´
ısticas
adicionales (disponible para Alpha, ARM, SPARC, RISC-
V y x86). En particular, los modelos para ARM y RISC-V
proporcionan herramientas interesantes para el estudio de los
microcontroladores utilizados en aplicaciones de vanguardia.
Existen ciertas limitantes principales para el uso de gem5
en las tareas de educaci
´
on. Primero, el software existe solo
para sistemas operativos basados en Linux. Seg
´
un datos
recopilados por statcounter [15], para abril de 2022 casi el
75 % de las conexiones a internet provenientes de compu-
tadoras de escritorio y port
´
atiles usaba Windows, mientras
que apenas un 2.5 % usaba sistemas operativos basados en
Linux. No se tienen estad
´
ısticas s
´
olo para Am
´
erica latina,
pero se puede esperar que el porcentaje de computadoras
que usan Linux ser
´
a menor. Mientras que es posible emu-
lar Ubuntu o Debian en una m
´
aquina virtual, esto no es
recomendado para lanzar una simulaci
´
on de gem5.
Lo que nos lleva a la segunda limitante: la complejidad
de procesamiento. El tiempo requerido para completar una
simulaci
´
on tipo FS depender
´
a en gran medida de la arquitec-
tura a emular y la carga de procesamiento. Por ejemplo, para
una computadora port
´
atil con un procesador i7 y 32 GB de
RAM, emular Ubuntu en un procesador Cortex A-57 tomar
´
a
algunos minutos; note que estas especificaciones estar
´
an
muy por encima de los sistemas de c
´
omputo normalmente
disponibles para un estudiante. Para solventar esta limitante,
gem5 permite hacer uso de checkpoints y regions of interest
que son instant
´
aneas tomadas de la simulaci
´
on que hacen
necesario tener que ejecutar las tareas m
´
as pesadas s
´
olo
una vez y retomar el procesamiento en el punto de inter
´
es.
Por ejemplo, si deseamos modificar s
´
olo el archivo binario
que ser
´
a ejecutado en el microprocesador no ser
´
ıa pr
´
actico
simular nuevamente todo el proceso de arranque del sistema.
La tercera caracter
´
ıstica que podr
´
ıamos considerar como
una limitante es la inclinada pendiente en la curva de
aprendizaje para trabajar con gem5. El principal lenguaje del
simulador es Python, lo que facilita su uso en cierta medida.
No obstante, un usuario avanzado requerir
´
a conocimientos
puntuales de sistemas basados en Linux, programaci
´
on
en C/C++, uso de compiladores cruzados, arquitectura de
computadoras, sistemas de memoria, e incluso sistemas de
Revista elektron, Vol. 8, No. 1, pp. 5-12 (2024)
ISSN 2525-0159
7
http://elektron.fi.uba.ar
control de versiones (git). Sin embargo, todo depende del
cristal con que se mire. Estos conocimientos se necesitan
para crear un modelo de simulaci
´
on que una vez definido
puede utilizar muchos usuarios. A su vez, trabajar en el
dise
˜
no de estos modelos aportar
´
ıa una amplia gama de
conocimientos para los estudiantes.
V. UN EJEMPLO DE USO
Para esta Secci
´
on supondremos que el equipo de tra-
bajo cuenta con todas las dependencias necesarias [16].
Tambi
´
en supondremos que el usuario cuenta con per-
misos de administrador para ejecutar algunas tareas. El
ejemplo se ha creado en una computadora port
´
atil con
Ubuntu 20.04 y la versi
´
on v22.0.0.2 de gem5 (Commit
1d03f6de941520860c673b5f7954c82a46e8b191).
Se propone la simulaci
´
on completa de un chip ARMv8-A,
que ha sido utilizado en una amplia gama de sistemas desde
smartphones (Huawei Mate 9) hasta tarjetas de prototipado
(Hikey 960). Uno de estos sistemas se muestra en la Fig.
4. Dentro del chip existe un cluster con varios n
´
ucleos
Cortex-A57/A73 y un cluster con varios n
´
ucleos Cortex-
A53 siguiendo una arquitectura big.LITTLE. El principal
atractivo de este tipo de sistemas es su eficiencia energ
´
etica
al cambiar la carga de procesamiento de un cl
´
uster a otro
seg
´
un la demanda. En este microprocesador vamos a cargar
el sistema operativo Ubuntu 18.04 y desde all
´
ı ejecutar una
aplicaci
´
on en C.
Figura 4: Un chip de la familia ARMv8-A. Las tarjetas de
prototipado equipadas con estos microprocesadores tienen
un costo en el mercado que ronda los 250 USD.
El primer paso por realizar es obtener una copia del
c
´
odigo del simulador, algo que es tan sencillo como abrir
una terminal y ejecutar el comando:
git clone https://gem5.googlesource.com/public/gem5
cd gem5
git checkout 1d03f6de941520860c673b5f7954c82a46e8b191
Cuando se acaba la descarga, se debe entrar al directorio
creado y compilar el simulador. Esto se puede llevar a cabo
con las instrucciones:
scons build/ARM/gem5.opt -j $(nproc)
Note que en este caso vamos a compilar el simulador
para trabajar con arquitecturas ARM. Si se desea usar una
ISA diferente se deber
´
a modificar la segunda instrucci
´
on,
por ejemplo scons build/X86/gem5.opt crear
´
a los
componentes necesarios para simular sistemas X86. Adi-
cionalmente, usaremos la extensi
´
on opt, pero igualmente se
podr
´
ıa lanzar gem5.debug o gem5.fast seg
´
un el tipo
de optimizaci
´
on deseado.
El proceso para compilar el simulador es largo y pesado.
Por suerte solo es necesario efectuar una vez esta tarea.
Cuando este ha terminado, procederemos a obtener algunos
archivos binarios para conducir la simulaci
´
on. Estos se
pueden descargar usando:
mkdir common; cd common
wget http://dist.gem5.org/dist/v22-0/arm/aarch-system
-20220707.tar.bz2
tar -xf aarch-system-20220707.tar.bz2
wget http://dist.gem5.org/dist/v22-0/arm/disks/ubuntu
-18.04-arm64-docker.img.bz2
bzip2 -d ubuntu-18.04-arm64-docker.img.bz2
cd -
Dentro del directorio gem5/common/ ahora
encontraremos binarios para el proceso de boot, im
´
agenes
del kernel de Linux, y discos con sistemas de archivos
para el sistema operativo. En particular haremos uso de
los archivos gem5/common/binaries/boot.arm64,
gem5/common/binaries/vmlinux.arm64, y
gem5/common/ubuntu-18.04-arm64-docker.img.
Note que todos corresponden a la arquitectura AArch64
que se encuentra en los procesadores Cortex A53/A57.
En este punto ya se puede lanzar una simulaci
´
on b
´
asi-
ca del sistema para verificar que todo se ha compilado
correctamente. Para ello se har
´
a uso de un script de si-
mulaci
´
on escrito en lenguaje Python. Dentro del directo-
rio gem5/configs/example/arm se puede encontrar
el archivo fs_bigLITTLE.py que permite simular una
arquitectura big.LITTLE gen
´
erica. En la terminal, dentro del
directorio gem5/ se puede lanzar la simulaci
´
on usando el
comando:
./build/ARM/gem5.opt \
./configs/example/arm/fs_bigLITTLE.py \
--caches \
--bootloader=./common/binaries/boot.arm64 \
--kernel=./common/binaries/vmlinux.arm64 \
--disk=./common/ubuntu-18.04-arm64-docker.img
Para interactuar con el microprocesador simulado, en otra
ventana de la terminal ser
´
a necesario compilar la terminal
virtual de gem5 y conectarse con el simulador. Para ello
basta utilizar los siguientes comandos:
cd gem5/util/term
make
./m5term 3456
Note que el puerto utilizado es el mismo indicado en la
primera terminal donde se lanz
´
o la simulaci
´
on, generalmente
aparecer
´
a como:
system.terminal: Listening for connections on port 3456
Si todo ha marchado bien, la segunda terminal deber
´
a
indicar la bienvenida a Ubuntu y el login autom
´
atico de la
sesi
´
on de administrador. Una vez dentro de la simulaci
´
on,
esta puede finalizarse usando el comando:
m5 exit
Este es un caso muy b
´
asico donde se usan esencialmente
todos los par
´
ametros de una simulaci
´
on gen
´
erica de la
arquitectura. En las secciones siguientes vamos a crear el
modelo de simulaci
´
on para el ejemplo propuesto, para ello
se crear
´
a un nuevo script de simulaci
´
on para aplicar los
cambios necesarios:
Revista elektron, Vol. 8, No. 1, pp. 5-12 (2024)
ISSN 2525-0159
8
http://elektron.fi.uba.ar
cd configs/example/arm/
cp fs_bigLITTLE.py Hikey960.py
gedit Hikey960.py &
cd -
V-A. Ajuste din
´
amico de frecuencias y voltajes
Una caracter
´
ıstica muy importante de los microprocesado-
res modernos es su capacidad para modificar su frecuencia y
voltaje de operaci
´
on en funci
´
on de la demanda de procesa-
miento. Esta estrategia es conocida como DVFS, del ingl
´
es
Dynamic Voltage and Frequency Scaling.
El primer paso ser
´
a agregar opciones al script para para
poder pasar los par
´
ametros al simulador desde la l
´
ınea de
comandos. En la funci
´
on addOptions() se van a agregar
tres argumentos y se editar
´
an dos que ya existen:
def addOptions(parser):
[...]
parser.add_argument("--big-cpu-clock", nargs="+",
default="2GHz")
parser.add_argument("--little-cpu-clock", nargs="+",
default="1GHz")
parser.add_argument("--big-cpu-voltage", nargs="+",
default="1.0V")
parser.add_argument("--little-cpu-voltage", nargs="+
", default="1.0V")
parser.add_argument("--dvfs", action="store_true")
return parser
En seguida se editar
´
a el modelo de los cl
´
usteres para enla-
zar los valores de voltaje proporcionados a cada procesador:
def build(options):
[...]
system.bigCluster = big_model(system,
options.big_cpus,
options.big_cpu_clock,
options.big_cpu_voltage)
[...]
system.littleCluster = little_model(system,
options.little_cpus,
options.little_cpu_clock,
options.
little_cpu_voltage)
[...]
Tambi
´
en ser
´
a necesario activar el m
´
odulo para DVFS del
simulador e indicar que use los dominios de reloj asignados
a cada cl
´
uster:
def build(options):
[...]
if options.dvfs:
system.dvfs_handler.domains = [
system.bigCluster.clk_domain,
system.littleCluster.clk_domain]
system.dvfs_handler.enable = options.dvfs
return root
Luego ser
´
a necesario editar el archivo
gem5/configs/example/arm/devices.py para
asignar un ID v
´
alido a cada dominio de reloj. Note que este
archivo tambi
´
en especifica los valores para las memorias
cache utilizadas en la arquitectura a simular, por ende, para
obtener un modelo m
´
as preciso del sistema ser
´
ıa necesario
ajustar estos valores.
class CpuCluster(SubSystem):
[...]
self.clk_domain = SrcClockDomain(clock=cpu_clock,
voltage_domain=self.voltage_domain,
domain_id=system.numCpuClusters())
[...]
La arquitectura de una computadora est
´
a declarada en
archivos de extensi
´
on dtb (devicetree blob) que son gene-
rados a partir de un archivo dts (devicetree source). Esta
especificaci
´
on es usada por el kernel para instalar los drivers
necesarios que permitir
´
an al sistema operativo controlar el
dispositivo. gem5 cuenta con una herramienta que permite
generar autom
´
aticamente un archivo dtb para cada simula-
ci
´
on. No obstante, esta utilidad no permite enlazar correc-
tamente los dominios de reloj para m
´
ultiples cl
´
usteres. De
no usar un archivo dtb adaptado para el modelo, el segundo
cl
´
uster no ser
´
ıa conectado correctamente al controlador de
DVFS.
Afortunadamente, el c
´
odigo fuente del simulador tambi
´
en
incluye algunas plantillas para generar archivos dtb par al-
gunas arquitecturas familiares. Aun as
´
ı, ser
´
a necesario editar
estas fuentes para obtener la especificaci
´
on definitiva de la
arquitectura a simular. En el ejemplo propuesto buscamos un
sistema big.LITTLE con cuatro n
´
ucleos en ambos cl
´
usteres
mientras que las plantillas gen
´
ericas s
´
olo ofrecen hasta dos
n
´
ucleos en el cl
´
uster principal.
Primero es necesario editar el archivo
gem5/system/arm/dt/Makefile para agregar
un nuevo objeto a la lista de compilaci
´
on:
TARGETS=\
[...]
armv8_gem5_v1_big_little_4_4.dtb \
[...]
Despu
´
es se debe editar el archivo
gem5/system/arm/dt/armv8_big_little.dts
para habilitar el controlador de energ
´
ıa de gem5 e incluir la
configuraci
´
on big.LITTLE deseada:
[...]
#define _4_4 3
[...]
gem5_energy_ctrl@10000000 {
reg = <0x00 0x10000000 0x00 0x1000>;
compatible = "arm,gem5-energy-ctrl";
};
[...]
#elif CONF_CPUS == _4_4
CPU(0,0x0)
CPU(1,0x1)
CPU(2,0x2)
CPU(3,0x3)
CPU(4,0x104)
CPU(5,0x105)
CPU(6,0x106)
CPU(7,0x107)
cpu-map {
cluster0 {
core0 { cpu = <&CPU0>; };
core1 { cpu = <&CPU1>; };
core2 { cpu = <&CPU2>; };
core3 { cpu = <&CPU3>; };
};
cluster1 {
core0 { cpu = <&CPU4>; };
core1 { cpu = <&CPU5>; };
core2 { cpu = <&CPU6>; };
core3 { cpu = <&CPU7>; };
};
};
[...]
Revista elektron, Vol. 8, No. 1, pp. 5-12 (2024)
ISSN 2525-0159
9
http://elektron.fi.uba.ar
Finalmente, usar el comando make dentro del directorio
gem5/system/arm/dt/ producir
´
a el archivo armv8_-
gem5_v1_big_little_4_4.dtb que ser
´
a utilizado en
la simulaci
´
on.
Para probar que se ha habilitado el mecanismo de DVFS
de manera correcta, ahora se puede lanzar una simulaci
´
on
m
´
as completa del sistema:
./build/ARM/gem5.opt \
./configs/example/arm/Hikey960.py \
--big-cpus 4 \
--little-cpus 4 \
--caches \
--bootloader=./common/binaries/boot.arm64 \
--kernel=./common/binaries/vmlinux.arm64 \
--disk=./common/ubuntu-18.04-arm64-docker.img \
--dtb=./system/arm/dt/armv8_gem5_v1_big_little_4_4.dtb \
--dvfs \
--big-cpu-clock 2362MHz 2112MHz 1805MHz 1421MHz 903MHz \
--little-cpu-clock 1402MHz 999MHz 533MHz \
--big-cpu-voltage 1.0V 0.99V 0.98V 0.97V 0.96V \
--little-cpu-voltage 0.87V 0.86V 0.85V
Para usar DVFS en gem5 es necesario que el n
´
umero de
valores de frecuencia para un cl
´
uster sea el mismo que el
n
´
umero de valores de voltaje, y que ambos est
´
en ordenados
de manera decreciente. Note que es posible especificar los
diferentes puntos de operaci
´
on en voltaje y frecuencia del
procesador sin necesidad de modificar el modelo, esto es
gracias al uso de argumentos en el script de simulaci
´
on.
V-B. Modelando el consumo de energ
´
ıa del sistema
Por defecto, gem5 genera algunas estad
´
ısticas de la si-
mulaci
´
on en el archivo gem5/m5out/stats.txt. Es
posible usar este sistema para evaluar distintas m
´
etricas del
procesador, por ejemplo, la cantidad de accesos o fallos en
alguna de las memorias cache. Se puede tambi
´
en crear un
modelo del consumo de energ
´
ıa. Para ello es necesario editar
el script de la simulaci
´
on. Primero ser
´
a necesario definir
un modelo de potencia para cada componente de inter
´
es.
En este ejemplo revisaremos c
´
omo proceder en el caso de
los CPU, pero es posible tambi
´
en agregar modelos para las
memorias u otros componentes.
En gem5 un modelo de potencia extiende la clase
PowerModel e implementa cuatro clases que a su vez ex-
tienden la clase MathExprPowerModel correspondientes
con los estados de ON, CLK GATED, SRAM RETENTION
y OFF. Cada modelo debe tener estos cuatro comporta-
mientos, aunque es posible indicar que todos usen el mismo
modelo:
[...]
class CpuPowerOn(MathExprPowerModel):
def __init__(self, cpu_path,
**
kwargs):
su pe r(CpuPowerOn, self).__init__(
**
kwargs)
self.dyn = "voltage
*
2
*
{}.ipc".f orm at(
cpu_path)
self.st = "4
*
temp"
class CpuPowerOff(MathExprPowerModel):
dyn = "0"
st = "0"
class CpuPowerModel(PowerModel):
def __init__(self, cpu_path,
**
kwargs):
su pe r(CpuPowerModel, self).__init__(
**
kwargs)
self.pm = [
CpuPowerOn(cpu_path), # ON
CpuPowerOff(), # CLK_GATED
CpuPowerOff(), # SRAM_RETENTION
CpuPowerOff(), # OFF
]
[...]
Aqu
´
ı tambi
´
en es conveniente usar argumentos de la
l
´
ınea de comandos para controlar la adquisici
´
on de estas
estad
´
ısticas, se agregar
´
a un argumento que permita habilitar
la captura y otro que determine la tasa de adquisici
´
on:
def addOptions(parser):
[...]
parser.add_argument("--power-models", action="
store_true")
parser.add_argument("--stat-freq", t yp e = f l o a t ,
default=1.0E-3)
return parser
Finalmente, para agregar los modelos a la simulaci
´
on e
indicar la tasa de adquisici
´
on a utilizar es necesario editar
el m
´
etodo principal del script de simulaci
´
on:
def main():
[...]
if options.power_models:
if options.cpu_type == "atomic":
m5.fatal("The power models require the ’timing’
CPUs.")
for cpu in root.system.descendants():
if not i s i n s t a n c e (cpu, m5.objects.BaseCPU):
continue
cpu.power_state.default_state = "ON"
cpu.power_model = CpuPowerModel(cpu.path())
instantiate(options)
m5.stats.periodicStatDump(m5.ticks.fromSeconds(options
.stat_freq))
[...]
Note que para estimar modelos del consumo de potencia
es necesario usar un tipo de CPU llamado timing. En gem5
existen CPUs de tipo timing o atomic, que a su vez pueden
usarse para construir otros modelos. En esencia, los CPU de
tipo atomic usan accesos at
´
omicos a memoria mientas que
los CPU de tipo timing, como su nombre lo indica, tienen un
comportamiento que emula periodos de espera y latencias.
Es decir, se aproximan mejor a un comportamiento real. Por
defecto, el script base utilizado toma CPUs de tipo timing,
pero esto tambi
´
en se puede cambiar usando argumentos en
la l
´
ınea de comandos, por ejemplo, se puede usar CPUs
equivalentes a los de un chip Exynos:
./build/ARM/gem5.opt \
./configs/example/arm/Hikey960.py \
--big-cpus 4 \
--little-cpus 4 \
--cpu-type=exynos \
--caches \
--dtb=./system/arm/dt/armv8_gem5_v1_big_little_4_4.dtb \
--bootloader=./common/binaries/boot.arm64 \
--kernel=./common/binaries/vmlinux.arm64 \
--disk=./common/ubuntu-18.04-arm64-docker.img \
--dvfs \
--big-cpu-clock 2362MHz 2112MHz 1805MHz 1421MHz 903MHz \
--little-cpu-clock 1402MHz 999MHz 533MHz \
--big-cpu-voltage 1.0V 0.99V 0.98V 0.97V 0.96V \
--little-cpu-voltage 0.87V 0.86V 0.85V \
--power-models \
--stat-freq 1.0E-3
Cuando se analiza el contenido del archivo de estad
´
ısticas
se puede identificar las relacionadas con los modelos de
potencia. Para este ejemplo se tendr
´
a la potencia est
´
atica y
din
´
amica para cada uno de los ocho n
´
ucleos. La frecuencia
de volcado est
´
a dada por el argumento --stat-freq. Al
especificar una tasa de 1,0 × 10
2
esto equivale a calcular
los modelos 100 veces por segundo simulado, mientras que
una tasa de 1,0×10
3
ser
´
a equivalente a calcular estos datos
Revista elektron, Vol. 8, No. 1, pp. 5-12 (2024)
ISSN 2525-0159
10
http://elektron.fi.uba.ar
cada milisegundo simulado. Evidentemente, incrementar la
frecuencia llevar
´
a a tener un modelo m
´
as preciso, pero
tambi
´
en incrementar
´
a el costo de la simulaci
´
on de forma
significativa. Los resultados esperados para ambos casos se
presentan en la Fig. 5.
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
Time (s)
0
20
40
60
80
100
120
Power (W)
(a) “Timing” CPU a una tasa de 1,0 × 10
2
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
Time (s)
0
20
40
60
80
100
120
Power (W)
(b) “Exynos” CPU a una tasa de 1,0 × 10
3
Figura 5: Gr
´
aficas de la disipaci
´
on de potencia en el CPU0
del cl
´
uster “big. En este caso solo se muestra la disipaci
´
on
durante el arranque del sistema simulado.
Note que los modelos de potencia utilizados correspon-
den con el c
´
alculo de la potencia din
´
amica y est
´
atica del
microprocesador. En el modelo propuesto el primero de
estos valores corresponde a dos veces el voltaje del n
´
ucleo
multiplicado por el n
´
umero de instrucciones por ciclo. Para
el segundo se toma cuatro veces la temperatura del proce-
sador. Existen tres valores globales que se pueden utilizar
en estos modelos: el voltaje (voltage), la temperatura (temp)
y el periodo del procesador (clock period). Fuera de estos,
para hacer uso de otras estad
´
ısticas se debe proporcionar
el nombre completo del objeto, por ejemplo, la siguiente
expresi
´
on va a representar el n
´
umero de instrucciones por
ciclo para el procesador inmediatamente asociado con el
modelo:
"{}.ipc".f orm at(cpu_path)
Este tipo de asignaci
´
on din
´
amica permitir
´
a poder utilizar
un modelo gen
´
erico que se aplicar
´
a a todos los objetos de
tipo CPU o que tienen relaci
´
on con un CPU.
V-C. Aplicaciones y checkpoints
Una vez que se tiene una simulaci
´
on aproximada de la ar-
quitectura de inter
´
es, el siguiente paso ser
´
a poder modificar
las aplicaciones que se desea ejecutar dentro del sistema.
En el ejemplo propuesto se usa Ubuntu como sistema
operativo, y
´
este usa el sistema de archivos contenido dentro
de un disco. Por ende, una forma sencilla de proceder es
primero crear las aplicaciones, posteriormente compilarlas,
y finalmente cargarlas en el archivo de disco.
Para crear una aplicaci
´
on o programa es posible escribirla
en pr
´
acticamente cualquier lenguaje de programaci
´
on y
despu
´
es usar una serie de int
´
erpretes y compiladores que
permitir
´
an crear el c
´
odigo objeto para la arquitectura que
deber
´
a ejecutar este software. En este caso se partir
´
a de una
especificaci
´
on en lenguaje C, que es popularmente utilizado
en procesos de formaci
´
on por su eficiencia y disponibilidad:
#include <stdio.h>
int main()
{
printf("Hello World from gem5!\n");
return 0;
}
Normalmente, el siguiente paso ser
´
ıa compilar el pro-
grama y ejecutarlo. Sin embargo, se debe tener en cuenta
que, al utilizar un compilador instalado en el ordenador de
trabajo, este crear
´
a un c
´
odigo para la arquitectura de dicho
ordenador. Por ende, es necesario utilizar un compilador
cruzado o cross-compiler que permitir
´
a generar un archivo
ejecutable por la arquitectura de inter
´
es, en este caso ARM.
Existe una amplia variedad de compiladores para ARM
[17] que pueden ser utilizados seg
´
un el entorno de trabajo
de la plataforma. Para el ejemplo propuesto se utilizar
´
a la
herramienta aarch64-none-linux-gnu-gcc que per-
mite compilar un c
´
odigo C para una arquitectura AArch64
con Linux. Su uso es bastante intuitivo:
wget https://developer.arm.com/-/media/Files/downloads/
gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-
x86_64-aarch64-none-linux-gnu.tar.xz
tar -xf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-
gnu.tar.xz
mv gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu
toolchain
./toolchain/bin/aarch64-none-linux-gnu-gcc hello.c -o
hello
En seguida se cargar
´
a la aplicaci
´
on en formato binario
en el sistema de archivos de Ubuntu a emular. Para ello es
necesario montar el disco y copiar el archivo. El proceso
es un poco complejo, pero repetitivo. Una vez que se
comprende la secuencia de pasos la tarea resulta sencilla:
#por simplicidad asumiremos que el archivo ’hello’
existe en gem5/common/
cd common
mkdir disk_mnt
sudo mount -o loop,offset=65536 ubuntu-18.04-arm64-
docker.img disk_mnt
sudo cp hello disk_mnt/home/
sudo umount disk_mnt
Revista elektron, Vol. 8, No. 1, pp. 5-12 (2024)
ISSN 2525-0159
11
http://elektron.fi.uba.ar
Note que en este paso se requieren permisos de adminis-
trador para montar y copiar al disco que se busca emular.
La aplicaci
´
on por ejecutar estar
´
a disponible en /home.
Evidentemente, si el objetivo principal de un experimento
es editar el archivo binario que se ha creado, no ser
´
a
del todo atractivo el tener que simular todo el arranque
del sistema operativo con cada modificaci
´
on. Para ello se
puede hacer uso de la instrucci
´
on m5 checkpoint dentro
de la simulaci
´
on. Posteriormente se puede hacer uso del
argumento --restore-from para especificar la ruta del
punto de restauraci
´
on deseado. Note que el n
´
umero asociado
con el punto de restauraci
´
on es asignado de forma din
´
amica.
./build/ARM/gem5.opt \
./configs/example/arm/Hikey960.py \
--big-cpus 4 \
--little-cpus 4 \
--cpu-type=timing \
--caches \
--dtb=./system/arm/dt/
armv8_gem5_v1_big_little_4_4.dtb \
--bootloader=./common/binaries/boot.arm64 \
--kernel=./common/binaries/vmlinux.arm64 \
--disk=./common/ubuntu-18.04-arm64-docker.img \
--dvfs \
--big-cpu-clock 2362MHz 2112MHz 1805MHz 1421MHz
903MHz \
--little-cpu-clock 1402MHz 999MHz 533MHz \
--big-cpu-voltage 1.0V 0.99V 0.98V 0.97V 0.96V \
--little-cpu-voltage 0.87V 0.86V 0.85V \
--power-models \
--stat-freq 1.0E-3 \
--restore-from=./m5out/cpt.1044789997495
Y con esto finalizamos la demostraci
´
on del uso de gem5
para emular un procesador moderno con algunas caracter
´
ısti-
cas pr
´
acticas. Los archivos fuente generados o editados se
pueden encontrar en [18]. Otras fuentes sobre el uso de
gem5 para emular las caracter
´
ısticas f
´
ısicas de procesadores
pueden consultarse en [19], [20].
VI. CONCLUSI
´
ON
En este art
´
ıculo hemos analizado uno de los retos que
se pueden encontrar en los procesos de formaci
´
on de estu-
diantes de educaci
´
on superior y posgrado. Hablamos de la
dificultad por tener acceso a sistemas de evaluaci
´
on y pro-
totipados modernos, que les permitan adquirir experiencia
con las nuevas tecnolog
´
ıas utilizadas en la industria o la
investigaci
´
on.
Hemos descrito herramientas usadas para estudiar siste-
mas digitales y enumerado los problemas que existen con las
soluciones conocidas. Concluyendo que emular un sistema
de c
´
omputo requiere una reproducci
´
on de su comportamien-
to l
´
ogico y la estimaci
´
on de diversos indicadores sobre su
operaci
´
on. El simulador gem5 ofrece ambas opciones.
Esta herramienta es un software de c
´
odigo libre y de
distribuci
´
on gratuita que puede ser empleada para emular
sistemas de c
´
omputo modernos como los que se basan en
procesadores ARM y RISC-V. Permite verificar la operaci
´
on
no solo de los programas que se han de ejecutar sobre
el sistema simulado y proporciona datos adicionales que
pueden ser de inter
´
es para el an
´
alisis de un chip.
No obstante, existen tres retos principales para poder
considerar a gem5 como una soluci
´
on de aplicaci
´
on pr
´
actica,
en particular para el caso de Latinoam
´
erica. Primero, la
complexidad del software obliga a utilizar sistemas de
c
´
omputo potentes que a menudo no ser
´
ıan disponibles para
los estudiantes de recursos limitados. Segundo, gem5 solo
funciona para sistemas Linux que no son ampliamente
conocidos. Y finalmente, tiene una curva de aprendizaje muy
lenta. Nuestro trabajo trata de abordar este
´
ultimo desaf
´
ıo.
RECONOCIMIENTOS
Los autores reconocen el financiamiento de la Agence
Nationale de la Recherche (ANR)—Francia—a trav
´
es del
proyecto ARCHI-SEC (ANR-19-CE39-0008).
REFERENCIAS
[1] J. M. Munera, A. Jimenez, M. A. Botero, K. Y. Rivas, and J. Lopez,
“La educaci
´
on moderna al alcance de arduino, Revista ESPACIOS,
vol. 798, p. 1015, 2020.
[2] I. H. P. Tavera et al., “Arduino en el nivel medio superior, Vida
Cient
´
ıfica Bolet
´
ın Cient
´
ıfico de la Escuela Preparatoria No. 4, vol. 11,
no. 22, pp. 10–11, 2023.
[3] J. C. Moreno-Brid and P. Ruiz-N
´
apoles, “La educaci
´
on superior y el
desarrollo econ
´
omico en Am
´
erica Latina, Revista iberoamericana de
educaci
´
on superior, vol. 1, no. 1, pp. 171–188, 2010.
[4] H. K. Kondaveeti, N. K. Kumaravelu, S. D. Vanambathina, S. E.
Mathe, and S. Vappangi, “A systematic literature review on pro-
totyping with Arduino: Applications, challenges, advantages, and
limitations, Computer Science Review, vol. 40, p. 100364, 2021.
[5] M. El-Abd, “A review of embedded systems education in the Arduino
age: Lessons learned and future directions, International Journal of
Engineering Pedagogy, vol. 7, no. 2, pp. 79–93, 2017.
[6] A. Chakraborty, “Global Semiconductor Shortage Triggering Obstruc-
tions and Production Delays, Ph.D. dissertation, Swiss School of
Business and Management Geneva, Switzerland, 2023.
[7] J. Voas, N. Kshetri, and J. F. DeFranco, “Scarcity and global inse-
curity: The semiconductor shortage, IT Professional, vol. 23, no. 5,
pp. 78–82, 2021.
[8]
´
A. Guerra Mart
´
ın, Aplicaci
´
on Android para simular una FPGA edu-
cativa, Universidad Aut
´
onoma de Madrid, Trabajo Final de Grado,
2013.
[9] S. R. Yesa, J. Garc
´
ıa-Zub
´
ıa, J. L. G. Temi
˜
no, J. V. S
´
aez, and I. A.
Mart
´
ınez, “Uso de un laboratorio remoto de FPGAs para la realizaci
´
on
de pr
´
acticas en grados de ingenier
´
ıa, in XIV Congreso de Tecnolog
´
ıas
Aplicadas a la Ense
˜
nanza de la Electr
´
onica. Instituto Superior de
Engenharia do Porto, 2020, pp. 293–300.
[10] F. Bellard, “QEMU, a Fast and Portable Dynamic Translator, in
Proceedings of the Annual Conference on USENIX Annual Technical
Conference, ser. ATEC ’05. USA: USENIX Association, 2005, p. 41.
[11] A. Vladimirescu, The Spice Book. USA: John Wiley & Sons, Inc.,
1994.
[12] M. M. K. Martin, D. J. Sorin, B. M. Beckmann, M. R. Marty, M. Xu,
A. R. Alameldeen, K. E. Moore, M. D. Hill, and D. A. Wood, “Multi-
facet’s General Execution-Driven Multiprocessor Simulator (GEMS)
Toolset, SIGARCH Comput. Archit. News, vol. 33, no. 4, p. 92–99,
nov 2005.
[13] N. L. Binkert, R. G. Dreslinski, L. R. Hsu, K. T. Lim, A. G. Saidi, and
S. K. Reinhardt, “The M5 Simulator: Modeling Networked Systems,
IEEE Micro, vol. 26, no. 4, p. 52–60, jul 2006.
[14] N. Binkert, B. Beckmann, G. Black, S. K. Reinhardt, A. Saidi,
A. Basu, J. Hestness, D. R. Hower, T. Krishna, S. Sardashti, R. Sen,
K. Sewell, M. Shoaib, N. Vaish, M. D. Hill, and D. A. Wood, “The
Gem5 Simulator, SIGARCH Comput. Archit. News, vol. 39, no. 2,
p. 1–7, aug 2011.
[15] Statcounter, “Web Analytics Made Easier - Statcounter, https://
statcounter.com/, 2024, [Online; accessed 14-May-2024].
[16] gem5, “Building gem5, https://www.gem5.org/documentation/
general docs/building, 2024, [Online; accessed 14-May-2024].
[17] Arm, “Downloads - Arm Developer, https://developer.arm.com/
downloads, 2024, [Online; accessed 14-May-2024].
[18] C. A. Lara-Nino, “Clock and Power management on Gem5, https:
//github.com/CarlosAndresLARA/hikey960-gem5, 2024, [Online; ac-
cessed 14-May-2024].
[19] L. Bossuet and C. A. Lara-Nino, “Emulating Covert Data Transmis-
sion on Heterogeneous SoCs, in 2023 Asian Hardware Oriented
Security and Trust Symposium (AsianHOST), 2023, pp. 1–6.
[20] L. Bossuet, V. Grosso, and C. A. Lara-Nino, “Emulating Side Channel
Attacks on gem5: lessons learned, in 2023 IEEE European Sympo-
sium on Security and Privacy Workshops (EuroS&PW), 2023, pp.
287–295.
Revista elektron, Vol. 8, No. 1, pp. 5-12 (2024)
ISSN 2525-0159
12
http://elektron.fi.uba.ar

Enlaces de Referencia

  • Por el momento, no existen enlaces de referencia


Copyright (c) 2024 Lilian Bossuet, Carlos Andres Lara Niño

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.


Revista elektron,  ISSN-L 2525-0159
Facultad de Ingeniería. Universidad de Buenos Aires 
Paseo Colón 850, 3er piso
C1063ACV - Buenos Aires - Argentina
revista.elektron@fi.uba.ar
+54 (11) 528-50889