GNU/Linux >> Linux Esercitazione >  >> Linux

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

Quali sono i diversi modi in cui posso scrivere nello spazio degli indirizzi del kernel dallo spazio utente?

Non sono sicuro che ci siano altri metodi, ma puoi accedere alla memoria fisica usando /dev/mem &chiamata di sistema mmap() .

/dev/mem è un file di dispositivo a caratteri che è un'immagine della memoria principale del computer. Può essere utilizzato, ad esempio, per esaminare (e persino correggere) il sistema. Gli indirizzi byte in mem vengono interpretati come indirizzi di memoria fisica.

altro su /dev/mem :http://linux.about.com/library/cmd/blcmdl4_mem.htm

altro su mmap() :http://linux.die.net/man/2/mmap

Puoi usare il mmap() per mappare una sezione di /dev/mem e utilizzare nel programma utente. Un breve esempio di codice:

#define MAPPED_SIZE //place the size here
#define DDR_RAM_PHYS  //place the physical address here

int _fdmem;
int *map = NULL;
const char memDevice[] = "/dev/mem";

/* open /dev/mem and error checking */
_fdmem = open( memDevice, O_RDWR | O_SYNC );

if (_fdmem < 0){
printf("Failed to open the /dev/mem !\n");
return 0;
}
else{
printf("open /dev/mem successfully !\n");
}

/* mmap() the opened /dev/mem */
map= (int *)(mmap(0,MAPPED_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,_fdmem,DDR_RAM_PHYS));

/* use 'map' pointer to access the mapped area! */
for (i=0,i<100;i++)
printf("content: 0x%x\n",*(map+i));

/* unmap the area & error checking */
if (munmap(map,MAPPED_SIZE)==-1){
perror("Error un-mmapping the file");
}

/* close the character device */
close(_fdmem);

Tuttavia, assicurati che l'area che stai mappando non sia utilizzata, ad esempio dal kernel, altrimenti il ​​tuo sistema si arresterà/si bloccherà e sarai costretto a riavviare utilizzando il pulsante di accensione dell'hardware.

Spero ti sia d'aiuto.


In che modo esattamente la memoria dell'utente e la memoria del kernel sono differenziate all'interno del kernel di Linux (in termini di sicurezza dello spazio del kernel)?

Non sono sicuro di aver capito la tua domanda.

Per il kernel non c'è molta differenza tecnicamente, è solo memoria. Come mai? Perché il kernel, che è in esecuzione nella modalità CPU più privilegiata, può accedere a tutta la memoria.

Quali sono i diversi modi in cui posso scrivere nello spazio degli indirizzi del kernel dallo spazio utente?

A meno che non ci sia una falla di sicurezza nel kernel o nei driver di dispositivo in modalità kernel, non puoi farlo, almeno non direttamente. Il kernel (o uno dei suoi driver) può, tuttavia, copiare i dati dalla memoria dell'applicazione in modalità utente alla memoria del kernel.

... c'è un modo per accedere a un indirizzo fisico presente nello spazio del kernel ed eseguire operazioni su di esso?

Stessa cosa, non dovresti essere in grado di accedere alla memoria utilizzando gli indirizzi fisici se è presente la traduzione dell'indirizzo da virtuale a fisico. Anche il kernel stesso non può evitare questa traduzione una volta abilitato. Deve creare mappature di indirizzi virtuali e fisici appropriati nelle tabelle delle pagine per accedere alla memoria in indirizzi fisici arbitrari.

A parte le chiamate di sistema, ci sono altri modi in cui posso scrivere nello spazio del kernel da un'applicazione utente?

Puoi anche forzare la CPU a passare al codice del kernel attivando un'eccezione (ad esempio divisione per 0, errore di pagina, errore di protezione generale, ecc.). Il kernel è il primo a gestire le eccezioni. Il kernel cambierà la sua memoria secondo necessità in risposta a un'eccezione. Potrebbe caricare dati da qualche parte (ad es. Disco) su un errore di pagina.


Linux
  1. Esecuzione di una funzione dello spazio utente dallo spazio del kernel

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

  3. stack del kernel e stack dello spazio utente

  4. Come trovare l'utilizzo della memoria dell'utente in Linux

  5. Come intrappolare l'accesso alla memoria non allineato?

Come costruire il kernel Linux da zero {Guida passo passo}

Come accedere alle partizioni Linux da Windows 10

Come costruire il kernel Linux da zero

Come rimuovere Swap Space da Centos 7.x?

Come posso impedire a un utente di copiare i file su un altro disco rigido?

Memoria condivisa:shmget non riesce:spazio esaurito sul dispositivo:come aumentare i limiti?