Pozor - ioperm() funguje jen pro porty z rozsahu ISA sbernice, tj. 0 ax 0x3ff (za to Linux nemuze, tak si to vymysleli v Intelu). Pokud je paralelni port na PCI karte, bude mit nejsips uplne jinou adresu (treba u mne je to 0xc800, zjistuju ho v /proc/bus/pci/devices) a je nutne namisto toho pouzit iopl(), ktere povoli pristup na vsechny I/O porty. Viz http://linux.die.net/man/2/iopl a http://linux.die.net/man/2/ioperm .
A kdysi byly paralelni porty i na "grafickych" kartach MDA a pozdeji na Herculesech, ty meli defaultni adresu 0x3bc, takze se s normalnim portem na I/O kartach (typicky na 0x378 nebo 0x278) nijak neovlivnovaly. A vetsinou mnohem vic vydrzeli ...
pozor, jedna se o porty MENSI nez 0x400, ne vetsi
krome toho to neni ani vina Intelu, ani vina IBM, je to skutecne vina Linuxu, protoze v dobe kdy se navrhoval, porty nad 0x3ff se skutecne skoro nevyskytovaly (diky IBM). Vzhledem k tomu, ze ram bylo v te dobe nedostatek a kazdy process musi zdedit bitmapu povolenych portu, zvolila se velikost teto bitmapy podle v te dobe pouzitelnych portu.
Kazda bitmapa povolenych portu zabirala 128 bytes pro 0x400 portu, kdezto pro 64Ki portu by zabirala 8KiB. Je to pomerne velky rozdil. Dnes uz samozrejme neni 1 mega zadna mira, ale tento rozsah zustal z historickych duvodu stejny.
Ono to hlavně nejde zvětšit proto, že změnění adresy této portové bitmapy je velmi pomalé (nahrátí nového TSS), přepnutí pomocí stránkování se autorům Linuxu nechce dělat a tak těch 128 bytů kopírují tam a zpátky při přepnutí procesu. A kdyby místo toho kopírovali 8Kb při každém přepnutí procesu, tak by to zpomalovalo.