SylixOS BSP开发(六)

gewenbin
gewenbin
gewenbin
188
文章
15
评论
2021年4月3日16:59:26 2 3,442

物理内存空间配置

1. 物理内存段配置

SylixOS将物理内存划分成4个区域进行使用:内核代码区,内核数据区,DMA内存区和APP内存区。系统启动开启MMU后会将内核代码区和内核数据区的物理地址和虚拟地址建立对等映射的关系,也就是物理地址和虚拟地址是一样的;DMA内存区会在需要的时候建立映射,也是对等映射的关系;APP内存区也是在需要的时候建立映射,但是映射关系不一定是对等映射,APP区的虚拟地址是可以在bspMap.h中进行配置的,这个在后续章节中讲解。

使能MMU后,系统VMM组件接管的内存区是DMA和APP区,系统内核和内核数据区不归VMM组件管理:

SylixOS BSP开发(六)

下面我们来看看这几个区域的作用;

  • 内核代码区:这段区域存放有系统的中断向量表和内核代码,使能MMU后这段区域无法写入。
  • 内核数据区:这段区域是内核使用的数据区,包括内核栈、内核堆、全局数据等等。使能MMU后这段区域可读可写。
  • DMA内存区:有些外设控制器需要申请物理连续的内存,DMA内存区就是为这些控制器准备的。
  • APP内存区:SylixOS动态加载的应用程序、动态库和内核模块都是使用的这段区域。

在上述的4个区域中,内核代码区、内核数据区和APP内存区都是带Cache属性的,DMA内存区根据需要可以申请带Cache或者不带Cache属性的物理连续内存。

我手中的开发板使用的内存是1GB大小,根据上述信息,我们可以将物理内存空间在config.h 中进行如下配置:

#define BSP_CFG_ROM_BASE (0x00000000)
#define BSP_CFG_ROM_SIZE (4 * 1024 * 1024)

#define BSP_CFG_RAM_BASE (0x40000000)
#define BSP_CFG_RAM_SIZE (1 * 1024 * 1024 * 1024)

#define BSP_CFG_TEXT_SIZE (10 * 1024 * 1024)
#define BSP_CFG_DATA_SIZE (50 * 1024 * 1024)
#define BSP_CFG_DMA_SIZE  (128 * 1024 * 1024)
#define BSP_CFG_APP_SIZE  (BSP_CFG_RAM_SIZE  - BSP_CFG_TEXT_SIZE - \
                           BSP_CFG_DATA_SIZE - BSP_CFG_DMA_SIZE)

#define BSP_CFG_BOOT_STACK_SIZE (128 * 1024)
  • BSP_CFG_ROM_BASE:在本平台上不需要关心。
  • BSP_CFG_ROM_SIZE:在本平台上不需要关心。
  • BSP_CFG_RAM_BASE:SylixOS所使用的物理内存基址,这个地址也是内核镜像的加载地址。
  • BSP_CFG_RAM_SIZE:SylixOS使用的物理内存大小。
  • BSP_CFG_TEXT_SIZE:内核代码区大小。
  • BSP_CFG_DATA_SIZE:内核数据区大小。
  • BSP_CFG_DMA_SIZE:DMA内存区大小。
  • BSP_CFG_APP_SIZE:APP内存区大小。
  • BSP_CFG_BOOT_STACK_SIZE:BSP启动时使用的栈空间大小。

2. 内核数据段拷贝

SylixOS内核代码段和内核数据段的链接地址(运行地址)是在config.ld链接脚本中定义的:

SylixOS BSP开发(六)

可以看出,内核数据段的运行地址是紧挨在内核代码段之后的,内核代码段大小一般我们都是根据经验来分配一个合理的大小,也许实际并没有使用全部的空间,这样为了减少生成的bin文件大小,默认生成的bin文件中内核数据和内核实际使用的代码空间是紧挨着存放的。所以在实际运行时,需要将内核数据区的数据从加载地址复制到运行地址:SylixOS BSP开发(六)

在这个拷贝的操作就是在startup.S中做的,现在大家知道为什么启动时需要拷贝内核数据区了吧。

gewenbin
  • 本文由 发表于 2021年4月3日16:59:26
  • 转载请务必保留本文链接:http://www.databusworld.cn/10140.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

评论:2   其中:访客  1   博主  1
    • yhf yhf 4

      你好,我想问一下,TEXT段和DATA段分配内存较大的话,会不会影响系统运行呢。我第一次为了防止系统运行时DATA段覆盖,将TEXT段设置为100M,DATA段设置为50M,可是导致了系统运行失败,在某些地方卡住。改小一点的话就没有问题了。这是为什么呢。

        • gewenbin gewenbin

          @ yhf TEXT段一般情况下都在10MB以内,至于设成100MB系统起不来这个我到没有这么试过,具体原因估计要得调试分析了。TEXT和DATA大小最好按实际情况合理设置,设置过大会导致系统启动变慢。