DragonOS icon indicating copy to clipboard operation
DragonOS copied to clipboard

[BUG REPORT] 进程页表未能完全释放?

Open fslongjin opened this issue 1 year ago • 4 comments

描述错误 用户程序的地址空间结构体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:/$ 

请填写您的电脑的信息:

重现步骤 重现行为的步骤:

  1. 多次运行free命令
  2. 看到结果。

期望行为 进程退出后,内存应该被释放完全。

fslongjin avatar Nov 12 '24 05:11 fslongjin

free在novashell中属于内置命令,不会开启新进程,而且顶层页表是会被释放的:https://github.com/DragonOS-Community/DragonOS/blob/2cac148dc16a1317bcfb852a4f3f725be0776d37/kernel/src/mm/ucontext.rs#L841 所以内存增加应该是别的原因导致的 @fslongjin

MemoryShore avatar Nov 18 '24 19:11 MemoryShore

我发现释放顶层页表前似乎没有释放下层页表?

MemoryShore avatar Nov 18 '24 19:11 MemoryShore

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:/$ 

fslongjin avatar Nov 19 '24 08:11 fslongjin

我研究了一下,好像就是用户进程释放的时候,会去调UserMapper的drop,但是没有释放下层的用户页表就把顶层页表释放了,所以产生了内存泄漏 例如下图是在shell里输入clear后(我这里设置就显示到level3) image

BrahmaMantra avatar Jan 01 '25 06:01 BrahmaMantra