[BUG REPORT] 进程页表未能完全释放?
描述错误
用户程序的地址空间结构体AddressSpace在Drop的时候,貌似没有释放顶层页表。导致每个进程退出后,系统内存使用量会增加4K。(注意看used字段)
root@DragonOS:/$ free
total used free shared cache_used cache_free available
Mem: 506480 51968 454512 0 0 0 0
root@DragonOS:/$ free
total used free shared cache_used cache_free available
Mem: 506480 51972 454508 0 0 0 0
root@DragonOS:/$ free
total used free shared cache_used cache_free available
Mem: 506480 51976 454504 0 0 0 0
root@DragonOS:/$
请填写您的电脑的信息:
- DragonOS版本:7c28051
重现步骤 重现行为的步骤:
- 多次运行free命令
- 看到结果。
期望行为 进程退出后,内存应该被释放完全。
free在novashell中属于内置命令,不会开启新进程,而且顶层页表是会被释放的:https://github.com/DragonOS-Community/DragonOS/blob/2cac148dc16a1317bcfb852a4f3f725be0776d37/kernel/src/mm/ucontext.rs#L841
所以内存增加应该是别的原因导致的
@fslongjin
我发现释放顶层页表前似乎没有释放下层页表?
free在novashell中属于内置命令,不会开启新进程,而且顶层页表是会被释放的:https://github.com/DragonOS-Community/DragonOS/blob/2cac148dc16a1317bcfb852a4f3f725be0776d37/kernel/src/mm/ucontext.rs#L841
所以内存增加应该是别的原因导致的 @fslongjin
哦哦,不过这个问题应该对于别的命令也存在的。比如ls命令。
root@DragonOS:/$ ls
[ WARN ] (src/syscall/mod.rs:869) SYS_RT_SIGPROCMASK has not yet been implemented
[ WARN ] (src/syscall/mod.rs:869) SYS_RT_SIGPROCMASK has not yet been implemented
[ WARN ] (src/syscall/mod.rs:869) SYS_RT_SIGPROCMASK has not yet been implemented
[ WARN ] (src/syscall/mod.rs:869) SYS_RT_SIGPROCMASK has not yet been implemented
[ WARN ] (src/syscall/mod.rs:869) SYS_RT_SIGPROCMASK has not yet been implemented
[ WARN ] (src/syscall/mod.rs:869) SYS_RT_SIGPROCMASK has not yet been implemented
bin etc home lib64 proc sys xxx.txt
boot held.log include libexec sbin usr xxx.txt.heldbak
dev history_commands.txt lib miniature share var
[ WARN ] (src/syscall/mod.rs:884) SYS_EXIT_GROUP has not yet been implemented
root@DragonOS:/$ free
total used free shared cache_used cache_free available
Mem: 507332 51596 455736 0 0 0 0
root@DragonOS:/$ ls
[ WARN ] (src/syscall/mod.rs:869) SYS_RT_SIGPROCMASK has not yet been implemented
[ WARN ] (src/syscall/mod.rs:869) SYS_RT_SIGPROCMASK has not yet been implemented
[ WARN ] (src/syscall/mod.rs:869) SYS_RT_SIGPROCMASK has not yet been implemented
[ WARN ] (src/syscall/mod.rs:869) SYS_RT_SIGPROCMASK has not yet been implemented
[ WARN ] (src/syscall/mod.rs:869) SYS_RT_SIGPROCMASK has not yet been implemented
[ WARN ] (src/syscall/mod.rs:869) SYS_RT_SIGPROCMASK has not yet been implemented
bin etc home lib64 proc sys xxx.txt
boot held.log include libexec sbin usr xxx.txt.heldbak
dev history_commands.txt lib miniature share var
[ WARN ] (src/syscall/mod.rs:884) SYS_EXIT_GROUP has not yet been implemented
root@DragonOS:/$ free
total used free shared cache_used cache_free available
Mem: 507332 51744 455588 0 0 0 0
root@DragonOS:/$ ls
[ WARN ] (src/syscall/mod.rs:869) SYS_RT_SIGPROCMASK has not yet been implemented
[ WARN ] (src/syscall/mod.rs:869) SYS_RT_SIGPROCMASK has not yet been implemented
[ WARN ] (src/syscall/mod.rs:869) SYS_RT_SIGPROCMASK has not yet been implemented
[ WARN ] (src/syscall/mod.rs:869) SYS_RT_SIGPROCMASK has not yet been implemented
[ WARN ] (src/syscall/mod.rs:869) SYS_RT_SIGPROCMASK has not yet been implemented
[ WARN ] (src/syscall/mod.rs:869) SYS_RT_SIGPROCMASK has not yet been implemented
bin etc home lib64 proc sys xxx.txt
boot held.log include libexec sbin usr xxx.txt.heldbak
dev history_commands.txt lib miniature share var
[ WARN ] (src/syscall/mod.rs:884) SYS_EXIT_GROUP has not yet been implemented
root@DragonOS:/$ free
total used free shared cache_used cache_free available
Mem: 507332 51884 455448 0 0 0 0
root@DragonOS:/$
我研究了一下,好像就是用户进程释放的时候,会去调UserMapper的drop,但是没有释放下层的用户页表就把顶层页表释放了,所以产生了内存泄漏
例如下图是在shell里输入clear后(我这里设置就显示到level3)