PCIe'deki Adres Alanları


19

PCI express'te dört adres alanı vardır:

  • Eşlenen Bellek
  • G / Ç eşleştirildi
  • Yapılandırma Alanı
  • İleti

Herkes her adres alanının önemini açıklayabilir ve kısaca amacı açıklayabilir mi?

Anladığım kadarıyla, Bu tüm alanlar RAM'e (yani işlemcinin belleği) tahsis edilir. Yapılandırma alanı, ortak kayıt kümeleri için ayrılan alandır (tüm PCIe aygıtlarında bulunur). Bu alan tüm PCIe aygıtları arasında yaygın mıdır? PCIe işlevsel çalışması için ne kadar faydalı?

Bu alan BAR (temel adres kaydı) içerir. Bu kayıt PCIe uç noktasında mevcut adresi belirtmek için mi kullanılıyor?

PCIe'de yeniyim ve öğrenmeye çalışıyorum. Temel spesifikasyondan bahsediyorum, ancak sanırım önceden PCI ve PCIe hakkında bilgi sahibi olan okuyucular için yazılmış.

Ayrıca, temel özelliklerin anlaşılmasını hızlandırmak için yararlı bazı ücretsiz çevrimiçi referanslara da bakın. Kök kompleksine sahip herhangi bir PCIe cihazı her ne zaman bir bellek bölgesi ile atanacağını anlıyorum.

Yanıtlar:


31

Bu sorulduğundan beri bir süre oldu, ama yetim sorulardan nefret ediyorum :)

İlk olarak, modern bir x86 platformunu aşırı basitleştirelim ve 0x00000000 ile 0xFFFFFFFF arasında 32 bit adres alanına sahip olduğunu varsayalım. Tüm özel / ayrılmış alanları, TOLUD (kullanılabilir alt DRAM, Intel parlance) deliklerini vb. Yok sayacağız. Bu sisteme bellek haritası diyoruz .

İkincisi, PCI Express PCI'yı genişletir . Yazılım açısından bakıldığında çok, çok benzerler.

İlk önce 3. bir konfigürasyon alanınıza atlayacağım . Yapılandırma alanına işaret eden adresler, sistem bellek haritasından ayrılır . Bir PCI aygıtında 256 bayt yapılandırma alanı vardı - bu, PCI express için 4KB'ye genişletildi. Bu 4KB alanı , sistem bellek haritasından bellek adresleri tüketir , ancak gerçek değerler / bitler / içerikler genellikle çevresel aygıttaki kayıtlarda uygulanır. Örneğin, Satıcı Kimliğini veya Aygıt Kimliğini okuduğunuzda, kullanılan bellek adresi sistem belleği haritasından olsa bile, hedef çevresel aygıt verileri döndürür.

Bunların "RAM'e tahsis edildiğini" belirttiniz - doğru değil, gerçek bitler / durum bilgisi olan öğeler çevresel aygıtta. Ancak, sistem bellek haritasına eşlenirler. Ardından, bunun tüm PCIe aygıtlarında yaygın bir kayıt kümesi olup olmadığını sordunuz - evet ve hayır. PCI yapılandırma alanının çalışma şekli, her bölümün sonunda okunacak daha fazla "öğe" olup olmadığını gösteren bir işaretçi vardır. Tüm PCIe aygıtlarının uygulaması gereken asgari bir miktar vardır ve daha gelişmiş aygıtlar daha fazlasını uygulayabilir. İşlevsel çalışma için ne kadar yararlı olduğuna gelince, zorunlu ve yoğun bir şekilde kullanılmaktadır. :)

Şimdi, BAR'lar (temel adres kayıtları) hakkındaki sorunuz hafıza alanına ve G / Ç alanına ayırmak için iyi bir alandır. Biraz x86 merkezli olmakla birlikte, spesifikasyon tipe ek olarak bir BAR boyutunun belirlenmesine izin verir. Bu, bir cihazın normal bir bellek eşlemeli BAR veya bir x86 makinesinin sahip olduğu 4K I / O alanının bir kısmını yiyen bir IO space BAR istemesine izin verir. PowerPC makinelerinde, G / Ç boşluk BAR'larının değersiz olduğunu fark edeceksiniz.

