2015-08-03 2 views
0

Я новичок в C, и я хотел бы, чтобы прочитать содержимое из диапазона адреса памятиКак цикл и прочитать содержимое из диапазона адреса памяти

Предположим, что у меня есть следующий спектр адрес: 0x00065580 - 0x000655c0

этого диапазона получить от команды:

$ cat /proc/a_process_pid/maps | grep heap 
00065580-000655c0 ...........heap 

(Пожалуйста, смотрите изображение ричного сверху диапазона)

enter image description here

Я попытался с помощью цикла, но не везет, (так же, как думать о разработчика Java)

#include <stdio.h> 
#define START_ADDR 0x00065580 
#define END_ADDR 0x000655c0 
int main(){ 
    char *start = START_ADDR ; 
    char *end = END_ADDR; 
    for(char *i=start ; i <= end ; i++){ 
     printf("%s",i); 
    } 
    return 0; 
} 

Он генерирует сообщение об ошибке:

[email protected]:~# ./test 
Segmentation fault (core dumped) 

Пожалуйста, скажите мне, что я не прав и что мне нужно узнать?

+0

Проверяет ли имя вашего файла исходного кода? Возможно, вы компилируете свой исполняемый файл, –

+0

Извините, я запускаю программу неправильно, я редактирую ошибку, просто простую «Ошибка сегментации (сбрасывание ядра)» – Ryo

+0

'printf («% s », * i);' it it ? – coderredoc

ответ

2

Современные операционные системы используют virtual memory: адреса памяти, которые процесс видит, отличаются от физических адресов, и программы обычно не могут касаться памяти, принадлежащей другому процессу. Кажется, вы смотрите на дамп памяти из одного конкретного процесса, но адрес 0x00065580 действительно соответствует другому физическому адресу, например. 0x0. И внутри вашей собственной программы адрес 0x00065580 будет соответствовать другому физическому адресу, например. 0x00589263. Операционная система гарантирует, что ни один из физических адресов, которые используются другой программой, не будет доступен из ваших.

Если ваш процесс запущен с правами администратора, вы можете use system calls to indirectly access other processes' memory.

+0

Спасибо Aasmund, я знаю, что программа использует виртуальную память, я просто хочу ее прочитать. Может я прочитал из виртуальной памяти? – Ryo

+0

Возможно, короткая история изменений из ** реального режима ** вычисление в ** защищенный режим ** вычисления помогут укрепить понимание. –

+0

@ Ryo: Дело в том, что процесс (запущенная программа) может читать только из виртуальной памяти _its own_, а не из другой виртуальной памяти процесса. И операционная система не позволит вашему процессу получить доступ к физической памяти, к которой сопоставляется другая виртуальная память процесса (если только ваши процессы не запрашивают общую память). –

-1

Ниже приведена программа на C++, которая проливает свет на то, как печатать адреса (или данные) для определенных мест памяти.

#include<iostream> 
using namespace std; 
int main() 
{ 
    int* arr = new int[10]; 
    int *start = NULL; 
    int *end = NULL; 

    for(int i=0;i<10;i++) 
     arr[i] = i+1; 
    start = arr; 
    end = &arr[9]; 
    for(int *start=arr;start<end;start++) 
     cout<<" "<<start; 
    cout<<endl; 
    system("PAUSE"); 
    return 0; 
} 

Я не вижу никаких проблем в вашем вставленном коде. Но проблема заключается в START и END, т. Е. О местоположении адресов, которые вы используете в своей программе. Эти местоположения не содержат никакой достоверной памяти для этого процесса, поэтому вы решительно просите прочитать данные из некоторого места для нежелательной памяти, в результате чего SEGFAULT. Надеюсь это поможет.

+0

Есть два вопроса с вашим ответом: во-первых, это код C++, а OP отмечен C, а не C++. Во-вторых: действительно есть проблема с кодом OP: он пытается напечатать содержимое указателя, как если бы это была строка. –

+0

Это означает, что я могу читать только адрес памяти, используя мою программу, и не могу получить доступ к памяти другого процесса? – Ryo

+0

@Ryo Ваша программа будет работать в пользовательском режиме, и определенно вы не сможете получить доступ к памяти какого-либо другого процесса. Предел доступа к памяти для процесса - это собственная выделенная память. Вы можете получить доступ к определенной памяти, если уверены, что это действительный адрес памяти для вашего процесса. unsigned int * ptr = (unsigned int *) 0xffef8016, я повторяю, что возможно, если 0xffef8016 является допустимым адресом памяти для вашего процесса. – instance

Смежные вопросы