vmalloc/vfree问题思考记录
- arm 32 用户进程陷入内核态经过vmalloc/vfree分配内存的流程
- 内核在更新非连续内存区对应的页表项是很是懒惰的。--《深刻理解linux内核》
- arm 32 只有一个PGD 寄存器,即每一个进程的内核态和用户态是共享一份PGD,不一样于内核主页表
- vmalloc分配内存时,实际是将物理内存映射到内核的主页表(即init_task的页表);
- 当用户进程访问vmalloc内存时,触发vmalloc fault,同步init_task的vmalloc一级页表到进程PGD,即vmalloc的二级页表,你们都是共用一份的;
- 当第二用户进程访问vmalloc内存,同上;
- 当用户进程vfree时,实际是将物理内存释放,同时释放二级页表,以及将init_task的vmalloc一级页表置0;
- 当第二个用户进程继续访问vmalloc内存时,触发vmalloc transaction fault(二级页表异常),此时因为init_task并没有此二级页表,没法同步,故panic。
- arm 64 vmalloc/vfree流程
- arm 64 有两个PGD 寄存器,其中一个存放用户态的PGD,一个存放内核态的PGD(即init_task的PGD,整个内核空间只有一个PGD);
- 因为你们都是共用一个PGD,就无所谓的vamlloc fault了,流程也简单明了了
- 问题引伸
- copy_from_usr/copy_to_usr在arm 64如何实现?arm 32因为内核态用户态共用一个PGD,即经过简单的copy便可;
- arm 32理论上来说也是能够实现用户态一个PGD,内核态一个PGD,只须要在每次状态切换时更新PGD便可,那为什么不这么作呢?
- 切换PGD,引发TLB 抖动,如何减小 TLB 抖动?答案是TLB ASID!
欢迎关注本站公众号,获取更多信息