BAR, temel olarak cihazın ana bilgisayara ne kadar belleğe ve ne tür bir belleğe (yukarıda tartışıldığı) söyleme yoludur. 1 MB bellek eşlemeli alan istersem, BIOS bana 0x10000000 - 0x10100000 adresini atayabilir. Bu edilir değil fiziksel RAM, sadece adres boşluğu tüketen (32 bit sistemler RAM GB üst seviye GPU'ları gibi genişleme kartları ile sorunları çalıştırmak neden şimdi görüyorsunuz?). Şimdi, PCI Express aygıtına 0x10000004 demek için bir bellek yazma / okuma gönderilir ve bu, LED'lere bağlanan bayt çapında bir kayıt olabilir. Bu nedenle, 0x10000004 fiziksel bellek adresine 0xFF yazarsam, 8 LED yanar. Bu, bellek eşlemeli G / Ç'nin temel dayanağıdır .

G / Ç alanı benzer şekilde davranır, ancak ayrı bir bellek alanında, x86 G / Ç alanında çalışır. Adres 0x3F8 (COM1) hem G / Ç alanında hem de bellek alanında bulunur ve iki farklı şeydir.

Son sorunuz, mesajlar yeni bir tür kesme mekanizması, mesaj sinyali kesmeleri veya kısaca MSI ile ilgilidir. Eski PCI aygıtlarda dört kesme iğnesi vardı; INTA, INTB, INTC, INTD. Bunlar genellikle INTA Yuva 0'da INTA'ya, daha sonra Yuva 1'de INTB'ye, daha sonra Yuva 2'de INTC'ye, Yuva 3'te INTD'ye ve daha sonra Yuva 4'te INTA'ya geri dönecek şekilde yuvalar arasında dondu. sadece INTA uygulanan cihazlar ve üç cihaz olduğunu söyleyerek, her biri kesme kontrol cihazına kendi kesme sinyalleriyle sonuçlanacaktır. MSI, PCI Express protokol katmanını kullanarak kesintileri bildirmenin bir yoludur ve PCIe kök kompleksi (ana bilgisayar) CPU'nun kesilmesine özen gösterir.

Bu cevap size yardımcı olmak için çok geç olabilir, ancak gelecekteki Google çalışanlarına / Binger'e yardımcı olabilir.

Son olarak, daha ileri gitmeden önce PCIe hakkında iyi ve ayrıntılı bir tanıtım almak için Intel'den bu kitabı okumanızı tavsiye ederim . Başka bir referans ise LWN'den çevrimiçi bir e-kitap olan Linux Aygıt Sürücüleri olacaktır .


Post oldukça yardımcı oldu. PCIe için çok yeniyim, Numaralandırma işleminin gerçekleşmesi için (COnfiguration space tahsisi ve mapping) sürücü desteğine ihtiyacımız var mı yoksa Os tarafından başlatılabilir.
kamlendra

Teşekkürler, sevindim yardımcı oldu! Genel olarak, x86 platformlarında BIOS yazılımı, PCI aygıtlardan ayrıştırdığı yapılandırma alanı bilgilerine bağlı olarak bir miktar bellek ayırma işlemi yapar. Modern işletim sistemleri genellikle bu bellek haritasını olduğu gibi kabul eder, ancak AFAIK de uygun sürücüleri yüklemek için aygıtları numaralandırır ve numaralandırır. Linux'ta BIOS'un atadığı şeyi değiştirmenize izin verebilecek bazı ilginç düşük seviyeli şeyler gördüğümü hatırlıyorum.
Krunal Desai

Not, sadece ön-okunabilecek şekilde işaretlenir bellek, işlem başına tek bir DWORD daha transfer edebilir; diğer tüm alanlar işlem başına yalnızca bir DWORD aktarabilir . Bir patlamanın boyutu MAX_PAYLOAD_SIZE (numaralandırma sırasında keşfedildi) ile sınırlıdır.
Peter Smith

Merhaba. PCI konusunda yeniyim ve cevabınız hakkında biraz açıklama yapmak istiyorum. 256b / 4k bayt yapılandırma alanının sistem belleğine eşlendiğini belirttiniz. Kendi özel dersimden, yapılandırma alanına erişimin, sistem belleğine statik olarak eşlenen bir PCI denetleyicisi aracılığıyla ele alındığını düşündüm. Bu denetleyici, yapılandırma alanına küçük bir arabirim görevi gören birkaç kayıt (aygıt / işlev tanımlama, adres alanına ofset, sonuç adresi) sağlar. Aslında, PCI denetleyicisi için statik olarak yalnızca yaklaşık 5 - 10 bayt ayrılmıştır. Bu doğru mu ???
Cerezo

Bu nedenle, ana bilgisayar (CPU) 0x10000004 adresindeki bir kayıt defterine 0xFF değeri yazdığında, PCI kök kompleksi bu verileri getirir (belki de her zaman 0x10000000 ile 0x10100000 arasındaki herhangi bir adresteki bir veri için sorgulama yapar) ve adrese yazar Son noktada 0x04 (PCIe aygıtı)? Bu anlayış doğru mu?
AlphaGoku
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.