NeoPerf study

本文主要为学习论文《NeoMem: Hardware/Software Co-Design for CXL-Native Memory Tiering》的工作,分为三个部分,用户态、内核以及FPGA部分,内核开源仓库地址为: PKUZHOU/linux

代码基于linux内核代码6.0开始修改。

由于初步探索linux内核代码,所以没有按照自顶向下的视角分析代码,而是基于git提交记录,借助AI与互联网搜索,平铺遇到的相关知识。版本不断更新……

a naive neoprof driver

commit ID 9bd35383

本次主要在driver目录下提交了一个驱动neoperf:

主要是实现了一些对外设的IO操作

Linux内核配置文件Kconfig

Kconfig文件用于定义内核配置菜单,这些菜单可以在编译内核时启用或禁用特定的功能。

1
2
3
4
#Kconfig文件
config NEOPROF#定义了一个名为`NEOPROF`的内核配置选项,将在内核配置菜单中创建选项
bool "Enable Neoprofiler" #bool类型,是否启用
default n #默认不启用

在内核编译过程中可以在Drivers下查找到

aba

Kconfig有其独特的语法,也是可以一层一层包裹下去:menusourceendmenu等组成了编译选项配置过程中的树状菜单

Kconfig设置对应的编译变量后,makefile指导构建编译的过程中会利用这些变量,从而实现选择性的编译

neoperf.h

主要新增了四个接口,对neoprof设备(此处指Type2-CXL设备)进行访问:

1
2
3
4
5
6
7
8
9
10
11
/*
* The following functions are used to access the neoprof device
*/
u64 get_nr_hotpages(void);//获取当前系统中的热页数量

u64* get_hotpages(void);//获取热页

u64 get_hotness_threshold(void);//获取热度阈值

void set_hotness_threshold(u64 threshold);//设置热度阈值

neoperf.c

驱动开发hello world

neoperf.c 以下部分参考驱动开发知识:https://www.cnblogs.com/downey-blog/p/10500828.html

1
2
3
4
5
6
module_init(neoprof_init);
module_exit(neoprof_exit);

MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("PKUZHOU");
MODULE_DESCRIPTION("Neoprofiler Linux driver");

io地址映射相关知识

需要理解

  1. IO端口的编址方式:

    包括IO指令的端口映射方式、MMIO的统一内存映射方式

  2. 一些常见的IO操作函数

    1
    2
    void * ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags);
    //memset_io\memcpy_fromio\readb

参考:https://blog.csdn.net/do2jiang/article/details/5450839

neomem migration skeleton

commit ID 26cabad18

新增 NeoMem模块:

migrate.c

主要是提供接口migrate_misplaced_page_no_vma

调用一些mm中的内存操作函数,进行页面隔离、迁移

neomem.h \neomem.c

主要就是启动 neomem模块(调用core文件中启动守护进程)

late_initcall()

在内核启动后期适当时间执行,理解module_init等init宏的顺序,在include/linux/init.h

linux设备驱动加载的先后顺序

neomem_core.c

  1. 内存中的各种分配函数
  2. kthread_run内核线程

FPGA端侧

模块结构

顶层模块:

cxltyp3_memexp_ddr4_top->ed_top_wrapper_typ3

ddr内存参数调整

cxl ip考虑了不同ddr的,包括是否支持DBI、内存通道数量等。采用宏的方式区分,设置不同的方式时,需要对ip内通过宏定义来确定相关的内存参数,同时也需要在顶层模块对相关参数进行修改。

或者通过更改ip文件,重新生成新的IP文件夹

quartus

1
set_global_assignment -name OPTIMIZATION_MODE "AGGRESSIVE COMPILE TIME"

烧录模式

AS Jtag ps 三种烧录模式

Neomem todo

代码存在一些可以完善的地方:

  1. CXL地址采用硬编码,可以引入设备树或者其他检测CXL物理地址的工具进行优化,参考

本站由 Zane Jiang 使用 Stellar 1.33.1 主题创建,一款很棒的 Hexo 主题!

总访问 次 || 本页访问
总访客 人 || 本页访客