Çekirdek mmap işlemi için bellek boyutu


9

Linux ana belleğe dosyaları mmaps yolu ile ilgileniyorum (benim bağlamda yürütmek için, ama sanırım mmap işlemi de yazma ve okuma için aynıdır) ve hangi boyutu kullanır.

Linux'un genellikle 4kB sayfa boyutuyla disk belleği kullandığını biliyorum (çekirdeğin neresinde bu boyutu bulabilirim?). Ancak bu, ayrılan bellek için tam olarak ne anlama geliyor: Birkaç bin baytlık bir ikili dosya boyutuna sahip olduğunuzu varsayalım, sadece 5812B diyelim ve bunu yürütün. Çekirdekte ne olur: 2 * 4kB ayırıyor ve sonra 5812B'yi bu sayfaya kopyalıyor mu, 2. sayfada> 3KB ana belleği boşa harcıyor mu?

Sayfa boyutunu tanımlanmış olan çekirdek kaynağındaki dosyayı bilen biri çok iyi olurdu.

2. sorum da çok basit sanırım: 5812B'yi bir dosya boyutu olarak kabul ettim. Bu boyutun basitçe inode'dan alınması doğru mu?

Yanıtlar:


6

Yürütülebilir dosyanın boyutu ile bellekteki boyut arasında doğrudan bir ilişki yoktur. İşte bir ikili yürütüldüğünde neler olduğuna hızlı bir genel bakış:

  1. Çekirdek dosyayı ayrıştırır ve bölüme ayırır. Bazı bölümler ayrı sayfalarda doğrudan belleğe yüklenir. Bazı bölümler hiç yüklenmez (örn. Hata ayıklama sembolleri).
  2. Yürütülebilir dosya dinamik olarak bağlıysa, çekirdek dinamik yükleyiciyi çağırır ve gerekli paylaşılan kitaplıkları yükler ve gerektiği şekilde bağlantı sürümü gerçekleştirir.
  3. Program kodunu yürütmeye başlar ve genellikle veri depolamak için daha fazla bellek ister.

Yürütülebilir biçimler, bağlama ve yürütülebilir yükleme hakkında daha fazla bilgi için, John R. Levine'nin Bağlayıcıları ve Yükleyicilerini okuyabilirsiniz .

5kB yürütülebilir dosyada, büyük olasılıkla her şey üstbilgi dışında belleğe yüklenmesi gereken kod veya verilerdir. Yürütülebilir kod en az bir sayfa, belki iki sayfa olacaktır ve daha sonra yığın için en az bir sayfa, muhtemelen bir sayfa veya yığın (diğer veriler) ve paylaşılan kütüphaneler tarafından kullanılan bellek olacaktır.

Linux altında, bellek eşlemelerini yürütülebilir bir dosya için inceleyebilirsiniz cat /proc/$pid/maps. Biçim proc(5)kılavuz sayfasında belgelenir ; ayrıca bkz. Linux / proc / id / maps'i anlama .


0

Evet: sonunda iki 4k sayfa alırsınız. Veriler istek üzerine yüklenir, bu nedenle hiçbir şey ikinci sayfaya atıfta bulunmazsa asla belleğe yüklenmez.

include/asm-i386/param.h:#define EXEC_PAGESIZE  4096
include/asm-i386/elf.h:#define ELF_EXEC_PAGESIZE        4096

Bu değerleri değiştirmeyin ve hiçbir şeyin çalışmasını beklemeyin.

Evet, dosya boyutu ext2 / 3'te inode içinde saklanır.


0

Tanım kısmı için, Intel mimarisi için 2.6.38 ~ ish çekirdeğinde:

kemer / 86 / include / asm / page_types.h:

/ * PAGE_SHIFT sayfa boyutunu belirler * /

#define PAGE_SHIFT 12

#define PAGE_SIZE (_AC (1, UL) << PAGE_SHIFT)

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.