Я хочу читать и писать из памяти процесса через /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 }
Можно ли понять, почему сегмент текста работает хорошо, но сегмент данных не делает?
Что называется 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 –