小编给大家分享一下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之内存尺寸的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。