Эта простая программа создает поток, который имеет массив в качестве локальной переменной (в своем стеке):
Код: Выделить всё
#include
int main()
{
std::thread thread{[=]() {
int test[128];
for (int i = 0; i < 128; i++)
{
test[i] = i;
}
while (true)
{
}
}};
thread.join();
return 0;
}
Теперь я проверяю файл pmap процесса, чтобы найти память стека с помощью cat /proc/
/pmap | grep -я складываю. Результат:
Код: Выделить всё
0x0000001a85a94000,0x0000000000080000,0x00081002,0x03,0x0f,0x00000001,0x0000000000000003,0x0000000000000000,0x0000000000080000,0x00001000,0x00000000,0x0000092d,{stack},{sysram}
0x0000001a85b16000,0x0000000000040000,0x00081002,0x03,0x0f,0x00000001,0x0000000000000003,0x0000000000000000,0x0000000000040000,0x00001000,0x00000000,0x0000092d,{stack},{sysram}
Когда я делаю x/1000xw 0x0000001a85b16000 в GDB (
Код: Выделить всё
0x0000001a85b16000Код: Выделить всё
0x00000000). Я смотрю не в том месте? Каков виртуальный адрес стека на иллюстрации структуры памяти:
[img]https://i.sstatic.net/1Tf4lE3L.png[/img]
Это [b]красная[/b] стрелка (верхняя часть стека), [b]зеленая[/b] стрелка (верхняя часть) защитная страница стека) или [b]фиолетовая[/b] стрелка (нижняя часть защитной страницы стека)?
Если я предполагаю, что виртуальный адрес из файла pmapКод: Выделить всё
0x0000001a85b16000 + 0x0000000000040000 - 0x00001000 = 0x1a85b55000
Код: Выделить всё
...
0x1a85b55630: 0x00000000 0x00000000 0x00000000 0x00000000
0x1a85b55640: 0x00000000 0x00000000 0x00000000 0x00000000
0x1a85b55650: 0x00000000 0x00000000 0x00000000 0x00000000
0x1a85b55660: 0x00000000 0x00000000 0x00000000 0x00000000
0x1a85b55670: 0x00000000 0x00000000 0x00000000 0x00000000
0x1a85b55680: 0x00000000 0x00000000 0x00000000 0x00000000
0x1a85b55690: 0x00000000 0x00000000 0x00000000 0x00000000
0x1a85b556a0: 0x00000000 0x00000000 0x00000000 0x00000000
0x1a85b556b0: 0x00000000 0x00000000 0xc7ccd180 0x0000005a
0x1a85b556c0: 0x00000000 0x00000080 0x00000000 0x00000001
0x1a85b556d0: 0x00000002 0x00000003 0x00000004 0x00000005
--Type for more, q to quit, c to continue without paging--
0x1a85b556e0: 0x00000006 0x00000007 0x00000008 0x00000009
0x1a85b556f0: 0x0000000a 0x0000000b 0x0000000c 0x0000000d
0x1a85b55700: 0x0000000e 0x0000000f 0x00000010 0x00000011
0x1a85b55710: 0x00000012 0x00000013 0x00000014 0x00000015
0x1a85b55720: 0x00000016 0x00000017 0x00000018 0x00000019
0x1a85b55730: 0x0000001a 0x0000001b 0x0000001c 0x0000001d
0x1a85b55740: 0x0000001e 0x0000001f 0x00000020 0x00000021
0x1a85b55750: 0x00000022 0x00000023 0x00000024 0x00000025
0x1a85b55760: 0x00000026 0x00000027 0x00000028 0x00000029
0x1a85b55770: 0x0000002a 0x0000002b 0x0000002c 0x0000002d
0x1a85b55780: 0x0000002e 0x0000002f 0x00000030 0x00000031
...
Подробнее здесь: https://stackoverflow.com/questions/798 ... s-on-arm64
Мобильная версия