Memory Mapped IO nasıl yapılır, kim yapar?

Başlatan mir_as82, 31 Mayıs 2016, 09:22:07

mir_as82

Masaüstü PC lerde veya laptoplarda, ram in belli bir alanı sanki ekran kartı gibi davranıyor. Yani belli bir adres alanına CPU birşey yazınca gidip o bilgi ekran kartına yazılıyor. Bu nasıl oluyor? Olayın akışı ve mantığı nedir?

yamak

Hocam sizin bahsettiğiniz olay MMIO'dan ziyade framebuffer olayına girer.Yani bilgiyi yazdığınız alan frame buffer olabilir mi?

mir_as82


yamak

#3
Hocam MMIO,IO adresleriyle memory nin aynı adres uzayında olmasıdır.Senin bahsettiğin şey de bu olayla bağlantılı olabilir ama asıl bağlantılı olduğu konu frame buffer.Aşağıdaki link in faydalı olacağını düşünüyorum.
https://blogs.igalia.com/itoral/2014/07/29/a-brief-introduction-to-the-linux-graphics-stack/

Edit:
Burayı da okuyabilirsin hocam.
https://en.wikipedia.org/wiki/Framebuffer

z

#4
Bu mimari ile ilgili bir durum.

Intel işlemcilerde aynı adres hep ram hem de I/O alanı olarak kullanılabilir.

Rama erişirken mov tipi komutlar I/O alanına erişirken In /Out tipi komutlar kullanılır.



mesaj birleştirme:: 31 Mayıs 2016, 12:53:09

Adres aynı olmasına rağmen mov komutları ram'a ın/out komutları da porta yazılır.

Eğer bir ramı CRT uygulamalarında olduğu gibi MCU ile ortak kullanırsan MCU rama yazar CRTC de ramdaki veriyi ekrana yollamak üzere okuyup bit açılımı yapabilir. Bu durumda mimarinin önemi kalmaz.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mir_as82

#5
A sample system memory map:
Address range (hexadecimal)   Size   Device
0000–7FFF   32 KiB   RAM
8000–80FF   256 bytes   General-purpose I/O
9000–90FF   256 bytes   Sound controller
A000–A7FF   2 KiB   Video controller/text-mapped display RAM
C000–FFFF   16 KiB   ROM

Ben bu durumda "Video controller/text-mapped display RAM" de bulunan bir controllera birşey yazmak istersem. MOV mu kullanacağım? OUT mu?
Bu olay basit manada mikroişlemciler dersinde gösterilen, adres hattına adresi basip daha sonra veri hattına veri gönderme olayı gibi mi? Yani
A000–A7FF aralığında bir data girilirse adres yoluna, VGA kartının "Chip Enable" edilmesi sağlanıp, daha sonra data hattına veri basılarak VGA kartının basılan veriyi alması gibi bir mantıkta mı acaba? Aslında girilen adres RAM de bir adres ama verinin VGA ya yazılmasının sağlanması gibi mi?

z

#6
Şemayı görmeden birşey söylemek zor. Mevcut verilere göre mov kullanacaksın. Mov komutlar çok esnek olduğundan programlamada artistik işlemler yapabilirsin.

Ama I/O komutlarda böyle bir şansın yok dolayısı işe video rama mov tipi komutlarla erişim yapılacak şekilde tasarı yapmak mantıklıdır.

mesaj birleştirme:: 31 Mayıs 2016, 13:24:51

Olay hiç karmaşık değil.

Mov komutu işleme alındığında adres ve veri yola çıkar ardından Rd yada Wr sinyali aktif olur.

I/O komutunda ise komut işletildiğinde gene adres ve veri yola çıkar fakat bu kez Rd Wr sinyalleri değil IORd IOwr sinyalleri aktif olur.

Durum böyle olunca aynı adrese  hem ram hem de port bağlayabilirsin.

