哈喽,我是子牙,一个很卷的硬核男人
深入研究计算机底层、Windows内核、Linux内核、Hotspot源码……聚焦做那些大家想学没地方学的课程。为了保证课程质量及教学效果,一年磨一剑,三年先后做了这些课程:手写JVM、手写OS、带你用纯汇编写OS、手写64位多核OS、实战Linux内核…
最近抽空把之前对Linux进程内存空间的研究整理了一下,分享给大家。依然,这篇文章与你以前看到的所有相关文章或视频都不同,无论是广度,还是深度,更重要的,我都会在Linux内核中证明给你看!
32位时代已经过去很久了,所以本篇文章为了保持干净整洁,只讲64位。32位与64位其实相差不大,甚至可以说,32位因为可操作内存空间更少,反而更复杂些,感兴趣的小伙伴举一反三,自行研究
阅读完本篇文章,这些问题你能得到答案:
- 一个进程的内存空间长啥样子
- 一个进程的用户空间、内核空间分别长啥样子
- 进程的用户空间与内核空间都有空洞(hole)吗?如何证明?
- 我们编写的一个C语言程序,是如何变成Linux进程的?
- malloc底层是如何实现的?什么时候是通过brk申请内存?什么时候是通过mmap申请内存?如何证明?
- 如何证明进程用户空间中的堆(heap)是向上增长的?
- 如何证明进程用户空间中的映射区(mmap)是向下增长的?
- Linux内核中与此知识点相关的资料或源码怎么看?
- 想独立研究Linux内核,能独立看得到Linux内核,有书或视频推荐吗?
混沌由此开
道生一,一生二,二生三,三生万物。本篇文章就从这个程序开始吧
这个程序包含了一个程序会使用内存的所有情况:未初始化的全局变量,初始化了的全局变量、静态字符串、函数参数、局部变量、通过mmap从映射区分配内存、通过malloc从堆区分配内存
来看下结果
接下来我们就来分析:不同的变量对应着不同的使用内存的情况,这些变量为什么是这样的值?它们都分布在Linux进程内存空间的哪个区域?
进程内存空间
一个64位进