公开学习文档

公开学习文档


基础

<h2>基础</h2> <p>data 段:存放已初始化的全局变量。既占文件空间;也占内存空间 bss 段:存放未初始化的全局变量。不占文件空间;但占内存空间 强弱符号:链接过程中,会用强符号覆盖弱符号。(静态全局变量没有强弱之分;局部变量没有符号?)</p> <table> <thead> <tr> <th>变量</th> <th>行为</th> <th>位置</th> <th>符号强弱</th> </tr> </thead> <tbody> <tr> <td>全局变量</td> <td>初始化不为 0</td> <td>data</td> <td>强</td> </tr> <tr> <td>全局变量</td> <td>初始化为 0</td> <td>bss</td> <td>强</td> </tr> <tr> <td>全局变量</td> <td>未初始化</td> <td>bss</td> <td>弱</td> </tr> <tr> <td>静态局部变量 同上</td> <td></td> <td></td> <td></td> </tr> </tbody> </table> <h2>进程内存布局</h2> <p>单个进程角度下内核空间与用户空间的关系图:</p> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=739786b2b4c2f18cbfd22803e0750639&amp;amp;file=file.png" alt="" /></p> <p>在32位系统上默认是内核占据上面1G虚拟空间,进程占据下面3G虚拟空间,有config选项可以选择其它比列,所有CPU架构都是如此。在64位系统上,由于64位的地址空间实在是太大了,Linux并没有使用全部的虚拟内存空间,而是只使用其中一部分位数。使用的方法是把用户空间的高位补0,内核空间的高位补1,这样从64位地址空间的角度来看就是只使用了两段,中间留空,方便以后往中间扩展。中间留空的是非法内存空间,不能使用。具体使用多少位,高位如何补0,不同架构的选择是不同的。ARM64在4K页面大小的情况下有39位和48位两种虚拟地址空间的选择。X86 64有48位和57位两种虚拟地址空间的选择。ARM64是内核空间和用户空间都有这么多的地址空间,x86 64是内核空间和用户空间平分这么多的地址空间,上图中的大小也可以反应出这一点。</p> <p>用户空间边界代码定义:</p> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=9cd809c1e81cbc6f6ec12c0cb17d3432&amp;amp;file=file.png" alt="" /></p> <p>进程用户空间分布:</p> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=8e26fc992d1d896780a63b623272eb4a&amp;amp;file=file.png" alt="" /></p> <h2>参考文档</h2> <p>&gt; <a href="https://mp.weixin.qq.com/s/sLoiOevTxIonrgLa7yWJkw?version=4.1.28.6010&amp;platform=win&amp;nwr_flag=1#wechat_redirect">https://mp.weixin.qq.com/s/sLoiOevTxIonrgLa7yWJkw?version=4.1.28.6010&amp;platform=win&amp;nwr_flag=1#wechat_redirect</a></p> <h2>64位布局</h2> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=59e885969d9b056e9e375f614c96b9f5&amp;amp;file=file.png" alt="" /></p>

页面列表

ITEM_HTML