上一节讲述了在没有MMU的CPU(如80251、MIPS M控制器系列、ARM cortex m系列)上实现虚拟内存管理的集成硬件设计方法。新设计的内存管理管理单元要实现虚拟内存管理还须要操作系统、代码分块(Bank)的支持。详见SoC嵌入式软件架构设计之二:没有MMU的CPU实现虚拟内存管理的设计方法。这里要阐述Bank设计的一些原则。

Bank设计是为了实现不同一时候刻执行的Bank(代码块)执行在同一块内存上,所以在执行之前操作系统须要将已存在内存的代码/数据进行缓存处理,并载入将要执行的Bank到该内存上。为了实现这个目的,须要明白下面要点:

1.为了提高效率。我们觉得代码是不会自改动的,即代码是仅仅读的,则在Bank切换的时候能够直接将已经存在内存的Bank代码丢弃。

我们仅仅须要将当前已经存在内存的Bank代码的Bank号入栈就可以。新载入的代码能够直接覆盖该块内存。

不同的Bank有不同的虚拟地址,为什么能够放到相同的物理内存?事实上是新设计的内存管理单元的电路决定的。參考前一节的文章(SoC嵌入式软件架构设计之二:没有MMU的CPU实现虚拟内存管理的设计方法)介绍,关键是同一个Bank组的不同虚拟地址信号相应的物理输出信号是一样的。

2.程序调用后返回到一个Bank的某一行时相同须要载入该Bank代码,这时操作系统会将之前的Bank号出栈,并依据Bank号将相应的代码载入到该块内存。从1和2来看,调用Bank代码和返回一个Bank设计到Bank号的入栈和出栈,假设设计的Bank代码中的函数的虚拟执行地址带有明白的Bank号信息,那函数的调用和返回就是一个入栈和出栈过程。这样操作系统能够降低出入栈的工作,代码执行也更顺畅。

3.Bank代码中的变量数据处理:

1)全局变量。

假设全局变量定义在公共区域。那Bank代码切换过程中不需对其进行处理。

假设全局变量定义在Bank内存区域,则Bank切换时须要对这部分全局变量进行缓存处理。即在Bank号入栈之后,将Bank中的数据存到堆中。在Bank返回时除了从外存储设备载入相应的代码时,还要将其相应的数据从堆中恢复到Bank内存。为了加快数据的恢复。往往默认一个Bank数据空间的最大值。这样就不须要记录每一个Bank的数据空间的大小。

2)静态变量。跟全局变量一样。

3)常量段。其是仅仅读,跟代码一块处理。

4)局部变量。局部变量是在栈中分配空间的,所以不须要进行缓存。

5)buffer。假如该Buffer仅仅是某个Bank调用,而该Bank除了代码还有剩余空间大于buffer大小,那将buffer设置在代码段之后,并定义一个指针局部变量,程序中直接指向该buffer的首地址。

假设我们将Bank内的全局变量所有转为局部变量,那操作系统就不须要对数据进行缓存管理,就不须要堆空间。可是局部变量相应的栈空间就加大了。一个Bank可能有多个函数。而多个函数是可能会用到相同的全局变量的。但这样的情况须要的全局变量往往不大,能够考虑都转为局部变量。

假设不须要进行数据缓存。那系统管理将会很easy。

4.中断处理不能进行Bank切换。Bank切换须要进行读写外存储设备,会造成非常大的延时,所以在中断里面不应该产生Bank切换。

5.操作系统、驱动、应用各层次频繁调用的代码应设置为常驻代码,假设发生切换会损失效率。

假设频繁调用的代码非常固定,如操作系统的调度管理等代码能够固化到ROM中,以降低成本。

6.Bank内存分块大小要适中。在保持切换性能的基础上选择较小的内存块。

Bank块设置过小,就会导致Bank切换频繁,损失效率,Bank设置过大会造成内存浪费。

7.Bank内存的起始地址应该对齐扇区(512字节)。这样读外存储设备可以达到最好的性能。

请关注SoC嵌入式软件架构设计(控制器SoC固件架构)系列博文:

SoC嵌入式软件架构设计之中的一个:系统内存需求评估

SoC嵌入式软件架构设计之二:没有MMU的CPU实现虚拟内存管理的设计方法

SoC嵌入式软件架构设计之三:代码分块(Bank)设计原则

SoC嵌入式软件架构设计之四:内存空间规划分配

SoC嵌入式软件架构设计之五:可运行程序的重构

嵌入式:节省内存的软件设计技巧

