Një paisje I/O në përgjithësi konsiston në dy pjesë : një controller dhe vetë paisja. Kontrolleri është një chip ose një bashkësi chipesh që kontrollojnë fizikisht paisjen. Ai pranon komanda nga sistemi i shfrytëzimit dhe i realizon këto komanda.
Në shumë raste kontrolli i paisjes është shumë i ndërlikuar, kështu që puna e kontrollerit është të paraqesë një ndërfaqe të thjeshtë për sistemin e shfrytëzimit.
Pjesa tjetër është vete paisja, e cila ka një ndërfaqe të thjeshtë sepse ato nuk kanë një detyrë të ndërlikuar. Këto paisje duhet të jenë standarte, psh çdo disk kontroller IDE mund të trajtojë çdo disk IDE ( IDE është shkurtim i Integrated Drive Electronics dhe është tipi standart i diskut në proçesorët pentium dhe në disa lloje të tjerë proçesorësh). Përderisa ndërfaqja e paisjes fshihet pas kontrollerit, gjithçka që sheh sistemi i shfrytëzimit është ndërfaqja e kontrollerit e cila mund të jetë krejt ndryshe nga ndërfaqja e nga ndërfaqja e paisjes.
Duke qenë se secili tip i kontrollerit është i ndryshëm, software të ndryshëm nevojiten për të kontrolluar secilin nga këto tipe kontrollerash. Software-i që i ndërvepron me kontrollerin quhet një device driver. Secili kontroller mbështet një driver për çdo sistem shfrytëzimi që suporton, psh një scanner paiset me driverat e Windows 98, Windows 2000 dhe Unix .
Një driver, që të përdoret, duhet të vendoset në sistemin e shfrytëzimit dhe të ekzekutohet në kernel mode. Teorikisht një driver mund të ekzekutohet dhe jashtë kernel-it, por kjo kërkon mundësinë që një driver nga user mode të aksesojë një paisje në mënyrë të kontrolluar. Ekzistojnë tre mënyra që një driver mund të vendoset në kernel. Mënyra e parë është të rilidhet kernel me driver-in e ri dhe më pas të bëhet një boot-im të ri sistemit. Shumë sisteme në Unix funksionojnë në këtë mënyrë. Mënyra e dytë është të ndërhyhet në skedarët e sistemit të shfrytëzimit duke i treguar që ka nevojë për një driver të ri dhe më pas të bëjë një boot-im sistemit. Në momentin e boot-imit, sistemi i shfrytëzimit gjen driverin e kërkuar dhe e ngarkon atë. Në këtë mënyrë funksionon Windows. Mënyra e tretë është e tillë që sistemi i shfrytëzimit ndërkohë që është në ekzekutim është i aftë të pranojë driver-at e rinj dhe t’i instalojë ata pa pasë nevojë të bëjë një boot-im të ri. Kjo mënyrë po përhapet më shpejt. Paisje të tilla si Usb dhe paisjet IEEE 1394 ngarkohen në këtë mënyrë.
Çdo kontroller ka një sasi regjistrash që përdoren për të komunikuar me to. Për të aktivizuar një kontroller, driver-i merr një komandë nga sistemi i shfrytëzimit dhe e përkthen atë në vlera që do shkruhen në regjistrat e paisjeve.
Inputi dhe outputi mund të realizohen në tre mënyra të ndryshme. Në mënyrën më të thjeshtë, një program kryen një sistem call, të cilën kernel-i e përkthen në një thirrje proçedure për një driver të caktuar. Më pas driver-i nis proçesin e I/O dhe kryen një cikël që zgjat për aq kohë sa duhet të realizohet proçesi I/O. Kur ky proçes ka mbaruar, driver-i vendos të dhënat që duhet dhe sistemi i shfrytëzimit i kalon kontrollin programin që kreu këtë sistem call. Kjo mënyrë quhet dhe busy waiting dhe ka disavantazhin që bllokon CPU-në derisa të mbarojë punë paisja.
Metoda e dytë është e tillë që një driver nis punën e paisjes dhe kërkon për një interrupt kur paisja të mbarojë punën. Në këtë moment sistemi i shfrytëzimit bllokon programin dhe kryen ndonjë pune tjetër. Kur kontrolleri sheh që puna e paisjes ka kryer, atëherë ai jep një interrupt për të treguar realizimin e punës.