Razlika između memorijskog i I/O adresnog prostora
Intel arhitektura 32 (nadalje IA32) razlikuje dva potpuno nezavisna adresna prostora. Adresni prostor je skup adresa kojima se nečemu može pristupiti.
I/O adresni prostor je 16-bitni na IA32, dok je memorijski adresni prostor 32-bitni.
Pristup I/O adresnom prostoru se vrši preko naredbi procesora IN i OUT, dok se pristup memorijskom prostoru vrši preko većeg broja naredbi (prve mi padaju na pamet LEA, MOV, ...).
Ograničavanje pristupa I/O i memorijskom adresnom prostoru se vrši na nivou TSS-a, ali na drugačije načine. I/O pristup se odobrava ili zabranjuje pomoću
bitmape dozvoljenih portova, čija se adresa čuva u jednom polju TSS-a, dok se pristup memoriji kontroliše pomoću segmentiranja i/ili straničenja za pojedinačni proces (pomoću LDT/Local Descriptor Table, ili PDT/Page Directory Table).
U suštini, I/O i memorijski adresni prostor su veoma slični, ali koriste razne mehanizme za iste stvari.
Takođe, neki operativni sistemi (kao npr. ranije Linux, nisam siguran za najnovija izdanja), pojednostavljuju upravljanje I/O permission mapom tako što je smeštaju uz sam TSS, i to sve u jednu stranicu od 4kb, pa nije moguće dozvoliti pristup I/O portovima većim od 0xe00, pošto je TSS inače oko 512 bajtova, nisam tačno siguran.
Međutim, za konkretni problem (tastatura, čini mi se port 0x60, mada to onako napamet, kao i sve ostalo), ovo ne može biti uzrok.
Sam problem
Prvo, pominješ da pišeš drajvere, međutim, sve veoma izgleda kao da pišeš korisnički program, pošto drajveri mogu (i najčešće moraju) da rade u ring0, a tada imaju maksimalna ovlašćenja. Zbog toga, ako želiš, možeš i sam da popuniš I/O mapu čime želiš, ali onda prvo iščitaj TSS i iz njega adresu I/O mape (ili već pronađi neku API funkciju koja direktno menja I/O mapu, npr. io_enable(0x60);).
Ovde bih ja mogao da pomognem u načelu, ali Intelova dokumentacija će sigurno biti od mnogo veće pomoći.
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.