Porty wejscia-wyjscia stanowia interfejs miedzy programem obslugi a fizycznym urzadzeniem. Sa to adresy z przestrzeni adresowej jadra, odpowiadajace specjalnym rejestrom sluzacym do sterowania praca urzadzen. Numery portow (od 0 do 65536) odpowiadajacych poszczegolnym urzadzeniom zaleza od konfiguracji sprzetu, tzn. nie mozna ich ustawic programowo. Sterownik urzadzenia musi podczas swej inicjalizacji "znalezc" (probe) porty odpowiadajace fizycznemu urzadzeniu ktore ma obslugiwac. W tym celu program obslugi przechodzi adresy portow, pod ktorymi spodziewa sie znalezc urzadzenie, zapisujac do nich kody polecen dla urzadzenia i oczekujac przez pewien czas na sensowna odpowiedz oznaczajaca, ze zostalo ono odnalezione.
Oczywiscie wpisywanie wartosci kontrolnych do portow zajetych juz przez inne urzadzenie spowodowaloby prawdopodobnie jego bledne dzialanie, istnieja wiec struktury danych pozwalajace na rezerwowanie obszarow portow wejscia-wyjscia. Rozpoczynajacy prace sterownik moze bezpiecznie poszukiwac swojego urzadzenia tylko w obszarach, ktore nie zostaly jeszcze zarezerwowane.
Zarezerwowany obszar (region) portow wejscia-wyjscia opisuje struktura resource_entry_t zdefiniowana w pliku kernel/resource.c
struct resource_entry_t { u_long from,num; const char *name; struct resource_entry_t *next; }
from
num
name
Struktury resource_entry_t zawarte sa w tablicy iotable o rozmiarze ograniczonym do IOTABLE_SIZE czyli 64 elementow, i polaczone w uporzadkowana liste iolist.
Funkcje dzialajace na liscie iolist (zdefiniowane w kernel/resource.c):
Liste zarezerwowanych obszarow portow wraz z nazwami urzadzen mozna obejrzec czytajac plik /proc/ioports.
Zarejestrowanie obszaru portow nie jest konieczne aby moc z nich korzystac. Przy wpisywaniu i odczytywaniu wartosci z portow, system nie sprawdza w zaden sposob, czy porty te sa zarezerwowane i przez jakie urzadzenie, i nie generuje wyjatku, ale oczywiscie wpisanie nieodpowiedniej wartosci do portu moze spowodowac blad w pracy korzystajacego z portu urzadzenia.
Istnieje niebezpieczenstwo, ze program obslugi, szczegolnie inicjalizowany podczas startu systemu, kiedy jest jeszcze duzo niezarejestrowanych urzadzen, pomyli jedno z nich z urzadzeniem ktorego szuka, dlatego kazdy sterownik powinien dawac uzytkownikowi mozliwosc okreslenia ktorych portow uzywa urzadzenie i w ten sposob unikniecia szukania
Do zapisywania i odczytywania wartosci do (i z) portow sluza funkcje inline zdefiniowane w pliku include/asm/io.h
Dostep do wszystkich 65536 portow mozna rowniez uzyskac za posrednictwem specjalnego pliku znakowego /dev/port - wykonujac na nim operacje lseek, read i write. Jest to oczywiscie sposob wolniejszy niz uzywanie wyzej opisanych funkcji.