尽管有查找指针,但我仍然无法找到end(3)的手册页面,这让我有点恼火。即使是这个(稍微有点陈旧的)sbrk()
手册页面也没有它的链接。
malloc
实现都使用mmap(2) -至少对于大内存分配- 来获取一个内存段(并使用munmap
释放它)。很多时候,free
只是将一个内存区域标记为可供未来的malloc
重用(而不是释放任何内存给Linux内核)。
(因此,现代Linux进程的堆由多个段组成,比您的图像更加复杂;而多线程进程每个线程有一个堆栈)
使用 proc(5),特别是 /proc/self/maps
和 /proc/$pid/maps
,来了解一些 进程 的 虚拟地址空间。首先尝试理解 cat /proc/self/maps
(显示该cat
命令的地址空间)和 cat /proc/$$/maps
(显示您的shell的地址空间)的输出。还可以尝试查看您的Web浏览器的maps
伪文件(例如cat /proc/$(pidof firefox)/maps
或cat /proc/$(pidof iceweasel)/maps
等); 我有超过一千行(因此有许多进程段)。了解 ELF,ASLR,动态链接 & ld-linux(8),以及高级Linux编程书籍,然后查看syscalls(2)。