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 | #Kconfig文件 |
在内核编译过程中可以在Drivers下查找到
Kconfig有其独特的语法,也是可以一层一层包裹下去:menu
、source
、endmenu
等组成了编译选项配置过程中的树状菜单
Kconfig设置对应的编译变量后,makefile指导构建编译的过程中会利用这些变量,从而实现选择性的编译
neoperf.h
主要新增了四个接口,对neoprof设备(此处指Type2-CXL设备)进行访问:
1 | /* |
neoperf.c
驱动开发hello world
neoperf.c 以下部分参考驱动开发知识:https://www.cnblogs.com/downey-blog/p/10500828.html
1 | module_init(neoprof_init); |
io地址映射相关知识
需要理解
IO端口的编址方式:
包括IO指令的端口映射方式、MMIO的统一内存映射方式
一些常见的IO操作函数
1
2void * 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
中
neomem_core.c
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
代码存在一些可以完善的地方:
- CXL地址采用硬编码,可以引入设备树或者其他检测CXL物理地址的工具进行优化,参考