前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Utility之内存尺寸

Utility之内存尺寸

作者头像
Taishan3721
发布2019-08-13 16:36:46
9960
发布2019-08-13 16:36:46
举报
文章被收录于专栏:这里只有VxWorks

虽然现在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

这正是:

寻址范围整4G,外设占用四分一。

内存两端需预留,中间三块跑程序。

我是泰山,专注VX 15年!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这里只有VxWorks 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档