Video devrelerinde video rama aynen sistem ramına ulaşır gibi yazar okursun. Video devrelerindeki denetleyici MCU ile aynı ramı ortak kullanır. Günümüz ekran denetleyicilerinde bu iş nasıl yapılıyor bilmiyorum ama eskiden bir iki yolu vardı.

Ya işlemci ile 180 derece faz faklı clock ile CRT controller işletilirdi (bu her işlemci için geçerli değil) yada CRTC video rama ulaştığında  MCUda aynı rama erişmek isterse MCU'nun boş cycle işlemesine neden olan sinyal üretirdi.

Yani ekran denetleyici ekran ramında bir adresi okurken CPU da rama erişmek isterse su büyüğün ekmek küçüğün muahbbeti olurdu. Bu çakışma durumu basit bir lojikle algılanır ve işlemcinin Halt vs gibi bir pininden işlemcinin CRT denetleyicinin o anki ram erişimi bitinceye kadar oyalanması sağlanırdı.

Ancak bu tip yapılar ekranda karıncalanmalara falan da neden olduğundan bazı üçkağıtlara gidilirdi.

Örneğin. MCU rama kafasına esen bir zamanda erişmez dikey senkron palsi üretildiğinde ekrana ne yazacaksa topluca yazar böylece ekranın taranmadığı anda veri aktarımı gerçekleşirdi.

Yada video ramdan iki tane yapılır mcu birine yazar crtc diğerinden okur gene ekranın taranmadığı anlarda bunlar otomatik update edilirdi.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

diot

Alıntı yapılan: mir_as82 - 31 Mayıs 2016, 13:09:30
A sample system memory map:
Address range (hexadecimal)   Size   Device
0000–7FFF   32 KiB   RAM
8000–80FF   256 bytes   General-purpose I/O
9000–90FF   256 bytes   Sound controller
A000–A7FF   2 KiB   Video controller/text-mapped display RAM
C000–FFFF   16 KiB   ROM

Ben bu durumda "Video controller/text-mapped display RAM" de bulunan bir controllera birşey yazmak istersem. MOV mu kullanacağım? OUT mu?
Bu olay basit manada mikroişlemciler dersinde gösterilen, adres hattına adresi basip daha sonra veri hattına veri gönderme olayı gibi mi? Yani
A000–A7FF aralığında bir data girilirse adres yoluna, VGA kartının "Chip Enable" edilmesi sağlanıp, daha sonra data hattına veri basılarak VGA kartının basılan veriyi alması gibi bir mantıkta mı acaba? Aslında girilen adres RAM de bir adres ama verinin VGA ya yazılmasının sağlanması gibi mi?
sanırım 80x86 ailesi asm ye çalışıyorsun.  C000- ffff segmenti video  romudur. memory bölgesinde bulunur . a000 - a7ff de memory bölgesinde bulunur. Ekran kartı eğer text modunda çalışıyorsa bu adrese mov komutu ile attığın 8 bitlik veri oraya cıkacak olan karakterin  kodu oluyor .

çip enable disale ile falan uğraşmıyorsun.


mir_as82

Benim sorumda işte tam olarak bu. Ben ilgili adres bloğuna bir veri atınca, o verinin Nereye gideceği Nasıl belirleniyor ?aslında RAM ile adreslenmiş bir alana veri atıyorum, ama o veri tutup başka bir birime gidiyor. Bunun mantığını merak ettim

diot

örnek olarak IO veye memory mapped olayını anlamanız için en basit işlemci ve devresi z80 i incelemenizde fayda var. Mesela adres bus ta  geçerli olan adresi belirtmek için cpu nun /MREQ- /IORQ bacakları ve /RD, /wr bacakları kullanılır  /MREQ low ise adres busta memory adresi /IORQ low ise adres busta IO adresi vardır . Yani hangi ramı ve ya IO yu okuyup yazacaksan adres bus dan ve bu iki bacaktan aldığın bilgi ile /CS işareti üreteceksin.
İncelemen için :   http://www.z80.info/#BASICS_HARD_SCHEMA