gpt4 book ai didi

c++ - 内存表大小

转载 作者:行者123 更新时间:2023-11-28 06:00:35 25 4
gpt4 key购买 nike

我有一些文件,描述了进程的 32 位虚拟地址空间的结构。例如:

  • 08048000-08053000 r-xp 00000000 08:03 18877/usr/bin/cat
  • 08053000-08054000 r--p 0000a000 08:03 18877/usr/bin/cat
  • 08054000-08055000 rw-p 0000b000 08:03 18877/usr/bin/cat
  • 091e3000-09204000 rw-p 00000000 00:00 0 [堆]
  • 4f2d0000-4f2ef000 r-xp 00000000 08:03 1857/usr/lib/ld-2.15.so
  • 4f2ef000-4f2f0000 r--p 0001e000 08:03 1857/usr/lib/ld-2.15.so
  • 4f2f0000-4f2f1000 rw-p 0001f000 08:03 1857/usr/lib/ld-2.15.so
  • 4f2f7000-4f4a2000 r-xp 00000000 08:03 1858/usr/lib/libc-2.15.so
  • 4f4a2000-4f4a3000 ---p 001ab000 08:03 1858/usr/lib/libc-2.15.so
  • 4f4a3000-4f4a5000 r--p 001ab000 08:03 1858/usr/lib/libc-2.15.so
  • 4f4a5000-4f4a6000 rw-p 001ad000 08:03 1858/usr/lib/libc-2.15.so
  • 4f4a6000-4f4a9000 读写-p 00000000 00:00 0
  • b75c0000-b77c0000 r--p 00000000 08:03 57661/usr/lib/locale/locale-archive
  • b77c0000-b77c1000 读写-p 00000000 00:00 0
  • b77d9000-b77da000 读写-p 00000000 00:00 0
  • b77da000-b77db000 r-xp 00000000 00:00 0 [vdso]
  • bf819000-bf83a000 rw-p 00000000 00:00 0 [堆栈]

x86 处理器上有两级虚拟内存。一页大小为 4096 字节。一个页目录包含 1024 条记录,每条记录大小为 4 字节。

如何计算虚拟内存表的总大小?

最佳答案

因此,每 4096 字节有一个页表条目 (PTE)。每 1024 个 PTE 对应一个页目录条目。

因此每个条目的数量为:

ptes = (x + 4095) / 4096;
pdes = (ptes + 1023) / 1024

+4095 和 +1023 是为了“确保我们至少有一个用于任何非零值”,并且上面假定 xptes 的整数值>。

我将把这两个数字相加并相乘得到字节。

当然,如果你想高效,用>> 12代替/4096,用>> 10代替/1024 - 这将保证编译器实际上不会执行除法运算。

当我们有多个内存范围时,您需要为每个“大块”(1024 x 4096 字节,因此即使是 4MB 范围也会有一个 PDE)一个 PDE,然后甚至 4K 区域也需要一个 PTE。

所以从你的例子来看: 08048000-08053000 r-xp 00000000 08:03 18877/usr/bin/cat没有内存。预订的。

08053000-08054000 r--p 0000a000 08:03 18877 /usr/bin/cat

1 个 PDE,10 个 PTE(0xa000 = 10 * 4096 字节)

08054000-08055000 rw-p 0000b000 08:03 18877 /usr/bin/cat

0 个 PDE,1 个 PTE(0xb000 - 0xa000 = 0x1000 = 4096 字节)

091e3000-09204000 rw-p 00000000 00:00 0 [heap]

没有内存,保留。 4f2d0000-4f2ef000 r-xp 00000000 08:03 1857/usr/lib/ld-2.15.so无内存,保留

4f2ef000-4f2f0000 r--p 0001e000 08:03 1857 /usr/lib/ld-2.15.so

1 个 PDE,1 个 PTE(0xf0000 - 0xef000 = 4096 字节)

4f2f0000-4f2f1000 rw-p 0001f000 08:03 1857 /usr/lib/ld-2.15.so

0 PDE,1 PTE

4f2f7000-4f4a2000 r-xp 00000000 08:03 1858 /usr/lib/libc-2.15.so

无内存,保留范围

4f4a2000-4f4a3000 ---p 001ab000 08:03 1858 /usr/lib/libc-2.15.so

0 PDE,1 PTE

4f4a3000-4f4a5000 r--p 001ab000 08:03 1858 /usr/lib/libc-2.15.so

0 PDE,2 PTE (0xa5000 - 0xa3000 = 2000)

4f4a5000-4f4a6000 rw-p 001ad000 08:03 1858 /usr/lib/libc-2.15.so

0 PDE,1 PTE

4f4a6000-4f4a9000 rw-p 00000000 00:00 0
b75c0000-b77c0000 r--p 00000000 08:03 57661 /usr/lib/locale/locale-archive
b77c0000-b77c1000 rw-p 00000000 00:00 0
b77d9000-b77da000 rw-p 00000000 00:00 0
b77da000-b77db000 r-xp 00000000 00:00 0 [vdso]
bf819000-bf83a000 rw-p 00000000 00:00 0 [stack]

因此,我认为这个特定的可执行文件总共有 2 个 PDE 条目和 18 个 PTE。我可能算错了,但原则上这就是你如何为这个特定的例子做的(这似乎是通过加载的部分方式,因为它没有使用任何堆栈或堆,这对于一个完全运行的程序来说是不可能的 -这可能是在程序实际完全运行之前收集的统计信息,或者类似的)

关于c++ - 内存表大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33356800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com