Linux / proc / id / haritaları anlama


156

Gömülü Linux uygulamamın bellek kullanımını anlamaya çalışıyorum. Yardımcı /proc/pid/mapsprogram / dosya ayrıntıları görmek için iyi bir kaynak gibi görünüyor. Ne yazık ki tüm sütunları ve girişleri anlamıyorum.

Anonim inode 0 girişleri ne anlama geliyor? Bunlar daha büyük bellek segmentlerinden bazıları gibi görünüyor.


1
proc(5) mmap(2)"Linux Çekirdeğini Anlamak" 9.3. Bellek Bölgeleri; 16.2. Bellek Haritalama "Linux Sanal Bellek Yöneticisini Anlamak" 4.4 Bellek Bölgeleri
wRAR

Yanıtlar:


264

İçindeki her satır, /proc/$PID/mapsbir işlem veya iş parçacığında bitişik sanal bellek bölgesini tanımlar. Her satır aşağıdaki alanlara sahiptir:

address           perms offset  dev   inode   pathname
08048000-08056000 r-xp 00000000 03:0c 64593   /usr/sbin/gpm
  • adres - Bu, işlemin adres alanındaki bölgenin başlangıç ​​ve bitiş adresidir
  • izinler - Bu, bölgedeki sayfalara nasıl erişilebileceğini açıklar. Dört farklı izin vardır: okuma, yazma, yürütme ve paylaşma. Okuma / yazma / yürütme devre dışı bırakılırsa, / / -yerine bir görüntülenir . Bir bölge değilse paylaşılan , öyle özel bir nedenle, yerine ait görünecektir . İşlem belleğe izin verilmeyen bir şekilde erişmeye çalışırsa, bir segmentasyon hatası üretilir. İzinler sistem çağrısı kullanılarak değiştirilebilir .rwxpsmprotect
  • ofset - Bölge bir dosyadan eşlenmişse (kullanarak mmap), bu eşlemenin başladığı dosyadaki ofsettir. Bellek bir dosyadan eşlenmemişse, yalnızca 0'dır.
  • cihaz - Bölge bir dosyadan eşlendiyse, dosyanın yaşadığı ana ve küçük cihaz numarasıdır (onaltılık).
  • inode - Bölge bir dosyadan eşlenmişse, dosya numarası budur.
  • pathname - Bölge bir dosyadan eşlenmişse, bu dosyanın adıdır. Bu alan, anonim eşlenen bölgeler için boştur. Orada isimlerle özel bölgeler gibi de vardır [heap], [stack]ya [vdso]. [vdso]sanal dinamik paylaşılan nesne anlamına gelir. Sistem çağrıları tarafından çekirdek moduna geçmek için kullanılır. İşte bununla ilgili iyi bir makale: "linux-gate.so.1 nedir?"

Çok sayıda anonim bölge görebilirsiniz. Bunlar genellikle tarafından oluşturulur mmapancak herhangi bir dosyaya eklenmez. Bunlar, paylaşılan bellek veya yığın üzerinde tahsis edilmemiş arabellekler gibi birçok çeşitli şey için kullanılır. Örneğin, pthread kütüphanesinin yeni iş parçacığı yığınları olarak anonim eşlenen bölgeler kullandığını düşünüyorum.


4
Evet pthreads yığın taşma tespiti için daha küçük bir bölüm ile bir yığın için 8 Mb blok tahsis (sanırım). Bu nedenle, oluşturulan her pthread varsayılan olarak 8Mb'lik bir inode 0 bellek bölgesi ve 4Kb'nın bir inode 0 bölgesi tahsis eder.
simon

Yani örnekteki gpmELF başlık vb baştan bazı sanal adres sağda ikili dosyasını haritasını çıkarıyor? Yükleyicinin tüm dosyayı değil, ELF başlığını ayrıştırması ve tek tek bölümleri eşlemesi gerekmez mi?
Dmitry Grigoryev

9

bellek eşleme sadece dosyaları belleğe eşlemek için değil aynı zamanda çekirdekten RAM istemek için bir araçtır. Bunlar şu inode 0 girişleridir - yığınınız, yığınınız, bss segmentleriniz ve daha fazlası


5

Lütfen kontrol edin: http://man7.org/linux/man-pages/man5/proc.5.html

address           perms offset  dev   inode       pathname
00400000-00452000 r-xp 00000000 08:02 173521      /usr/bin/dbus-daemon

Adres alanı, eşlemenin kapladığı işlemdeki adres alanıdır.

İzinler alanı bir izin kümesidir:

 r = read
 w = write
 x = execute
 s = shared
 p = private (copy on write)

Ofset alanı, dosyaya / ne olursa olsun ofsettir;

dev cihazdır (ana bilgisayar: küçük);

inode, o cihazdaki inode'dur. 0, BSS'de (başlatılmamış veriler) olduğu gibi bellek bölgesi ile ilişkili bir inode olmadığını gösterir.

Yol adı alanı genellikle eşlemeyi destekleyen dosya olur. ELF dosyaları için, ELF program başlıklarındaki Ofset alanına (readelf -l) bakarak ofset alanıyla kolayca koordine edebilirsiniz.

Linux 2.0 altında, yol adı veren bir alan yoktur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.