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 .