基础
<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;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;file=file.png" alt="" /></p>
<p>进程用户空间分布:</p>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=8e26fc992d1d896780a63b623272eb4a&amp;file=file.png" alt="" /></p>
<h2>参考文档</h2>
<p>> <a href="https://mp.weixin.qq.com/s/sLoiOevTxIonrgLa7yWJkw?version=4.1.28.6010&platform=win&nwr_flag=1#wechat_redirect">https://mp.weixin.qq.com/s/sLoiOevTxIonrgLa7yWJkw?version=4.1.28.6010&platform=win&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;file=file.png" alt="" /></p>