Bellek eşlemeli G/Ç - Memory-mapped I/O

Bellek eşlemeli G/Ç ( MMIO ) ve bağlantı noktası eşlemeli G/Ç ( PMIO ), bir bilgisayardaki merkezi işlem birimi (CPU) ile çevresel aygıtlar arasında giriş/çıkış (G/Ç) gerçekleştirmenin birbirini tamamlayan iki yöntemidir . Alternatif bir yaklaşım, kendi yönergelerini yürüten , ana bilgisayar bilgisayarlarında yaygın olarak kanallar olarak bilinen özel G/Ç işlemcileri kullanmaktır .

I / O Metotları aynı kullanan adres alanını hem adrese bellek ve I / O cihazları . G/Ç cihazlarının belleği ve kayıtları , adres değerleriyle (ilişkili) eşleştirilir. Bu nedenle bir bellek adresi, fiziksel RAM'in bir bölümüne veya bunun yerine G/Ç aygıtının belleğine atıfta bulunabilir . Böylece belleğe erişmek için kullanılan CPU komutları, aygıtlara erişmek için de kullanılabilir. Her I/O cihazı CPU'nun adres yolunu izler ve o cihaza atanan bir adresin herhangi bir CPU erişimine yanıt vererek veri yolunu istenen cihazın donanım kaydına bağlar . G/Ç aygıtlarını barındırmak için, CPU tarafından kullanılan adreslerin alanları G/Ç için ayrılmalı ve normal fiziksel bellek için mevcut olmamalıdır. Rezervasyon kalıcı veya geçici olabilir ( bank değiştirme yoluyla elde edildiği gibi ). İkincisinin bir örneği , aralıkta RAM veya G/Ç donanımının görünmesine neden olmak için bir bellek eşleme biçimi kullanan Commodore 64'te bulunur . 0xD000-0xDFFF

Bağlantı noktası eşlemeli G/Ç genellikle , x86 ve x86-64 mimarilerine dayalı mikroişlemcilerde bulunan inve outyönergeleri gibi, G/Ç gerçekleştirmek için özel olarak tasarlanmış özel bir CPU yönergeleri sınıfı kullanır . Bu iki komutun farklı biçimleri , EAX kaydı veya bu kaydın CPU üzerindeki alt bölümlerinden biri ile bir G/Ç aygıtına atanan belirli bir G/Ç bağlantı noktası arasında bir, iki veya dört bayt ( , ve ) kopyalayabilir . G/Ç aygıtlarının genel bellekten ayrı bir adres alanı vardır; bu, ya CPU'nun fiziksel arabirimindeki fazladan bir "G/Ç" pimi ile ya da G/Ç'ye ayrılmış tüm bir veri yolu ile sağlanır . G/Ç için adres alanı ana bellek için olandan yalıtılmış olduğundan, buna bazen yalıtılmış G/Ç olarak atıfta bulunulur. outboutwoutl

genel bakış

Bellek eşleme gibi farklı CPU'dan aygıta iletişim yöntemleri, bir aygıt için doğrudan bellek erişimini (DMA) etkilemez , çünkü tanım gereği DMA, CPU'yu atlayan bir bellekten aygıta iletişim yöntemidir.

Donanım kesintileri , CPU ile çevresel aygıtlar arasındaki başka bir iletişim yöntemidir, ancak çeşitli nedenlerle kesintiler her zaman ayrı olarak ele alınır. Bir kesme, yukarıda bahsedilen ve CPU tarafından başlatılan yöntemlerin aksine aygıt tarafından başlatılır. Bilgi yalnızca cihazdan CPU'ya aktığı için tek yönlüdür. Son olarak, her kesme hattı, "bu kesme hattındaki bir cihazda dikkat edilmesi gereken bir olay meydana geldi" anlamına gelen sabit bir anlama sahip yalnızca bir bit bilgi taşır .

