Jaké jsou různé způsoby, jak mohu zapisovat do adresového prostoru jádra z uživatelského prostoru?
Nejsem si jistý, zda existují jiné metody, ale můžete přistupovat k fyzické paměti pomocí /dev/mem
&systémové volání mmap()
.
/dev/mem je soubor znakového zařízení, který je obrazem hlavní paměti počítače. Může být použit například ke zkoumání (a dokonce i opravě) systému. Bytové adresy v mem jsou interpretovány jako adresy fyzické paměti.
více na /dev/mem
:http://linux.about.com/library/cmd/blcmdl4_mem.htm
více na mmap()
:http://linux.die.net/man/2/mmap
Můžete použít mmap()
k mapování úseku /dev/mem
a použít ve svém uživatelském programu. Krátký příklad kódu:
#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);
Ujistěte se však, že oblast, kterou mapujete, není používána, například jádrem, jinak to způsobí pád/zaseknutí vašeho systému a budete nuceni restartovat pomocí hardwarového vypínače.
Doufám, že to pomůže.
Jak přesně se liší uživatelská paměť a paměť jádra uvnitř jádra Linuxu (z hlediska zabezpečení prostoru jádra)?
Nejsem si jistý, jestli jsem pochopil vaši otázku.
Mezi jádrem není technicky velký rozdíl, je to jen paměť. Proč? Protože jádro, které běží v nejprivilegovanějším režimu CPU, má přístup k celé paměti.
Jaké jsou různé způsoby, jak mohu zapisovat do adresového prostoru jádra z uživatelského prostoru?
Pokud není v jádře nebo ovladačích zařízení v režimu jádra bezpečnostní díra, nemůžete to udělat, alespoň ne přímo. Jádro (nebo jeden z jeho ovladačů) však může kopírovat data z paměti aplikace uživatelského režimu do paměti jádra.
... existuje nějaký způsob, jak získat přístup k fyzické adrese, která je přítomná v prostoru jádra, a provádět na ní operace?
Stejně tak byste neměli mít přístup k paměti pomocí fyzických adres, pokud existuje překlad virtuální adresy na fyzickou. Dokonce ani jádro samotné se tomuto překladu nemůže vyhnout, jakmile je povoleno. Musí vytvořit vhodná mapování virtuální adresy na fyzickou adresu v tabulkách stránek pro přístup k paměti na libovolných fyzických adresách.
Kromě systémových volání existují nějaké další způsoby, jak mohu zapisovat do jádra prostor z uživatelské aplikace?
Můžete také vynutit přepnutí CPU na kód jádra spuštěním výjimky (např. dělení 0, chyba stránky, chyba obecné ochrany atd.). Jádro je první, které zpracovává výjimky. Jádro změní svou paměť podle potřeby v reakci na výjimku. Může načíst data odněkud (např. z disku) při chybě stránky.