2025年本地回环地址是多少(本地回环地址作用)

本地回环地址是多少(本地回环地址作用)span id Label3 p nbsp nbsp nbsp nbsp 本文主要简介在 X86 体系结构下和在 ARM 体系结构下 Linux 内存布局的概况 力求简单明了 不过多深入概念 多以图示的方式来记忆理解 一图胜万言 p div Technorati 标签 内存 div span

大家好,我是讯享网,很高兴认识大家。




讯享网

 <span id="Label3"><p>&nbsp;&nbsp;&nbsp;&nbsp; 本文主要简介在X86体系结构下和在ARM体系结构下,Linux内存布局的概况,力求简单明了,不过多深入概念,多以图示的方式来记忆理解,一图胜万言。</p> <div>Technorati 标签: 内存 布局</div> <p>&nbsp;&nbsp;&nbsp;&nbsp; 在X86体系结构下,物理内存地址一般从0x0000_0000开始,而Linux内核主要按照在物理地址0x0010_0000开始的地方,即物理地址1M以上的空间。那最开始的1M空间是用来干什么的呢?</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 考虑到通用的IBM-PC体系结构,最开始的1M空间由BIOS例程和映射ISA图形卡的内存,这块区域为了所有IBM兼容PC从640K到1M的物理地址,始终存在,但无法**作系统使用。</p> <p><img alt="技术分享" title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="https://www.u72.net/d/file/p/2024/08/22/0c639c04b2af14e9edaf84.png" width="927" height="644">&nbsp;</p> <p>主要内存布局如上图所示:</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; mmap映射区向下扩展,堆向上扩展,两者相对扩展,直到耗尽虚拟地址空间中的剩余区域。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; BSS段用来存放程序中未初始化的全局变量,该段内容只记录数据所需空间大小,并不分配真实空间。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; DATA段用来存放程序中已初始化的全局变量,为数据分配空间,数据具体值保持在目标文件中。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; CODE段用来存放程序中执行代码的内存区域,通常为大小确定的只读段,包括只读常量、只读代码等。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; <img alt="技术分享" title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="https://www.u72.net/d/file/p/2024/08/22/1cf872b19debc5e372c2d5.png" width="441" height="263"> </p> <p>&nbsp; 参考资料:http://blog.csdn.net/huangzhipeng/article/details/</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 以S3C2410为例子,假设物理内存为64M,映射到ARM的起始物理地址为【0x3000_0000~0x3200_0000】,这个由硬件接线决定。我们可以通过查看内核编译输出的System.map文件来了解内核虚拟地址空间布局,结果类似如下:</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; <img alt="技术分享" title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="https://www.u72.net/d/file/p/2024/08/22/f6b8d66cd21cf47e35004acfda46aa93.png" width="243" height="106">&nbsp; <img alt="技术分享" title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="https://www.u72.net/d/file/p/2024/08/22/31e7e0886b54d9a71cefbad.png" width="326" height="104"> </p> <p>&nbsp;&nbsp; 可以看出内核镜像大小为3.7M,虚拟地址空间起始地址为0xc000_0000(这是开启MMU之后的虚拟地址空间),在内核head.S文件中,有内核线性地址和物理地址的描述,见下图:</p> <p><img alt="技术分享" title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="https://www.u72.net/d/file/p/2024/08/22/a283c5d8dd0b70f640c29a.png" width="628" height="380"> </p> <p>&nbsp;&nbsp;&nbsp;&nbsp; PAGE_OFFSET为<font color="#ff0000">0xC000_0000</font>,为内核虚拟地址相对偏移(相对于0地址的偏移),<font color="#ff0000">PHYS_OFFSET</font>为内核载入实际物理地址相对偏移,不同的硬件板子,ARM访问的内存物理地址不一样,这里以0x3000_0000(这由硬件接线决定)为假设。<font color="#ff0000">TEXT_OFFSET为0x0000_8000</font>,为编译时指定的代码段偏移,所以,uboot最后启动内核的地址为内核代码指定的<font color="#ff0000">KERNEL_RAM_PADDR(0x3000_8000)</font>,这样才能正常运行,而内核的入口地址和载入地址,最好设置成一样。而uboot加载kernel的实际地址设置为0x3000_7fc0,比<font color="#ff0000">KERNEL_RAM_PADDR</font><font color="#000000">少64个字节,这可以避免拷贝内核,64个字节为uImage内核镜像针对uboot添加的特定头部信息。</font></p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 从上面的检查宏可以看出,内核开始的物理地址,必须开始在0xXXXX_8000的地址空间。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; swapper_pg_dir 为内核全局页表的起始地址,stext为内核的入口虚拟地址,因此,可以看出,全局页表占据16K的空间。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; head.S文件的功能,主要获取处理器类型和机器类型信息,创建临时页表,然后开启MMU,并进入第一个C语言函数start_kernel。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 更加详细的可以参见:</p><p>&nbsp; 给出一个整体的内核结构图:</p><p><img alt="技术分享" alt="arch" src="http://hi.csdn.net/attachment//19/0_5Va.gif"></p><p>&nbsp;</p><p>参考链接:http://blog.csdn.net/linyt/article/details/</p><p>Linux 内存布局</p></span> 

讯享网
小讯
上一篇 2025-05-06 14:39
下一篇 2025-06-05 18:28

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/202730.html