Sì, ma è raramente utile. Sui sistemi x86 a 32 bit, puoi usare ioperm(2)
chiamata di sistema per impostare il processo corrente per consentirgli di eseguire direttamente l'I/O della porta. Credo che questo non funzioni su sistemi a 64 bit. Puoi anche fare lseek/read/write
combinazioni contro /dev/port
e penso che anche questo non sia molto portatile. Vedere http://tldp.org/HOWTO/IO-Port-Programming-2.html per ulteriori dettagli. Entrambi questi approcci sono ovviamente molto più lenti e meno flessibili rispetto alla scrittura di un driver di dispositivo (/dev/port
più lento di tutti). Nessuno di questi meccanismi dello spazio utente ti consente di gestire interruzioni o qualcosa del genere, ovviamente. Se le prestazioni sono un problema, finirai per scrivere un driver di dispositivo.
La tua ipotesi è corretta. Il kernel è l'unico software in grado di inviare richieste hardware. Questo non vale solo per Linux. Praticamente nessun sistema operativo più recente di DOS ti consente di accedere direttamente all'hardware perché, come sospetti anche tu, è abbastanza pericoloso.
Tuttavia, non ci sono problemi nello scrivere il proprio driver ed è disponibile molta documentazione. Ad esempio, questo tutorial su xatlantis sembra una fonte recente (importante!) e buona.