如何访问SpacemiT K1/X60上的TCM(紧耦合内存)
SpacemiT K1/X60 TCM(紧耦合内存)访问实践与分析
基础参数
- SpacemiT K1/X60的首个4核集群配备512KiB的TCM(Tightly Coupled Memory,紧耦合内存)
- TCM在物理地址空间中映射至
0xD800000
初始问题
官方文档中未提供该TCM的具体访问方式说明。
对比ARM架构的实现:部分ARM CPU通过内核头文件asm/tcm.h提供tcm_alloc()、tcm_free()等工具接口来管理TCM,其内核层的TCM基础设施(如tcm.c)实现逻辑复杂,并非简单的物理内存平面映射。
内核源码探索
查看SpacemiT的Linux内核源码时,先在设备树中找到TCM的相关定义,但未找到对应ARM tcm.h的等效头文件。后续定位到了TCM对应的驱动代码(位于drivers/misc/tcm.c),但最初未明确其使用方法。
实践验证:通过ioctl操作TCM
已编写C代码实现TCM状态查看功能,代码如下:
#include <stdio.h> #include <sys/ioctl.h> #include <fcntl.h> #include <unistd.h> #define IOC_MAGIC 'c' #define TCM_MEM_SHOW _IOR(IOC_MAGIC, 2, int) #define TCM_VA_TO_PA _IOR(IOC_MAGIC, 4, int) #define TCM_REQUEST_MEM _IOR(IOC_MAGIC, 5, int) #define TCM_RELEASE_MEM _IOR(IOC_MAGIC, 6, int) int main() { int fd = open("/dev/tcm", O_RDWR); if (-1 == fd) { printf("Failed to open tcm\n"); return -1; } unsigned long arg = 0; ioctl(fd, TCM_MEM_SHOW, arg); close(fd); return 0; }
运行该代码后,内核日志输出TCM的空闲块信息:
[2543369.524828] mem block id(0): [2543369.524852] mm_show start [2543369.524859] mem free node[0]: ffffffd904559240 paddr: d8000000 size:0x20000 [2543369.524867] mm_show end [2543369.524870] mem block id(1): [2543369.524874] mm_show start [2543369.524878] mem free node[0]: ffffffd904559280 paddr: d8020000 size:0x20000 [2543369.524884] mm_show end [2543369.524889] mem block id(2): [2543369.524893] mm_show start [2543369.524897] mem free node[0]: ffffffd9045592c0 paddr: d8040000 size:0x20000 [2543369.524903] mm_show end [2543369.524907] mem block id(3): [2543369.524910] mm_show start [2543369.524914] mem free node[0]: ffffffd904559300 paddr: d8060000 size:0x20000 [2543369.524920] mm_show end
后续推测
- 定义的其他ioctl指令(地址转换、内存申请/释放)应该也能正常工作
- 默认情况下,访问
/dev/tcm设备文件需要root权限
内容的提问来源于stack exchange,提问作者linedot
相关产品推荐
相关产品推荐

