Адрес пространства пользователя в 0xfff <something> - PullRequest
0 голосов
/ 08 ноября 2018

Я отлаживаю простую программу на GDB и вижу адреса локальных переменных внутри стекового фрейма, которые выглядят следующим образом: 0xffffbc10, 0xffffc340 и т. Д.

Насколько я понимаю, адреса пространства ядра занимают 0xffffffff до 0xcfffffff, а адреса пространства пользователя начинаются с 0xbfffffff.

Почему здесь расхождение?

Редактировать: обратите внимание, что я отключил рандомизацию виртуального адресного пространства, защитники стека и собираю с -m32. Вот моя команда компиляции, если она помогает:

gcc -m32 -z execstack -fno-stack-protector -ggdb -static test.c -o test

1 Ответ

0 голосов
/ 08 ноября 2018

Если вы запускаете 32-битную программу на 64-битном хосте (и 64-битном ядре), то все 32-битное адресное пространство обычно доступно приложению.В принципе это также возможно в 32-разрядном ядре, но Linux и (все?) Другие основные ядра резервируют часть виртуального адресного пространства, чтобы сделать переключение между режимом пользователя и режимом ядра более эффективным.

Предположение, что32-разрядная программа имеет только 3 ГБ виртуального адресного пространства, что недопустимо, но, поскольку некоторые устаревшие программы неверно принимают это, система «индивидуальности» Linux позволяет запускать их с эмуляцией этого поведения.Доступ к нему можно получить с помощью опции -3 команды setarch.

...