Adres ve veri yolları paylaşılıyorsa, G/Ç işlemleri bellek erişimini yavaşlatabilir. Bunun nedeni, çevresel aygıtın genellikle ana bellekten çok daha yavaş olmasıdır. Bazı mimarilerde, bağlantı noktası eşlemeli G/Ç, sorunu hafifleten özel bir G/Ç veri yolu üzerinden çalışır.

Bellek eşlemeli G/Ç'nin bir avantajı, bağlantı noktası G/Ç'sinin getirdiği ekstra karmaşıklığı ortadan kaldırarak, bir CPU'nun daha az dahili mantık gerektirmesi ve dolayısıyla daha ucuz, daha hızlı, daha kolay inşa edilmesi, daha az güç tüketmesi ve fiziksel olarak daha küçük olabilmesidir; bu, azaltılmış komut seti hesaplamasının temel ilkelerini takip eder ve gömülü sistemlerde de avantajlıdır . Diğer bir avantaj ise, aygıtları adreslemek için normal bellek yönergeleri kullanıldığından, CPU'nun tüm adresleme modlarının bellek kadar G/Ç için de kullanılabilir olması ve bir ALU işlemini doğrudan bir bellek işleneninde gerçekleştiren yönergelerin (yükleme) olmasıdır. bir bellek konumundan işlenen, sonucu bir bellek konumuna depolama veya her ikisi) de G/Ç aygıt kayıtları ile kullanılabilir. Buna karşılık, bağlantı noktası eşlemeli G/Ç yönergeleri genellikle çok sınırlıdır ve genellikle yalnızca CPU kayıtları ve G/Ç bağlantı noktaları arasında yalnızca basit yükleme ve depolama işlemleri sağlar, böylece örneğin bağlantı noktası eşlenmiş bir sabite eklemek için. aygıt kaydı üç talimat gerektirir: portu bir CPU kaydına oku, sabiti CPU kaydına ekle ve sonucu tekrar porta yaz.

Olarak 16 bit işlemci eskimiş ile değiştirilmelidir 32 bit ve 64 bit işlemci bellek adres alanı genellikle daha büyük olduğu I bellek adres alanının genel kullanımda, ayırma aralıkları / O az bir sorun sistemdeki tüm bellek ve G/Ç aygıtları için gereken alandan daha fazladır. Bu nedenle, bellek eşlemeli G/Ç'nin avantajlarından yararlanmak daha sık pratik hale geldi. Ancak, adres alanı artık önemli bir sorun olmasa bile, G/Ç eşleme yöntemlerinin hiçbiri diğerine evrensel olarak üstün değildir ve bağlantı noktası eşlemeli G/Ç kullanmanın hala tercih edildiği durumlar olacaktır.

x86 tabanlı mimarilerde bellek eşlemeli G/Ç tercih edilir, çünkü bağlantı noktası tabanlı G/Ç gerçekleştiren talimatlar tek bir kayıtla sınırlıdır: EAX, AX ve AL, verilerin içine veya dışına taşınabileceği yalnızca kayıtlardır, ve komuttaki bayt boyutunda bir anlık değer veya DX kaydındaki bir değer, hangi bağlantı noktasının aktarımın kaynak veya hedef bağlantı noktası olduğunu belirler. Herhangi bir genel amaçlı kayıt, belleğe ve bellek eşlemeli G/Ç aygıtlarına veri gönderip alabildiğinden, bellek eşlemeli G/Ç daha az talimat kullanır ve bağlantı noktası G/Ç'den daha hızlı çalışabilir. AMD , x86-64 mimarisini 64 bit bağlantı noktalarını destekleyecek şekilde tanımlarken bağlantı noktası G/Ç yönergelerini genişletmedi , bu nedenle bağlantı noktası G/Ç kullanılarak 64 bit aktarımlar gerçekleştirilemez.

Bellek engelleri