SoC嵌入式软件架构设计之三:代码分块(Bank)设计原则的更多相关文章

  1. SoC嵌入式软件架构设计II:没有MMU的CPU虚拟内存管理的设计和实现方法

    大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其它代码. 我们PC然在同一时间大量的应用,地址空间差点儿能够整个线性地址空间(除了部分留给操作系统或者预留它用).能够觉 ...

  2. SoC嵌入式软件架构设计II:否MMU的CPU虚拟内存管理的设计与实现方法

    大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其他代码.我们PC然在同一时间大量的应用,能够整个线性地址空间(除了部分留给操作系统或者预留它用),能够觉得每一个应用程序 ...

  3. SoC嵌入式软件架构设计

    内存是SoC(System on Chip,片上系统)集成设计的重要模块,是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必须要在成本和效率中取得平衡,做到 ...

  4. SoC嵌入式软件架构设计之六:API设计方法

    在嵌入式系统中,驱动都是以API的方式提供给应用进行调用.这里介绍嵌入式系统的API设计和管理方法. 驱动在系统中会按模块进行分类,比如按键驱动.LCD驱动.文件系统.card驱动.I2C驱动等等:每 ...

  5. SoC嵌入式软件架构设计之七:嵌入式文件系统设计

    嵌入式的系统区(system disk,SD)包含操作系统.驱动.中间件.应用和字库.UI资源等文件,本文讲述SD区的文件系统设计.文件系统最基本的目标是为了实现单个文件的定位和读写.由于一般代码都是 ...

  6. [简短问答]LODOP如何查看用LODOP打印设计的代码

    该博文为图文简短问答,具体详细介绍可查看本博客的相关博文,生成JS代码相关详细博文:Lodop打印设计(PRINT_DESIGN)介绍.Lodop打印设计.维护.预览.直接打印简单介绍.Lodop打印 ...

  7. WPF换肤之四:界面设计和代码设计分离

    原文:WPF换肤之四:界面设计和代码设计分离 说起WPF来,除了总所周知的图形处理核心的变化外,和Winform比起来,还有一个巨大的变革,那就是真正意义上做到了界面设计和代码设计的分离.这样可以让美 ...

  8. 一行js弹窗代码就能设计漂亮的弹窗广告

    接到一个设计需求,要求xmyanke在网站右侧挂一个弹窗广告宣传最近的活动,找了半天都没看到合适的,自己鼓捣了一行js弹窗代码就能设计漂亮的弹窗广告,来瞧一下,欢迎拍砖提意见,js弹窗广告代码如下: ...

  9. Webpack之Code Splitting 代码分块

    如何实现代码分块 默认情况webpack会将资源文件打包成一个js文件,比如app.bundle.js 实际情况我们需要按需加载 方法如下: require.ensure(dependencies, ...

随机推荐

  1. 借教室(NOIP2012)

    原题传送门 其实就是求能满足多少个订单.. 然后搞上差分, 又因为如果前n个能够满足,那么前m个一定能满足(m<n) 所以可以二分(重点!) 然后乱搞..就AC了(其实也挺麻烦的...233~) ...

  2. UVA 10910 Marks Distribution

    题意 把数字T分成N个数的和,保证这N个数中最小的数大于P.求方案数目 另f[i][j]表示把i分成j个数的和的方案数 f[i][j]=f[i][j-1]+f[i-1][j-1]+f[i-2][j-1 ...

  3. Linux安转scala

    1. 创建目录 > mkdir  /opt/scala > cd  /opt/scala 2. 下载scala压缩包到上述目录 scala-2.12.6.tgz 3. 解压缩.建立软连接 ...

  4. android 画竖虚线

    参考:http://blog.csdn.net/zhao2017/article/details/73866460 1.在Android中写横虚线比较简单,写竖虚线的话稍微麻烦点: 需要将写的虚线旋转 ...

  5. 【linux高级程序设计】(第十章)Linux异步信号处理机制 3

    信号屏蔽 信号忽略:系统仍然传递该信号,只是相应的进程不做任何处理 信号屏蔽:进程不捕获信号,信号处于未决状态,当不再屏蔽信号时可以捕获之前被屏蔽的信号. 信号集数据结构定义: typedef __s ...

  6. springBoot Feign

    1.引入依赖包 <!-- 引入关于 eureka-server的依赖 --> <dependency> <groupId>org.springframework.c ...

  7. AC日记——Array Queries codeforces 797e

    797E - Array Queries 思路: 分段处理: 当k小于根号n时记忆化搜索: 否则暴力: 来,上代码: #include <cmath> #include <cstdi ...

  8. 关于asp.net中gridview的问题,关于footer,16aspx上下的英语交流网程序,管理员的添加和修改有问题

    css部分 这是添加用户的方法 但是A.AdminName 和后面的A.取到的都是空值protected void GridView1_RowCommand(object sender,GridVie ...

  9. 51nod 1087 1 10 100 1000【打表】

    题目来源: Ural 1209 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 1,10,100,1000...组成序列1101001000...,求 ...

  10. Struts2 学习笔记——struts.xml文件之Bean的配置

    Struts2的大部分核心组件不是以硬编码的形式写在代码中,而是通过自身的IoC容器来管理的. Struts2以可配置的形式来管理核心组件,所以开发者可以很容易的扩展框架的核心组件.当开发者需要扩展或 ...