2015-10-26 89 views
0

我有文件,描述了进程的32位虚拟地址空间结构。例如:内存表大小

  • 08048000-08053000 R-XP 00000000 08:03 18877在/ usr /斌/猫
  • 08053000-08054000 [R - P 0000a000 08:03 18877在/ usr /斌/猫
  • 08054000-08055000 RW-p 0000b000 8点03 18877的/ usr /斌/猫
  • 091e3000-09204000 RW-p 00000000 00:00 0 [堆]
  • 4f2d0000-4f2ef000 R-XP 00000000 8时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 RW-p 00000000 00:00 0
  • b75c0000-b77c0000 - [R - p 00000000 08:03 57661/usr/lib中/区域/区域设置ARCHI已经
  • 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]

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

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

+1

您是否尝试过这样计算? –

+0

@MatsPetersson我想这样做,但我不明白该怎么做。我认为我可以计算非零偏移量(表中的3列)并乘以4096,所以我得到字节大小。但我不确定,如果这是正确的方式。你能解释我吗,我该怎么做? – thmw

+0

所以,我的问题基本上是“尝试做计算并解释你所做的事情” - 这不完全是火箭科学,它是非常基本的计算。 –

回答

1

因此,每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,然后一个PTE用于4K区域。

所以从你的例子: 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。我可能已经计算出了错误,但原则上这就是你如何处理这个特定的例子(这似乎是通过加载的一部分,因为它不使用任何堆栈或堆,这对于完全运行的程序来说不太可能 - 这可能是在程序实际运行完成之前收集的统计数据,或者是其他数据)

+0

我可以计算进程的映射虚拟内存的大小。对于上面的表,它是4345856个字节,所以ptes = 1061。所以pdes = 2。然后我必须做什么? – thmw

+0

我无法理解,为什么我的例子中表的大小是28672.我做了下一个计算:4345856 - 表映射的虚拟内存的大小,所以4345856/4096 = 1061页,1061/1024 = 2页的第二层次,所以2个dirs和一个链接到他们,所以3 * 1024 * 4 = 12288.我添加了问题的全表。 – thmw

+0

所以对于这个例子,你需要(1061 + 2)* 4字节。不会被打扰走出计算器。 –