最近几天调试自己写的risc-v的裸机操作系统,在写完malloc程序后,调用malloc程序分配内存时,最终调用到了sbrk,sbrk中分配vma或者扩大vma的容量。在程序真正是用内存时,触发缺页异常,映射真正的内存。free的时候,使用brk释放内存。
在反复malloc/free的时候出现了程序跑飞了。经过不断的gdb和printk debug,发现释放的内存还可以被访问,而不是访问新映射的内存。经过测试,需要刷tlb。
在每次map/unmap的时候刷新tlb。代码链接
static inline void local_flush_tlb_page(unsigned long addr)
{
asm volatile("sfence.vma %0" : : "r" (addr) : "memory");
}
在risc-v-bm程序中,没有实现ASID。
疑问:
1. 如果实现了ASID功能,单个进程在map/unmap内存时是否需要刷tlb?
2. ASID用完了,怎么办?
3. 进程退出后,需不需要刷TLB?