2012-05-24 4 views
4

Я хочу читать и писать из памяти процесса через /dev/mem.Чтение и запись процесса 'память через/dev/mem, текстовый сегмент работает, но сегмент данных не может, почему?

Первого, я получаю процесс карту памяти через модуль Linux ядра, кодируемый себя, выход, как это:

start_code_segment  4000000000000000 
end_code_segment  4000000000019c38 
start_data_segment  6000000000009c38 
end_data_segment  600000000000b21d 
start_brk    6000000000010000 
brk      6000000000034000 
start_stack    60000fffffde7b00 

Второй, я могу преобразовать виртуальный адрес (VA) для PA основательного модуль ядра Linux, например, я могу преобразовать VA:0x4000000000000008 в PA:0x100100c49f8008

Третий, функция read_phy_mem может получить данные из памяти в PA:0x100100c49f8008, код в финале.

Проблема: Моя проблема в том, когда я читаю text segment PA памяти, все в порядке, но если я читаю data segment PA памяти, *((long *)mapAddr) в линии 243 заставит систему идти вниз. Кроме того, я пробовал

memcpy(&data, (void *)mapAddr, sizeof(long)) 

но он все еще заставляет систему спускаться.

другая информация: мой компьютер IA64, ОС Linux 2.6.18, когда система не работает, я могу получить информацию о выходе с консоли, как это, тогда система перезапустится.

Entered OS MCA handler. PSP=20010000fff21320 cpu=0 monarch=1 
cpu 0, MCA occurred in user space, original stack not modified 
All OS MCA slaves have reached rendezvous 
MCA: global MCA 
mlogbuf_finish: printing switched to urgent mode, MCA/INIT might be dodgy or fail. 
Delaying for 5 seconds... 

код функции read_phy_mem

/* 
    * pa: physical address 
    * data: memory data in pa 
    * 
    * return int: success or failed 
    */ 
188 int read_phy_mem(unsigned long pa,long *data) 
189 { 
190  int memfd; 
191  int pageSize; 
192  int shift; 
193  int do_mlock; 
194  void volatile *mapStart; 
195  void volatile *mapAddr; 
196  unsigned long pa_base; 
197  unsigned long pa_offset; 
198 
199  memfd = open("/dev/mem", O_RDWR | O_SYNC); 
200  if(memfd == -1) 
201  { 
202   perror("Failed to open /dev/mem"); 
203   return FAIL; 
204  } 
205 
206  shift = 0; 
207  pageSize = PAGE_SIZE; //#define PAGE_SIZE 16384 
208  while(pageSize > 0) 
209  { 
210   pageSize = pageSize >> 1; 
211   shift ++; 
212  } 
213  shift --; 
214  pa_base = (pa >> shift) << shift; 
215  pa_offset = pa - pa_base; 
224  mapStart = (void volatile *)mmap(0, PAGE_SIZE, PROT_READ | PROT_WRITE,MAP_SHARED | MAP_LOCKED, memfd, pa_base); 
226  if(mapStart == MAP_FAILED) 
227  { 
228   perror("Failed to mmap /dev/mem"); 
229   close(memfd); 
230   return FAIL; 
231  } 
232  if(mlock((void *)mapStart, PAGE_SIZE) == -1) 
233  { 
234   perror("Failed to mlock mmaped space"); 
235   do_mlock = 0; 
236  } 
237  do_mlock = 1; 
238 
239  mapAddr = (void volatile *)((unsigned long)mapStart + pa_offset); 
243  printf("mapAddr %p %d\n", mapAddr, *((long *)mapAddr)); 
256  if(munmap((void *)mapStart, PAGE_SIZE) != 0) 
257  { 
258   perror("Failed to munmap /dev/mem"); 
259  } 
260  close(memfd); 
269  return OK; 
270 } 

Можно ли понять, почему сегмент текста работает хорошо, но сегмент данных не делает?

+0

Что называется MCA Handler, говорит, что что-то действительно неправильно. См. [Это] [1] и [это] [2]. Также есть документация ядра о [MCA на IA64] [3]. [1]: http://en.wikipedia.org/wiki/Machine_check_architecture [2]: http://en.wikipedia.org/wiki/Machine_Check_Exception [3]: HTTP: //www.kernel .org/Документация/Документация/ia64/mca.txt –

ответ

1

Я предполагаю, что это происходит потому, что раздел кода остается в памяти, пока процесс выполняется (если не DLL-код), в то время как раздел данных уходит в & непрерывно.
Попробуйте со стеклом-сегментом. И проверьте, работает ли она?
Напишите свою тестовую программу и динамически распределите память в КБ и сохраните эту память в цикле. Затем попробуйте с кодом прочитать сегменты памяти тестовой программы. Я думаю, это сработает.
Я сделал аналогичную работу в окнах, чтобы заменить адрес BIOS от IVT.
Должен быть пользователем root.