Apa saja cara berbeda yang bisa saya tulis di ruang alamat kernel dari ruang pengguna?
Saya tidak yakin apakah ada metode lain, tetapi Anda dapat mengakses memori fisik menggunakan /dev/mem
&panggilan sistem mmap()
.
/dev/mem adalah file perangkat karakter yang merupakan gambar dari memori utama komputer. Mungkin digunakan, misalnya, untuk memeriksa (dan bahkan menambal) sistem. Alamat byte di mem ditafsirkan sebagai alamat memori fisik.
selengkapnya di /dev/mem
:http://linux.about.com/library/cmd/blcmdl4_mem.htm
selengkapnya di mmap()
:http://linux.die.net/man/2/mmap
Anda dapat menggunakan mmap()
untuk memetakan bagian dari /dev/mem
dan gunakan dalam program pengguna Anda. Kode contoh singkat:
#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);
Namun, pastikan area yang Anda petakan tidak digunakan, misalnya oleh kernel, atau itu akan membuat sistem Anda crash/hang, dan Anda akan dipaksa untuk reboot menggunakan tombol daya perangkat keras.
Semoga membantu.
Bagaimana tepatnya memori pengguna dan memori kernel dibedakan di dalam kernel Linux (dalam hal memberi keamanan pada ruang kernel)?
Tidak yakin apakah saya memahami pertanyaan Anda.
Untuk kernel tidak ada banyak perbedaan secara teknis, itu hanya memori. Mengapa? Karena kernel, yang berjalan dalam mode CPU paling istimewa, dapat mengakses semua memori.
Apa saja cara berbeda yang bisa saya tulis di ruang alamat kernel dari ruang pengguna?
Kecuali jika ada lubang keamanan pada kernel atau driver perangkat mode kernel, Anda tidak dapat melakukannya, setidaknya tidak secara langsung. Namun, kernel (atau salah satu drivernya) dapat menyalin data dari memori aplikasi mode pengguna ke memori kernel.
... adakah cara agar kami dapat mengakses alamat fisik yang ada di ruang kernel dan melakukan operasi di dalamnya?
Hal yang sama, Anda seharusnya tidak dapat mengakses memori menggunakan alamat fisik jika ada terjemahan alamat virtual ke fisik. Bahkan kernel itu sendiri tidak dapat menghindari terjemahan ini setelah diaktifkan. Itu harus membuat pemetaan alamat virtual ke fisik yang sesuai di tabel halaman untuk mengakses memori di alamat fisik arbitrer.
Selain panggilan sistem, apakah ada cara lain untuk menulis ke ruang kernel dari aplikasi pengguna?
Anda juga dapat memaksa CPU untuk beralih ke kode kernel dengan memicu pengecualian (misalnya pembagian dengan 0, kesalahan halaman, kesalahan perlindungan umum, dll). Kernel adalah yang pertama menangani pengecualian. Kernel akan mengubah memorinya sesuai kebutuhan sebagai respons terhadap pengecualian. Mungkin memuat data dari suatu tempat (misalnya disk) pada kesalahan halaman.