32位内存经典布局
/ +----------------------------------------+ 0xFFFFFFFF
1GB | Kernel Space |
\ +----------------------------------------+ 0xC0000000 == TASK_SIZE
/ | Stack ↓ |
| +----------------------------------------+
| | |
| +----------------------------------------+
| | Memory Mapping Region ↑ |
| +----------------------------------------+ 0x40000000
3GB | |
| +----------------------------------------+
| | Heap ↑ |
| +----------------------------------------+
| | BSS Segment |
| +----------------------------------------+
| | Data Segment |
| +----------------------------------------+
| | Text Segment (ELF) |
| +----------------------------------------+ 0x08048000
\ | |
+----------------------------------------+ 0x00000000
Linux操作系统为安全性做了地址空间随机化
/ +----------------------------------------+ 0xFFFFFFFF
1GB | Kernel Space |
\ +----------------------------------------+ 0xC0000000 == TASK_SIZE
/ | | \
| | | Random stack offset
| | | /
| +----------------------------------------+ \
| | Stack ↓ | RLIMIT_STACK
| +----------------------------------------+ /
| | | \
| | | Random mmap offset
| | | /
| +----------------------------------------+
| | Memory Mapping Segment ↓ |
| +----------------------------------------+
| | |
3GB | | program break
| +----------------------------------------+ brk
| | Heap ↑ |
| +----------------------------------------+ start_brk
| | | \
| | | Random brk offset
| | | /
| +----------------------------------------+
| | BSS Segment |
| +----------------------------------------+ end_data
| | Data Segment |
| +----------------------------------------+ start_data
| | Text Segment (ELF) |
| +----------------------------------------+ 0x08048000
\ | |
+----------------------------------------+ 0x00000000
栈 存放函数参数/返回值和局部变量
堆 存放 malloc/new 动态分配的数据
BSS(Block Started by Symbol)存放未初始的全局/静态变量
数据段 存放初始化的全局/静态变量,可以进一步分成RO(只读)和RW(读写)区
文本段 存放程序代码