Я использую плату разработки (snowball) с процессором ARM cortex_A9_MPCORE, работающим под Linux с ядром 3.0.8+. Я использую GDB и openocd для отладки.ARM linux: адресное пространство процесса
Я ищу способ найти адресное пространство процесса пользовательского режима, особенно текстовый сегмент и стек пользовательского режима.
первый я смотрел в/Proc/«PID»/карты, например, я получаю этот выход для одного из запущенных процессов:
# cat /proc/1124/maps
00008000-000d5000 r-xp 00000000 b3:02 181 /system/bin/lbsd
000d5000-000f8000 rw-p 000cd000 b3:02 181 /system/bin/lbsd
000f8000-0014a000 rw-p 00000000 00:00 0 [heap]
0014a000-0014c000 rw-p 00000000 00:00 0 [heap]
.
.
.
b0001000-b0009000 r-xp 00001000 b3:02 183 /system/bin/linker
b0009000-b000a000 rw-p 00009000 b3:02 183 /system/bin/linker
b000a000-b0015000 rw-p 00000000 00:00 0
bea00000-bea21000 rw-p 00000000 00:00 0 [stack]
ffff0000-ffff1000 r-xp 00000000 00:00 0 [vectors]
Затем с помощью GDB я написал скрипт, который разбирает список задач, запущенных на плате, начиная с init_task, для каждой задачи он получает значение mm_struct, найденное в task_struct, затем извлекает значения start_code, end_code и start_stack. Наконец, скрипт анализирует различные области памяти, на которые указывает mmap. Скрипт запускается в то время как плата в состояние отладки, оба ядра на Cortex A9 приостанавливаются
Вот выход из сценариев GDB для того же процесса, как описано выше:
taskaddr 0xdf29f140
Name: lbsd
mm start text 8000
mm end text d4ba4
mm start stack bee63df0
####MEMORY REGIONS#####
vm_start 0x8000
vm_end 0xd5000
vm_flags 0x8001875
-----------------------
vm_start 0xd5000
vm_end 0xf8000
vm_flags 0x8101873
-----------------------
vm_start 0xf8000
vm_end 0x14a000
vm_flags 0x100073
-----------------------
vm_start 0x14a000
vm_end 0x14c000
vm_flags 0x100073
-----------------------
.
.
.
-----------------------
vm_start 0xb0001000
vm_end 0xb0009000
vm_flags 0x8000875
-----------------------
vm_start 0xb0009000
vm_end 0xb000a000
vm_flags 0x8100873
-----------------------
vm_start 0xb000a000
vm_end 0xb0015000
vm_flags 0x100073
-----------------------
vm_start 0xbee42000
vm_end 0xbee64000
vm_flags 0x100173
-----------------------
vm_start 0xffff0000
vm_end 0xffff1000
vm_flags 0x40c0055
-----------------------
Области памяти совпадают как для используемого метода, за исключением стека, на выходе метода/proc он начинается с bea00000, тогда как в поле start_stack в mm_struct он равен bee63df0, а область памяти, на которую указывает vm_struct, указывает bee42000. Может ли кто-нибудь объяснить разницу в этих значениях?
Мой второй вопрос касается значений первой области памяти между 00008000 и 000d5000, которая соответствует текстовому разделу процесса. Я заметил, что многие процессы разделяют эти адреса. Как ядро удается получить реальный адрес области текстовой памяти?