GNU/Linux >> Linux Esercitazione >  >> Linux

È possibile accedere all'hardware direttamente dallo spazio utente?

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.


Linux
  1. Come accedere (se possibile) allo spazio del kernel dallo spazio utente?

  2. Come accedere agli indirizzi fisici dallo spazio utente in Linux?

  3. stack del kernel e stack dello spazio utente

  4. Rimuovi gli spazi bianchi dai nomi dei file in Linux

  5. Impossibile su all'utente jenkins dopo aver installato Jenkins

La mia storia su Linux:da utente Linux a collaboratore

Come rimuovere Swap Space da Centos 7.x?

Come impedire a un processo di scrivere file

Come posso evitare che il mio driver wifi diventi catatonico?

Posso rilevare le informazioni RAID hardware dall'interno di Linux?

Cosa si può imparare su un utente da un tentativo SSH fallito?