Yana önbelleğe hafıza adreslerine erişimleri aracılık, farklı adreslere yazılı veri programı sırayla, yani yazılım bir adrese veri yazar eğer dışarı çevre birimleri hafızasını veya kayıtlar ulaşmak ve daha sonra başka bir adrese veri yazar olabilir, önbellek yazma tampon yok verilerin çevre birimlerine bu sırayla ulaşacağını garanti eder. Sıradaki her yazma işleminden sonra önbellek temizleme talimatlarını içermeyen herhangi bir program, bir önbellek sistemi yazma sırasını optimize ederse, istenmeyen IO etkileri görebilir. Belleğe yazma işlemleri, yedekliliği azaltmak veya depolananların son durumunu değiştirmeden bellek erişim döngülerinden daha iyi yararlanmak için genellikle yeniden sıralanabilir; oysa aynı optimizasyonlar, bellek eşlemeli G/Ç bölgelerine yazmaların anlamını ve etkisini tamamen değiştirebilir.

Bellek eşlemeli G/Ç bölgelerinin seçiminde öngörü eksikliği, eski nesil bilgisayarlarda birçok ram kapasitesi engeline yol açtı. Tasarımcılar, makinelerin bir mimarinin teorik RAM kapasitesinden tam olarak yararlanacak şekilde büyümesini nadiren beklediler ve bu nedenle, bellek eşlemeli G/Ç işlevleri için genellikle adres alanının bazı yüksek dereceli bitlerini seçici olarak kullandılar. Örneğin , IBM PC ve türevlerindeki 640 KB engeli , Üst Bellek Alanı için 640 ve 1024 KB (64k segment 10 ila 16) arasındaki bölgenin ayrılmasından kaynaklanmaktadır . Bu seçim başlangıçta çok az etki yaptı, ancak sonunda 20 bitlik kullanılabilir adres alanı içindeki toplam ram miktarını sınırladı. 3 TR bariyer ve PCI delik ayrıntıları şiddetlenir 32 bitlik adres boşluk, bu benzer tezahürleri X86 önyükleme işlemi ve MMU tasarımı. 64 bit mimariler genellikle teknik olarak benzer sorunlara sahiptir, ancak bunların nadiren pratik sonuçları vardır.

Örnekler

Örnek bir sistem bellek haritası
Adres aralığı ( onaltılık ) Boyut cihaz
0000–7FFF 32 KiB Veri deposu
8000–80FF 256 bayt Genel amaçlı G/Ç
9000–90FF 256 bayt Ses denetleyicisi
A000–A7FF 2 KiB Video denetleyicisi/metin eşlemeli ekran RAM'i
C000–FFFF 16 KiB ROM

8 bitlik bir mikroişlemci etrafında inşa edilmiş basit bir sistem , 16 bitlik adres hatları sağlayarak 64 kibibayta (KiB) kadar belleğe hitap etmesine izin  verebilir . Böyle bir sistemde, ilk 32 KiB adres alanı rastgele erişimli belleğe (RAM), diğer 16 KiB'lik salt okunur belleğe (ROM) ve geri kalanı zamanlayıcılar, sayaçlar, video gösterimi gibi çeşitli diğer cihazlara ayrılabilir. çipler, ses üreten cihazlar, vb.

Sistemin donanımı, adres yolundaki aygıtlar yalnızca kendilerine yönelik belirli adreslere yanıt verecek ve diğer tüm adresler yok sayılacak şekilde düzenlenmiştir. Bu işi olduğunu devreyi adres çözme ve bu kurar hafıza haritası sisteminin. Sonuç olarak, sistemin bellek haritası sağdaki tablodaki gibi görünebilir. Bu bellek haritası, gerçek sistem mimarilerinde de oldukça yaygın olan boşluklar içerir.

