千家信息网

Utility之内存尺寸的示例分析

发表于:2024-10-19 作者:千家信息网编辑
千家信息网最后更新 2024年10月19日,小编给大家分享一下Utility之内存尺寸的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!虽然现在64位处理器越来
千家信息网最后更新 2024年10月19日Utility之内存尺寸的示例分析

小编给大家分享一下Utility之内存尺寸的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

虽然现在64位处理器越来越多,而且VxWorks也从6.9开始提供64位处理器的支持,但是目前VxWorks更多的应用场景还是32位的。那么VxWorks在32位处理器上最多可以使用多少内存呢?

32位系统的寻址范围是232 = 4G,但至少得给外设预留部分空间,因此可使用的内存范围肯定要小于4GB了。做个实验:X86的设备上,插一个4GB的内存条


使用LOCAL_MEM_AUTOSIZE模式


启动VxWorks,内存尺寸显示为3071MB


看一下内存的Top点在哪,可由函数sysPhysMemTop()获得,是3GB=3072MB


少的那一个MB去哪了?原来X86的内存是从0x100000开始算的


那这3071MB都可以随便使用吗?当然不是

内存的大致布局如下


挨个看一下

在LOCAL_MEM_LOCAL_ADRS和RAM_LOW_ADRS之间的区域,VxWorks系统存储了一些特定的数据


例如Boot line,在LOCAL_MEM_LOCAL_ADRS+ BOOT_LINE_OFFSET


从RAM_LOW_ADRS开始,存放的就是VxWorks系统镜像。编译时,镜像尾部会加入一个全局变量end,因此可以通过end来计算镜像的尺寸


其实这个尺寸在编译时就确定了,只不过因为对齐的关系,略有偏差


从内存顶部往下看,有两块预留区域。上面一块预留给EDR机制,其尺寸默认是24KB (PM_RESERVED_MEM = 6*VM_PAGE_SIZE)


下面一块是用户保留区,其尺寸是USER_RESERVED_MEM


这个区域的起始位置,可以由函数sysMemTop()获得


可以看到与sysPhysMemTop()值相同,那是因为在当前镜像里这俩保留区域默认都没有使能,因此尺寸还都是0

而end与sysMemTop()之间的区域,又可以分为三块

从end开始,存放WDB内存池,占用的空间WDB_POOL_SIZE默认是(sysMemTop()-end)/16


WDB之后,就是系统内存池,其尺寸KERNEL_HEAP_SIZE默认是(sysMemTop()-FREE_MEM_START_ADRS)/3*2 = WDB_POOL_SIZE*10


最后剩下的一块,是预留给RTP或共享库或共享数据区的,当它们加载时,再进行动态映射。其尺寸,就是(sysMemTop()-end)再减去WDB内存池和系统内存池,因此默认等于WDB_POOL_SIZE*5

那系统内存池的最大尺寸到底可以是多少?那就把另外几个可选区域都去掉:WDB内存池、RTP、用户保留区、EDR区域。系统内存池就是(sysPhysMemTop()-end):3GB减去RAM_LOW_ADRS之前的几个MB,再减去系统镜像的几个MB


以上是"Utility之内存尺寸的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0