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.