對於我的學士論文,我希望可視化內存的數據剩餘量以及在重新引導系統後它如何持續存在。如何使用C獲取特定的內存地址C
我有一個簡單的想法將一張照片mmap到內存,關閉我的電腦,等待x秒鐘,啓動電腦,看看照片是否仍然存在。
int mmap_lena(void) { FILE *fd = NULL; size_t lena_size; void *addr = NULL; fd = fopen("lena.png", "r"); fseek(fd, 0, SEEK_END); lena_size = ftell(fd); addr = mmap((void *) 0x12345678, (size_t) lena_size, (int) PROT_READ, (int) MAP_SHARED, (int) fileno(fd), (off_t) 0); fprintf(stdout, "Addr = %p\n", addr); munmap((void *) addr, (size_t) lena_size); fclose(fd); fclose(fd_log); return EXIT_SUCCESS; }
我忽略了檢查返回值的緣故。
所以在mmap後,我試圖以某種方式獲取地址,但通常最終會出現分段錯誤,因爲我瞭解內存受操作系統保護。
int fetch_lena(void) { FILE *fd = NULL; FILE *fd_out = NULL; size_t lenna_size; FILE *addr = (FILE *) 0x12346000; fd = fopen("lena.png", "r"); fd_out = fopen("lena_out.png", "rw"); fseek(fd, 0, SEEK_END); lenna_size = ftell(fd); // Segfault fwrite((FILE *) addr, (size_t) 1, (size_t) lenna_size, (FILE *) fd_out); fclose(fd); fclose(fd_out); return 0; }
還請注意,我硬編碼的不會忽略在這個例子中,所以只要您運行mmap_lena我在fetch_lena使用該值可以作爲操作系統採用的第一個參數只是針對mmap作爲一個提示是錯誤的(上我的系統總是默認爲0x12346000)。
如果有任何微不足道的編碼錯誤,我很抱歉,因爲我的C技能還沒有完全開發。
我想現在如果有任何方法可以獲得我想要的數據而不實現任何malloc掛鉤或內存分配器黑客。
由於提前, 大衛你有
首先,一個標準的Linux進程無法訪問原始(物理)內存,因此您可以輕鬆地從進程中查看給定的物理內存地址(查看MMU,虛擬內存)。此外,Linux內核在將內存交給進程之前將內存清零(如在memset 0中)。 – ysdx 2015-09-30 11:14:05