2011-06-05 8 views
8

Sanal, ben sanal birinden fiziksel adres elde etme bir sorun var.Linux (Ubuntu) C dili: Başlık da anlaşılacağı gibi Fiziksel Address Translation

Açıklamama izin verin: Süreç alanında bir değişken bildirimi verildiğinde, işletim sistemi tarafından eşlenen fiziksel adres nasıl elde edilebilir?

Bazı sys çağrıları /asm/io.h tökezledim; burada virt_to_phys() işlevi tanımlandı; Ancak bu başlık güncel değil gibi görünüyor ve bir iş bulamıyorum.

Ancak; io.h şu adreste bulunabilir: /usr/src/linux-headers-2.6.35-28-generic/arch/x86/include/asm/. Geçerli çekirdeğim 2.6.35-28, ancak io.h/usr/include/asm/'a dahil değil mi?

Yani, yinelemek için: Ben sanal fiziksel adresini almak için bir yol gerekir. Tercihen çalışma zamanında uygulama içinden türetilir. Ama /proc/PID/maps bir monitör kullanmanın bir geçici çözümü bile yapacağız.

herhangi bir fikir veya yorumlar büyük takdir edilecektir.


DÜZENLEME bu konuda biraz araştırma yaptıktan sonra ben bu konuda yardımcı şey buldum. Geçici bir çözüm biraz gerektirmesine rağmen

O Bu yapılabilir daha fazladır çıkıyor. Geçerli haritalanmış sayfaları analiz eden basit bir uygulamaya link. Söz konusu dosya çıkıyor (bir ikili dosya) /proc/pid/pagemap (sanal sayfaların fiziksel eşlemesini içerir). Her neyse, bu bağlantıdaki kod bir monitör uygulaması veya bir şey olarak hizmet etmek için değiştirilebilir.

Önbellek simülasyon amaçları için fiziksel adrese ihtiyacım vardı.

Yardım ve cevaplarınız için teşekkür ederiz!

+4

Bunun için ne gerekiyor? –

cevap

21

kullanıcı kodunda, sanal bir adrese karşılık gelen fiziksel adresi bilemez. Bu bilgi sadece çekirdek dışında ihraç edilmez. Çekirdek, işleminizin belleğinin bir kısmını değiştirmeye karar verirse, her an değişebilir. /proc/$pid/maps yılında

, kendi programınızın adres uzayda sanal adresleri (eşlenmiş dosyaları, yığın, yığın, vb) tekabül hakkında bilgi var. Bu kadarını alacaksın.

Çekirdek kodunda çalışıyorsanız (ki bunu açıkça görmüyorsanız), bir bellek sayfasına karşılık gelen fiziksel adresi öğrenebilirsiniz. Ama o zaman bile virt_to_phys bütün hikaye değil; Linux Device Drivers'u (özellikle 8 ve 15 bölümleri) okumanızı öneririz.

başlık asm/io.h bir çekirdek başlığıdır. Kullanıcı kodu derlendiğinde kullanılamaz, çünkü içeriği çok anlamlı olmaz. Bildirdiği işlevler, yalnızca çekirdeğindeki herhangi bir kitaplıkta mevcut değildir.

+0

Tam olarak ne söyleyecektim, ama daha da detaylı! 1 –

+3

1 Ben hafıza bile – hirschhornsalz

1

Systemcall/procfs kullanarak sanal adresi kanala aktarın ve vmalloc_to_pfn kullanın. Fiziksel adresi procfs/registerlar aracılığıyla döndürün.Gibi kısmen gönderen kullanıcı tarafından cevap

+0

var olmayan bir fiziksel konumu takas edilen Fakat vmalloc_to_pfn' bir adres Sayfa Çerçeve Numarası döndürür ve değil 'o kadar değilse o işaret etmek istiyorum? (ör. http://stackoverflow.com/questions/11442773/vmalloc-to-pfn-returns-32-bit-address-on-linux-32-system-why-does-it-chop-off-h/22013238# 22013238) Şimdi PFN bir adrese dönüştürülmeli, o zaman? – sdaau

2

, Linux çekirdeği /proc dosyaların bir dizi aracılığıyla UserLand onun eşleme ortaya çıkarır. Dökümantasyon here bulunabilir. Kısa özet:

    /proc/$pid/maps eşlemelerin listesini sanal adresleriyle ve eşlenen dosyalar için karşılık gelen dosyayla birlikte sağlar.
  1. /proc/$pid/pagemap, varsa fiziksel adres de dahil olmak üzere, eşlenen her sayfa hakkında daha fazla bilgi sağlar.

Orijinal posterin daha sonra bulunduğu gibi, this example, bu dosyaların nasıl kullanılacağına dair örnek bir uygulama sağlar.