我的linux应用程序发生了一件奇怪的事情,即在用户空间和内核空间之间使用ION内存进行ipc。
使用ION内存的目的是因为我们的SoC有一个使用ION内存的自定义硬件解码器(在其驱动程序实现下),我正在制作解码器用户空间应用程序。我已经从reference研究了ION内存。
一切都运行良好且完美,但是当我在循环中运行应用程序以使其永远不会退出main()并从头到尾继续运行时,ION内存不会被释放并继续增加,如图所示下面使用pmap。
pmap 1088
1088: ./vdectest bbb_sunflower_1080p_30fps_normal_10sec.h264 1920 1080 out.yuv
00010000 20K r-x-- vdectest
00024000 4K rw--- vdectest
00025000 132K rw--- [ anon ]
40037000 4K rw--- [ anon ]
4006c000 96K r-x-- ld-2.21.so
40093000 4K r---- ld-2.21.so
40094000 4K rw--- ld-2.21.so
400ba000 100K r-x-- libgcc_s.so.1
400d3000 60K ----- libgcc_s.so.1
400e2000 4K rw--- libgcc_s.so.1
400e3000 4K rw--- [ anon ]
40123000 8K rw--- [ anon ]
401cb000 4K rw--- [ anon ]
40241000 64K r-x-- libpthread-2.21.so
40251000 4K r---- libpthread-2.21.so
40252000 4K rw--- libpthread-2.21.so
40253000 8K rw--- [ anon ]
4032f000 4K rw--- [ anon ]
403c4000 868K r-x-- libc-2.21.so
4049d000 60K ----- libc-2.21.so
404ac000 8K r---- libc-2.21.so
404ae000 4K rw--- libc-2.21.so
404af000 12K rw--- [ anon ]
404bd000 4K rw--- [ anon ]
404be000 4K ----- [ anon ]
404bf000 8188K rw--- [ anon ]
40d1e000 4K ----- [ anon ]
40d1f000 8188K rw--- [ anon ]
4151e000 2048K rw-s- [ anon ]
417c0000 2048K rw-s- [ anon ]
41a9c000 2048K rw-s- [ anon ]
41d00000 132K rw--- [ anon ]
41d21000 892K ----- [ anon ]
41e00000 4K ----- [ anon ]
41e01000 8188K rw--- [ anon ]
42600000 3064K rw-s- [ anon ]
4297c000 3064K rw-s- [ anon ]
42cb8000 3064K rw-s- [ anon ]
43036000 3064K rw-s- [ anon ]
43386000 3064K rw-s- [ anon ]
43742000 3064K rw-s- [ anon ]
43b08000 3064K rw-s- [ anon ]
43e48000 3064K rw-s- [ anon ]
44226000 3064K rw-s- [ anon ]
44557000 3064K rw-s- [ anon ]
4494b000 3064K rw-s- [ anon ]
44d1f000 3064K rw-s- [ anon ]
45038000 3064K rw-s- [ anon ]
4539d000 3064K rw-s- [ anon ]
4576b000 3064K rw-s- [ anon ]
45a84000 3064K rw-s- [ anon ]
45f00000 132K rw--- [ anon ]
45f21000 892K ----- [ anon ]
46000000 8704K rw-s- [ anon ]
be848000 132K rw--- [ stack ]
ffff0000 4K r-x-- [ anon ]
total 92116K
pmap 1088
1088: ./vdectest bbb_sunflower_1080p_30fps_normal_10sec.h264 1920 1080 out.yuv
00010000 20K r-x-- vdectest
00024000 4K rw--- vdectest
00025000 132K rw--- [ anon ]
40003000 4K rw--- [ anon ]
4006c000 96K r-x-- ld-2.21.so
40087000 4K rw--- [ anon ]
40093000 4K r---- ld-2.21.so
40094000 4K rw--- ld-2.21.so
400ba000 100K r-x-- libgcc_s.so.1
400d3000 60K ----- libgcc_s.so.1
400e2000 4K rw--- libgcc_s.so.1
40123000 8K rw--- [ anon ]
401cb000 4K rw--- [ anon ]
40241000 64K r-x-- libpthread-2.21.so
40251000 4K r---- libpthread-2.21.so
40252000 4K rw--- libpthread-2.21.so
40253000 8K rw--- [ anon ]
4032f000 4K rw--- [ anon ]
403c4000 868K r-x-- libc-2.21.so
4049d000 60K ----- libc-2.21.so
404ac000 8K r---- libc-2.21.so
404ae000 4K rw--- libc-2.21.so
404af000 12K rw--- [ anon ]
404bd000 4K rw--- [ anon ]
404be000 4K ----- [ anon ]
404bf000 8188K rw--- [ anon ]
40d1e000 4K ----- [ anon ]
40d1f000 8188K rw--- [ anon ]
4151e000 2048K rw-s- [ anon ]
4178f000 2048K rw-s- [ anon ]
41a29000 2048K rw-s- [ anon ]
41d00000 132K rw--- [ anon ]
41d21000 892K ----- [ anon ]
41e00000 4K ----- [ anon ]
41e01000 8188K rw--- [ anon ]
42600000 4K ----- [ anon ]
42601000 8188K rw--- [ anon ]
42e00000 3064K rw-s- [ anon ]
43198000 3064K rw-s- [ anon ]
434b5000 3064K rw-s- [ anon ]
43805000 3064K rw-s- [ anon ]
43bf9000 3064K rw-s- [ anon ]
43f9f000 3064K rw-s- [ anon ]
442ea000 3064K rw-s- [ anon ]
44659000 3064K rw-s- [ anon ]
4496d000 3064K rw-s- [ anon ]
44d00000 3064K rw-s- [ anon ]
450e6000 3064K rw-s- [ anon ]
45459000 3064K rw-s- [ anon ]
45789000 3064K rw-s- [ anon ]
45b73000 3064K rw-s- [ anon ]
45f00000 132K rw--- [ anon ]
45f21000 892K ----- [ anon ]
46000000 3064K rw-s- [ anon ]
4633b000 3064K rw-s- [ anon ]
46660000 8704K rw-s- [ anon ]
be848000 132K rw--- [ stack ]
ffff0000 4K r-x-- [ anon ]
total 100308K
可以看到进程使用的总内存" vdectest"使用pmap将上述 92116K 增加到 100308K 。此虚拟内存大小一直在增长,直到达到实际的物理内存大小,然后进程将退出并显示错误ENOMEM" 无法分配内存"。