Video denetleyicisinin dördüncü kaydının ekranın arka plan rengini ayarladığını varsayarsak, CPU bu rengi standart bellek yazma talimatını kullanarak A003 bellek konumuna bir değer yazarak ayarlayabilir. Aynı yöntem kullanılarak, video denetleyicisi içindeki RAM'in özel bir alanına karakter değerleri yazılarak grafikler bir ekranda görüntülenebilir. Bit eşlemli gösterimleri etkinleştiren ucuz RAM'den önce , bu karakter hücresi yöntemi bilgisayar video gösterimleri için popüler bir teknikti (bkz. Metin kullanıcı arayüzü ).

Temel adres çözme türleri

Bir cihazın adresleri tamamen veya eksik olarak çözebildiği adres çözme türleri şunları içerir:

Komple (kapsamlı) kod çözme
Benzersiz adreslerin bir donanım kaydına (fiziksel bellek konumu) 1:1 eşlenmesi. Adres veriyolunun her satırının kontrol edilmesini içerir .
Eksik (kısmi) kod çözme
n:1 n benzersiz adresin bir donanım kaydına eşlenmesi. Kısmi kod çözme, bir bellek konumunun birden fazla adrese sahip olmasına izin vererek, programcının n farklı adres kullanarak bir bellek konumuna başvurmasına olanak tanır. Ayrıca, CPU'nun tüm adres alanına ihtiyaç duyulmadığında yalnızca bazı adres satırlarını inceleyen daha basit ve genellikle daha ucuz mantık kullanarak kod çözme donanımını basitleştirmek için yapılabilir. Genellikle, kod çözmenin kendisi programlanabilir, bu nedenle sistem kendi bellek haritasını gerektiği gibi yeniden yapılandırabilir, ancak bu daha yeni bir gelişmedir ve genellikle daha ucuz olma amacı ile çelişir.
Eş anlamlılar: geri katlama, çoklu eşleme, kısmen eşleme, adres takma .
Doğrusal kod çözme
Adres satırları herhangi bir kod çözme mantığı olmadan doğrudan kullanılır. Bu, bir dizi adres girişi olan RAM'ler ve ROM'lar gibi cihazlarla ve bir kayıt bankasını adreslemek için benzer bir giriş dizisine sahip çevresel yongalarla yapılır. Doğrusal adresleme nadiren tek başına kullanılır (yalnızca veri yolunda birkaç cihaz olduğunda, çünkü birden fazla cihaz için tamamen doğrusal adresleme kullanmak genellikle çok fazla adres alanı harcar) ancak bunun yerine bir cihaz seçmek için diğer yöntemlerden biriyle birleştirilir veya doğrusal adreslemenin tek bir kayıt veya bellek konumu seçtiği aygıt grubu.

Aygıt sürücüleri aracılığıyla bağlantı noktası G/Ç

Windows tabanlı bilgisayarlarda belleğe, Windows 95'ten Windows 7'ye kadar çoğu Windows platformunda 8-, 16- ve 32-bit'te G/Ç erişimi sağlayan DOLLx8KD gibi belirli sürücüler aracılığıyla da erişilebilir. port sürücüleri, port G/Ç'ye izin veren basit DLL çağrıları ile sürücüleri etkinleştirerek bellek erişimini sağlar ve gerekmediğinde, G/Ç bağlantı noktalarına yetkisiz erişimi önlemek için sürücü kapatılabilir.

Linux, MMIO adreslerinden okumaya ve bu adreslere yazmaya izin vermek için pcimem yardımcı programını sağlar . Linux çekirdeği ayrıca, çekirdeğin mmiotrace hata ayıklama özelliğini kullanarak çekirdek modüllerinden (sürücüler) MMIO erişiminin izlenmesine izin verir . Bunu etkinleştirmek için, Linux çekirdeği ilgili seçenek etkinleştirilmiş olarak derlenmelidir. mmiotrace , kapalı kaynaklı aygıt sürücülerinde hata ayıklamak için kullanılır.

Ayrıca bakınız

Referanslar