Comments 7
Скорее всего, требует исправления перевод:
Оригинал:
Каждая система в настоящее время организована с таким макетом памяти как “код — стек — куча”, и это расстраивает.
Оригинал:
Every system nowadays is organized with a code-stack-heap memory layout like this, in its deepnesses.
Хмм… Не похоже ли на эту статью?
Видеодаптеры с отображением в основную память, на +тех+ майнфреймах, которые весили несколько тонн? php никогда не избавится от SIGSEGV.
Очень хорошая статья. А пример на Линукс и правда очень хорошо подходит.
Можно увидеть ещё больше информации о запущенном процессе с помощью ключа -ХХ:
Кроме того стоит обратить внимание на такое явление. Для одной и той же программы из статьи пытался определить адрес стека. С помощью pmap получил такой результат:
В коде же результат немного другой:
Помню, в университете рассказывали, что регистр ebp (В 64бит ОС он называется rbp) как-то связан со стеком… Можно попробовать модифицировать немного код:
Тогда результаты будут такие:
При этом pmap показывает, что наиболее близкие адреса сегментов это:
Можно увидеть ещё больше информации о запущенном процессе с помощью ключа -ХХ:
pmap -XX 1937 > ~/Testprj/processinfo.txt
Кроме того стоит обратить внимание на такое явление. Для одной и той же программы из статьи пытался определить адрес стека. С помощью pmap получил такой результат:
00007fffbd6a0000 132 12 12 rw--- [ stack ]
В коде же результат немного другой:
Stack is at 0x7fffbd6be99c
Помню, в университете рассказывали, что регистр ebp (В 64бит ОС он называется rbp) как-то связан со стеком… Можно попробовать модифицировать немного код:
#include <cstdio>
#include <stdint.h>
int main() {
int i=3;
int* someptr = new int(l);
printf ("==Exploring system addressing stuff==\n");
printf("Code is at %p \n", (void*)main);
printf("Stack is at %p \n", (void*)&i);
printf("Heap is at %p \n", someptr);
uint64 t basepointer64 = 0;
//source first, dest last, move 64 bit from rbp to value
__asm__ __volatile__("movq %%rbp, %0":"=r"(basepointer64));
printf("RBP is at: %0lx \n", basepointer64);
delete someptr;
getchar();
return 0;
}
Тогда результаты будут такие:
==Exploring system addressing stuff==
Code is at 0x557f7fde282a
Stack is at 0x7ffeebd0c164
Heap is at 0x557f81812e70
RBP is at: 7ffeebd0c180
При этом pmap показывает, что наиболее близкие адреса сегментов это:
7ffeebcee000 [stack]
7ffeebd6d000 [vvar]
7ffeebd70000 [vdso]
Sign up to leave a comment.
Сегментация памяти (Схема памяти компьютера)