diff --git a/articles/20230323-vf2-coremark.md b/articles/20230323-vf2-coremark.md
new file mode 100644
index 0000000000000000000000000000000000000000..50f1fdcb4914ea85fc03e82add9e5704069e3c9d
--- /dev/null
+++ b/articles/20230323-vf2-coremark.md
@@ -0,0 +1,222 @@
+> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.1 - [tounix spaces toc comments codeinline urls pangu autocorrect]
+> Author: Kepontry
+> Date: 2023/3/23
+> Revisor: Falcon ; Bin Meng
+> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
+> Proposal: [VisionFive 2 开发板软硬件评测及软件 gap 分析](https://gitee.com/tinylab/riscv-linux/issues/I64ESM)
+> Sponsor: PLCT Lab, ISCAS
+
+# VisionFive 2 开发板的 CoreMark 评测
+
+## 简介
+
+### VisionFive 2 开发板
+
+VisionFive 2 开发板采用的是赛昉科技的 JH7110 高性能 RISC-V SoC,它是一款 64 位四核处理器,共享 2MB 一致性缓存,工作频率为 1.5GHz。JH7110 支持 Linux 操作系统,拥有集成 GPU 以及视频编解码 ISP,支持 OpenCL/OpenGL ES/Vulkan 等图形渲染库,支持 H.264/H.265/JPEG 等格式的编解码。本文作为评测系列的第一篇,将主要关注 CPU 性能。
+
+### CoreMark 测试集
+
+[CoreMark][006] 是由 EEMBC (Embedded Microprocessor Benchmark Consortium) 开发的一项基准测试程序,主要为 MCU 或 CPU 提供轻量级评测。主要测试的是单核性能,但本文中也对多核评测做了简单的尝试。测试标准是在配置参数的组合下单位时间内运行的 CoreMark 程序次数(单位:CoreMark/MHz),该数字值越大则说明测试的性能越好。
+Dhrystone 和 Coremark 都是广泛使用的的性能测试程序,都拥有着体积小、方便移植、易于理解、免费等优点。但 Dhrystone 的结果更容易受编译器优化能力的影响,从而影响对 CPU 的评测。而 Coremark 在设计的过程中避免了上述问题,而且还在其官网上提供了测试结果的验证与排行。
+
+## 测试集编译与运行
+
+### 源码获取与配置
+
+CoreMark 在 GitHub 上有对应的 [源码仓库][001],但我们这里采用 BOOM 处理器核团队移植到 RISC-V 上的 [riscv-coremark][003]。CoreMark 提供了可移植的接口,从而使得能够在核心评测代码不变的前提下,在多种架构环境中执行。riscv-coremark 中提供了 riscv64 和 riscv64-baremetal 两种构建方式,使测试程序分别能在 Linux 和裸机上运行。CoreMark 原版代码以子模块的形式包含在 riscv-coremark 中,执行以下命令以获取全套代码。
+
+```shell
+$ git clone https://github.com/riscv-boom/riscv-coremark.git
+$ cd riscv-coremark
+$ tree -L 1
+.
+|-- LICENSE
+|-- README.md
+|-- build-coremark.sh # 构建脚本
+|-- coremark # 原版 CoreMark 代码
+|-- riscv64 # 运行在 Linux 或者 Proxy Kernel 上的版本
+`-- riscv64-baremetal # 运行在裸机上的版本,手动实现了用到的 syscall
+$ git submodule update --init
+```
+
+查看构建脚本 `build-coremark.sh` 的内容,发现它只是在 coremark 目录下执行 `make PORT_DIR=../xxx compile` 命令,指定移植代码并编译,最后把生成的文件复制出来。所以之后我们直接在 coremark 目录下执行该命令,以便于调试。因为我们是运行在 Linux 上,所以选择 riscv64 移植版本构建并运行。
+
+```shell
+$ cat build-coremark.sh
+#!/bin/bash
+
+set -e
+
+BASEDIR=$PWD
+CM_FOLDER=coremark
+
+cd $BASEDIR/$CM_FOLDER
+
+# run the compile
+echo "Start compilation"
+make PORT_DIR=../riscv64 compile
+mv coremark.riscv ../
+
+make PORT_DIR=../riscv64-baremetal compile
+mv coremark.bare.riscv ../
+```
+
+首先修改 Makefile,指定编译工具链的前缀 `RISCVTYPE=riscv64-linux-gnu` 与存放目录 `RISCVTOOLS=/usr`,这里大家可以结合下方代码中的 `CC = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc` 更好地理解这些项的设置意义。
+
+```shell
+$ vim riscv64/core_portme.mak
+...
+RISCVTOOLS=/usr
+# Flag: RISCVTYPE
+# Type of toolchain to use
+RISCVTYPE=riscv64-linux-gnu
+# Flag: OUTFLAG
+# Use this flag to define how to to get an executable (e.g -o)
+OUTFLAG= -o
+# Flag: CC
+# Use this flag to define compiler to use
+CC = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc
+...
+```
+
+然后修改头文件,将 `HAS_TIME_H` 宏变量设置为 1,表示 clock_t 变量使用中的定义而不需要手动定义,避免报定义重复的错误。
+
+```shell
+$ vim riscv64/core_portme.h
+...
+/* Configuration: HAS_TIME_H
+ Define to 1 if platform has the time.h header file,
+ and implementation of functions thereof.
+ */
+#ifndef HAS_TIME_H
+#define HAS_TIME_H 1
+#endif
+...
+```
+
+### 单核测试
+
+按默认配置进行编译即可生成单核测试程序。指定移植目录 `PORT_DIR` 为 riscv64 并编译,在当前目录生成 `coremark.riscv` 测试程序。运行该程序,得到的分数为 4986。
+
+```shell
+$ make PORT_DIR=../riscv64 compile
+$ ./coremark.riscv
+2K performance run parameters for coremark.
+CoreMark Size : 666
+Total ticks : 12032
+Total time (secs): 12.032000
+Iterations/Sec : 4986.702128
+Iterations : 60000
+Compiler version : GCC11.3.0
+Compiler flags : -O2
+Memory location : Please put data memory location here
+ (e.g. code in flash, data on heap etc)
+seedcrc : 0xe9f5
+[0]crclist : 0xe714
+[0]crcmatrix : 0x1fd7
+[0]crcstate : 0x8e3a
+[0]crcfinal : 0xbd59
+Correct operation validated. See README.md for run and reporting rules.
+CoreMark 1.0 : 4986.702128 / GCC11.3.0 -O2 / Heap
+```
+
+### PGO 优化测试
+
+PGO (Profile Guided Optimization) 是一种编译优化技术,它利用实际运行中收集的性能分析数据重新编译应用,以提高应用程序的运行时性能。PGO 优化与传统的静态优化相比,能够获取应用程序的运行时数据,从而能够针对热代码块在布局上进行优化,提高指令 Cache 的命中率。
+
+使用如下 make 命令构建测试程序,通过指定 `PGO=1` 开启 PGO 优化。编译器首先构建用于性能分析的二进制程序。向 GCC 传递 `-fprofile-generate` 参数,以收集运行数据。之后再用生成的 `*.gcda` 文件重新编译测试程序,设置 GCC 的 `-fprofile-use` 标志,表示使用上述运行时性能数据进行 PGO 优化,生成优化后的测试程序。
+
+如果提示 `'xxx.gcda' profile count data file not found`,可以删除 `coremark.riscv` 文件后再重新编译。
+
+运行测试程序 `coremark.riscv`,经 PGO 优化后的测试得分为 5278,约有 6% 的性能提升。
+
+```shell
+$ make PORT_DIR=../riscv64 PGO=1
+$ ./coremark.riscv
+2K performance run parameters for coremark.
+CoreMark Size : 666
+Total ticks : 20840
+Total time (secs): 20.840000
+Iterations/Sec : 5278.310940
+Iterations : 110000
+Compiler version : GCC11.3.0
+Compiler flags : -O2 -DPERFORMANCE_RUN=1
+Memory location : Please put data memory location here
+ (e.g. code in flash, data on heap etc)
+seedcrc : 0xe9f5
+[0]crclist : 0xe714
+[0]crcmatrix : 0x1fd7
+[0]crcstate : 0x8e3a
+[0]crcfinal : 0x33ff
+Correct operation validated. See README.md for run and reporting rules.
+CoreMark 1.0 : 5278.310940 / GCC11.3.0 -O2 -DPERFORMANCE_RUN=1 / Heap
+```
+
+### 多核测试尝试
+
+通过观察头文件 `riscv64/core_portme.h`,发现移植者提供了多核测试的代码与设置项。通过 `MULTITHREAD` 宏变量指定线程数,`USE_PTHREAD` 宏表示通过 pthread 库使用多线程。我们在 Makefile 文件的 `CFLAGS` 项中添加这两项,同时在 `LFLAGS_END` 项中加上 `-lpthread`,使链接器将 pthread 库链接进来。
+
+```shell
+$ vim riscv64/core_portme.mak
+...
+CFLAGS = $(PORT_CFLAGS) -DMULTITHREAD=4 -DUSE_PTHREAD -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\"
+#Flag: LFLAGS_END
+# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts).
+# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt.
+LFLAGS_END += -lpthread
+# Flag: PORT_SRCS
+...
+```
+
+使用 make 命令编译,生成 `coremark.riscv` 可执行文件并运行,可以看到多线程得分是 19995。这个结果大致等于单核的 4 倍得分,由于该测试集本身不是专门为多核设计的,并没有太多核间的竞争与同步,所以这个得分的参考意义等同于单核得分。
+
+```shell
+$ make PORT_DIR=../riscv64 compile
+$ ./coremark.riscv
+2K performance run parameters for coremark.
+CoreMark Size : 666
+Total ticks : 12003
+Total time (secs): 12.003000
+Iterations/Sec : 19995.001250
+Iterations : 240000
+Compiler version : GCC11.3.0
+Compiler flags : -O2 -lpthread
+Parallel PThreads : 4
+Memory location : Please put data memory location here
+ (e.g. code in flash, data on heap etc)
+seedcrc : 0xe9f5
+[0]crclist : 0xe714
+[1]crclist : 0xe714
+[2]crclist : 0xe714
+[3]crclist : 0xe714
+[0]crcmatrix : 0x1fd7
+[1]crcmatrix : 0x1fd7
+[2]crcmatrix : 0x1fd7
+[3]crcmatrix : 0x1fd7
+[0]crcstate : 0x8e3a
+[1]crcstate : 0x8e3a
+[2]crcstate : 0x8e3a
+[3]crcstate : 0x8e3a
+[0]crcfinal : 0xbd59
+[1]crcfinal : 0xbd59
+[2]crcfinal : 0xbd59
+[3]crcfinal : 0xbd59
+Correct operation validated. See README.md for run and reporting rules.
+CoreMark 1.0 : 19995.001250 / GCC11.3.0 -O2 -lpthread / Heap / 4:PThreads
+```
+
+## 总结
+
+本文使用 CoreMark 测试集评测了 JH7110 这款 CPU,给出了其单核与 PGO 优化后的结果,并简单的对多核性能进行评测。测试结果表明:JH7110 单核性能达到 2010 年左右 Intel 等厂商的主流 CPU 水平。后续考虑使用更加专业的测试集 [CoreMark-Pro][002] 评测多核性能,并给出其它 RISC-V 处理器的性能数据。
+
+## 参考资料
+
+- [CPU 性能测试——CoreMark 篇][005]
+- [CPU 性能测试——CoreMark-pro 篇][004]
+
+[001]: https://github.com/eembc/coremark
+[002]: https://github.com/eembc/coremark-pro
+[003]: https://github.com/riscv-boom/riscv-coremark
+[004]: https://www.cnblogs.com/ImagineMiracle-wxn/p/CPU_CoreMark-pro_test.html
+[005]: https://www.cnblogs.com/ImagineMiracle-wxn/p/CPU_CoreMark_test.html
+[006]: https://www.eembc.org/coremark/