`dd`가 200M 가상 주소 공간을 매핑하는 이유는 무엇입니까?

`dd`가 200M 가상 주소 공간을 매핑하는 이유는 무엇입니까?
  1. sudo atop -R
  2. dd if=/dev/zero of=/dev/null # in a background tab

에 메모리 세부 정보를 atop입력합니다 . 검색하려는 내용을 m입력하세요 . 결과:/dddd

PID TID MINFLT MAJFLT VSTEXT VSLIBS VDATA VSTACK VSIZE RSIZE PSIZE VGROW RGROW SWAPSZ RUID EUID MEM CMD 1/1
...
29041 - 93 0 56K 1456K 176K 136K 210.0M 832K 255K 210.0M 832K 0K alan-sys alan-sys 0% dd

이 열을 제가 가장 궁금한 부분으로 나누어 보겠습니다.

PID VSTEXT VSLIBS VDATA VSTACK VSIZE RSIZE PSIZE VGROW RGROW SWAPSZ
...
29041 56K 1456K 176K 136K 210.0M 832K 255K 210.0M 832K 0K

이 210M VSIZE의 용도는 무엇입니까?


$ rpm -q --whatprovides $(which dd)
coreutils-8.30-6.fc29.x86_64

답변1

이는 힙 메모리 할당이 아닙니다. 로케일 정보에 대한 가상 매핑 파일입니다. 매핑된 파일은 /usr/lib/locale/locale-archive패키지가 소유합니다 glibc-all-langpacks. 즉, 다른 언어로 된 메시지 파일일 수 있습니다.

$ gdb dd
...
(gdb) break main
Breakpoint 1 at 0x29c0: file ../src/dd.c, line 2380.
(gdb) run if=/dev/zero of=/dev/null
Starting program: /usr/bin/dd if=/dev/zero of=/dev/null
warning: Loadable section ".note.gnu.property" outside of ELF segments

Breakpoint 1, main (argc=3, argv=0x7fffffffd3b8) at ../src/dd.c:2380
2380    {
(gdb)  break mmap
Breakpoint 2 at 0x7ffff7ecd070: file ../sysdeps/unix/sysv/linux/mmap64.c, line 41.
(gdb) cont
Continuing.

Breakpoint 2, __GI___mmap64 (addr=addr@entry=0x0, len=len@entry=217742304, prot=prot@entry=1, flags=flags@entry=2, fd=fd@entry=3, 
    offset=offset@entry=0) at ../sysdeps/unix/sysv/linux/mmap64.c:41
41  {
(gdb) break munmap
Breakpoint 3 at 0x7ffff7ecd150: file ../sysdeps/unix/syscall-template.S, line 78.
(gdb) cont
Continuing.
^C
Program received signal SIGINT, Interrupt.
(gdb) info proc mappings
process 30592
Mapped address spaces:

          Start Addr           End Addr       Size     Offset objfile
      0x555555554000     0x555555556000     0x2000        0x0 /usr/bin/dd
      0x555555556000     0x555555562000     0xc000     0x2000 /usr/bin/dd
      0x555555562000     0x555555567000     0x5000     0xe000 /usr/bin/dd
      0x555555567000     0x555555568000     0x1000    0x12000 /usr/bin/dd
      0x555555568000     0x555555569000     0x1000    0x13000 /usr/bin/dd
      0x555555569000     0x55555558a000    0x21000        0x0 [heap]
      0x7fffeae2d000     0x7ffff7dd5000  0xcfa8000        0x0 /usr/lib/locale/locale-archive
...
(gdb) exit

관련 정보