Pobieżny opis MMIO, PMIO, PIO, DMA, PCI

Wszystkie umieszczone w tytule skróty odnoszą się do sposoby komunikacji komputera z urządzeniami zewnętrznymi. Aby opisać wszystkie, potrzeba by książki na każdy. Nie to jest jednak przedmiotem tego artykułu, ja opiszę je tylko pobieżnie, po akapicie na każdy.

Programista może komunikować się z urządzeniami zewnętrznymi (nie na zewnątrz komputera, tylko wszystkie inne niż CPU, monitor i pamięć) na 2 sposoby. Pierwszy to za pomocą portów PMIO (Port Mapped I/O). Ten sposób opiera się na osobnej magistrali, która łączy urządzenia z CPU. W języku asembler, do obsługi tego rodzaju komunikacji wykorzystuje się polecenia IN oraz OUT. Zastosowanie tego rodzaju komunikacji polega na wystawieniu na wspomnianą magistralę pewnego numer (numeru portu) oraz danych, a urządzenie, któremu został przypisany dany numer portu, odbiera te dane. Te rozwiązanie jest uważane za przestarzałe.

Innym sposobem na komunikowanie się z urządzeniami zewnętrznymi są porty MMIO (Memory Mapped I/O). Polega to na tym, że urządzenia zewnętrzne podłączone są do magistrali pamięci RAM i niejako podglądają konkretne komórki w tej pamięci (lub zapisują do nich). Jeżeli chcemy coś wysłać do takiego urządzenia, zapisujemy coś pod konkretne komórki pamięci, a urządzenie już samo sobie odczyta stamtąd dane. Jest to obecnie szeroko stosowane rozwiązanie.

W uproszczeniu można przyjąć, że analogicznymi do powyższych, ale z perspektywy urządzeń są metody wymiany danych PIO i DMA. PIO (Programmed Input Output) to sposób wymiany danych między urządzeniem, a komputerem, gdzie cały proces jest nadzorowany przez CPU. DMA (Direct Memory Access) to sytuacja, gdy urządzenie może bezpośrednio, bez udziału CPU, zapisywać i odczytywać dane z pamięci RAM.

Nie można jednak powiedzieć, że PMIO to to samo, co PIO, a MMIO to DMA. Jest tak dlatego, że np. OS może umożliwiać komunikację z urządzeniami pracującymi w trybie PIO za pomocą portów MMIO. Jednak w uproszczeniu można przyjąć, że powyższe są swoimi analogami.

PCI to jedna z magistral danych (obok AGP, PCI-Express, SCSI etc.) łącząca urządzenia zewnętrzne z płytą główną. Zastąpiła ona przestarzałą magistralę ISA. Wspominam tu o PCI, gdyż pracując na niej urządzenie może samo wybrać, czy chce pracować z portami MMIO, czy PMIO. Odbywa się to za pomocą specjalnych struktur informacyjnych nazywanych BAR (Base Address Registers). Innymi cechami tej magistrali to to, że urządzenie podaje tylko rozmiar buforu, jaki chce używać do komunikacji, a BIOS (ewentualnie OS) może sam zdecydować pod jakimi komórkami pamięci umieści porty MMIO dla tego urządzenia lub pod jakimi numerami portów będzie odbywać się komunikacji poprzez PMIO.