[嵌入式]存储器管理

来源:互联网 发布:避孕套 知乎 编辑:程序博客网 时间:2024/06/15 06:27

存储器管理

5.1  存储器分类

存储器组织结构

在复杂的嵌入式系统中,存储器系统的组织结构按作用可以划分为4级:寄存器、cache、主存储器和辅助存储器,如下图所示。当然,对于简单的嵌入式系统来说,没有必要把存储器系统设计成4级,最简单的只需寄存器和主存储器即可。

 

存储器作用示意图


寄存器包含在微处理器内部,用于指令执行时的数据存放,如:R0,R15等。Cache是高速缓存。主存储器是程序执行代码及数据的存放区,通常采用SDRAM类型的存储芯片。辅助存储器通常是Flash类型的芯片,作用类似通用计算机中的外存。

 

存储单元识别

主存储器和辅助存储器内部的存储单元靠地址来识别,存储器芯片收到的n位地址信号就选定一个具体的存储单元。存储器芯片通常还需一根使能信号引脚,它控制着存储器芯片数据引脚的三态。另外,还需读/写控制信号引脚,它们控制着存储器的数据传送方向。

随机存储器和只读存储器

 存储器根据其存取方式分成两类:随机存储器(RAM)和只读存储器(ROM)。RAM是易失性存储器,ROM是非易失性存储器。

    随机存储器又分为两大类:

    ·静态随机存储器(SRAM)

    ·动态随机存储器(DRAM)

  ·SRAM读/写速度比DRAM快。

 ·SRAM比DRAM功耗大。

 ·DRAM集成度高,因而存储容量更大。

 ·DRAM需要周期性的刷新,而SRAM不需要。

 

SRAM中的存储单元内容在通电状态下是始终不会丢失的,因而,其存储单元不需要定时刷新。

 

DRAM中的存储单元内容在通电状态下会丢失,需要定期刷新。因此增加RAS(行地址选择)和CAS(列地址选择)信号线,这样可以减少地址引脚,并方便刷新操作。

只读存储器(ROM)

只读存储器(ROM)通常又分成EPROM、EEPROM和闪存(Flash)。目前,闪存作为只读存储器在嵌入式系统中被大量采用,闪存使用标准电压既可擦写和编程,因此,闪存在标准电压的系统内就可进行编程写入。

NOR和NAND是现在市场上两种主要的非易失闪存技术

NAND Flash和NOR Flash比较

·1988年,Intel首先开发出NOR Flash技术;

·1989年,东芝公司发表了NAND Flash结构的存储器。

   NAND Flash和NOR Flash比较,有以下特点:

·NOR Flash的读取速度比NAND Flash稍快一些,NAND Flash的擦除和写入速度比NOR Flash快很多。

·Flash芯片在写入操作时,需要先进行擦除操作。NAND Flash的擦除单元更小,因此相应的擦除电路更少。

·NOR Flash带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节,可以像其他SRAM存储器那样与微处理器连接;NAND Flash器件使用复杂的I/O口来串行地存取数据,各个产品或厂商的方法还各不相同,因此与微处理器的接口复杂。

·NAND Flash读和写操作采用512字节的块,这一点类似硬盘管理操作,很自然地,基于NAND Flash的存储器就可以取代硬盘或其他块设备。 

 

5.2  内存管理单元

MMU,全称Memory Manage Unit, 中文名—存储器管理单元。
    许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序。

虚拟内存

    虚拟内存的基本思想是程序,数据,堆栈的总的大小可以超过物理存储器的大小,操作系统把当前使用的部分保留在内存中,而把其他未被使用的部分保存在磁盘上。比如对一个16MB的程序和一个内存只有4MB的机器,OS通过选择,可以决定各个时刻将哪4M的内容保留在内存中,并在需要时在内存和磁盘间交换程序片段,这样就可以把这个16M的程序运行在一个只具有4M内存机器上了。而这个16M的程序在运行前不必由程序员进行分割。
虚拟地址

   任何时候,计算机上都存在一个程序能够产生的地址集合,我们称之为地址范围。这个范围的大小由CPU的位数决定,例如一个32位的CPU,它的地址范围是0~0xFFFFFFFF (4G),而对于一个64位的CPU,它的地址范围为0~0xFFFFFFFFFFFFFFFF (64T)。这个范围就是我们的程序能够产生的地址范围,我们把这个地址范围称为虚拟地址空间,该空间中的某一个地址我们称之为虚拟地址。

物理地址

   与虚拟地址空间和虚拟地址相对应的则是物理地址空间和物理地址,大多数时候我们的系统所具备的物理地址空间只是虚拟地址空间的一个子集,这里举一个最简单的例子直观地说明这两者,对于一台内存为256MB的32bit x86主机来说,它的虚拟地址空间范围是0~0xFFFFFFFF(4G),而物理地址空间范围是0x000000000~0x0FFFFFFF(256MB)。
地址映射

   在没有使用虚拟存储器的机器上,虚拟地址被直接送到内存总线上,使具有相同地址的物理存储器被读写。而在使用了虚拟存储器的情况下,虚拟地址不是被直接送到内存地址总线上,而是送到内存管理单元——MMU,其功能是把虚拟地址映射为物理地址。


  大多数使用虚拟存储器的系统都使用一种分页技术。虚拟地址空间划分成称为页(page)单位,而相应的物理地址空间也被进行划分,单位是页框(frame)。页和页框的大小必须相同。

  这个例子有一台可以生成16位地址的机器,虚拟地址范围0x0000~0xFFFF(64K),而这台机器只有32K的物理地址,他可以运行64K的程序,但该程序不能一次性调入内存运行。

例如,当一条指令将将0号地址的值传递进寄存器REG,内核执行的过程如下:

首先,虚拟地址0将被送往MMU,MMU看到该虚地址落在页0范围内(页0范围是0到4095),从上图我们看到页0所对应(映射)的页框为2(页框2的地址范围是8192到12287),因此MMU将该虚拟地址转化为物理地址8192,并把地址8192送到地址总线上。内存对MMU的映射一无所知,它只看到一个对地址8192的读请求并执行它。MMU从而把0到4096的虚拟地址映射到8192到12287的物理地址。


系统上电前,所有的程序和数据都保存在FLASH中。系统上电后,异常中断处理和数据栈就被移到32位的RAM中,使异常中断处理速度较快;RW数据以及ZI数据移到16位RAM中;其他的RO代码在FLASH中运行。系统复位时,FLASH位于地址0处,复位后开始执行的指令把FLASH映射到别的非0地址段,而把RAM映射到地址0处。

系统初始化

系统初始化有两个阶段:

    1. 初始化运行环境

        ——设置入口地址

        ——设置异常向量表和中断向量表

        ——初始化存储器系统

        ——初始化堆栈

        ——初始化关键的I/O设备

        ——初始化中断系统需要的RAM变量

        ——中断使能

        ——切换处理器模式和处理器状态

   2. 初始化应用程序

    ——初始化非0可写变量

    ——对ZI数据段清0

——对有操作系统的应用系统,运行环境在操作系统启动时初始化,然后通过main()

    函数自动进入应用程序,C运行时库中的_main()函数初始化应用程序。对于没有操

    作系统的应用系统,ROM中的代码必须提供—种应用程序初始化自身和开始执行

    的方法。

 

5.3  S5PV210的存储系统

存储系统框图


TLB及TTW

    MMU本身有少量存储空间存放从虚拟地址到物理地址的匹配表,此表称作TLB(快表,也称页表)。TLB中内容包括:虚址及其对应的物理地址,权限,域和映射类型。

    当CPU对一虚拟地址进行存取时首先搜索TLB表以查找对应的物理地址等信息,称为Translation Table Walk,TTW。经过TTW过程后,将查到的信息保存到TLB,然后根据TLB表项的物理地址进行读写


S5PV210存储器地址映射

 

S5PV210启动过程


S5PV210上电将从IROM处执行固化的启动代码BL0,它对时钟等初始化、对启动设备进行判断,并从启动设备中复制BL1(最大16KB)到IRAM地址0xd0020000处,其中0xd0020010之前的16个字节储存的BL1的校验信息和BL1尺寸,对BL1进行校验,校验成功后转入BL1进行执行。

BL0:IROM中固化启动代码;

BL1:在IRAM自动从外存储器(nand/sd/usb)中拷贝的uboot.bin二进制文件头16K代码;

BL2:在代码重定向后在内存中执行的UBOOT完整代码。

5.4  S5PV210的内存控制器

DRAM控制器

DRAM控制器是高级微控制总线结构(AMBA)AXI。为支持高速存储设备,DRAM控制器使用SEC DDR PHY接口。S5PV210有两个独立的DRAM控制器和接口DMC0和DMC1。DMC0和DMC1支持的最大内存容量分别为512M比特和1G比特,但这两个控制器必须使用同样内存容量。其主要特性有:

·兼容JEDEC DDR2、低功率DDR和、DDR2 SDRAM标准;

·使用SEC LPDDR2 PHY接口来支持高速存储设备;

·支持两个外部芯片选择和每芯片包含1/2/4/8个存储体;

·支持128 MB, 256 MB, 512 MB, 1 GB, 2 GB and 4 GB的密度存储设备;

·支持16/32比特的存储数据带宽。

SROM控制器

S5PV210 SROM支持外置8/16比特NOR Flash/PROM/SRAM存储器。共支持6个高达16MB的存储体。

SROM控制器的主要特性有:

·支持SRAM,各种ROM和NOR闪存;

·仅支持8比特或16比特的数据总线;

·地址空间:每存储体可达16MB;

·支持6个存储体;

·内存的起始地址固定;

·支持比特和半字。

OneNand控制器

S5PV210支持用于OneNAND和Flex-OneNAND存储设备的外部总线。该OneNAND控制器支持异步和同步总线读写操作,该控制器还整合专用DMA引擎对存储设备操作进行加速。

OneNand控制器的主要特性有:

·支持数据缓冲(23位预读取FIFO和32位输出FIFO)。

·为匹配OneNAND和AHB系统总线接口速度,支持异步FIFO。

·支持OneNAND闪存设备的同步和异步读/写。

·可编程突发传输大小的OneNAND闪存接口。

·支持16位数据通道内存和32位数据通道AHB系统总线接口。

·用单一总线接口协议支持OneNAND家族多种存储设备。

·最多支持两个OneNAND设备。

·支持OneNAND设备的复位功能。

NAND 闪存控制器

S5PV210上的启动程序可以在外部NAND闪存中执行。它会将NAND闪存上的数据拷贝到DRAM中。当NAND闪存内容被复制到DRAM之后,主程序会在DRAM上执行。

NAND控制器的主要特性有:

·NAND闪存接口:支持512字节,2KB,4KB,8KB页面。

·软件模式可以直接访问NAND闪存,例如用于读/擦除/编程NAND闪存。

·支持8位NAND闪存接口总线。

·支持SLC和MLC NAND闪存。

·支持1 /4 /8/12 /16位ECC。

·支持字节/半字/字数据。

NAND  Flash读写擦除程序

1.初始化函数 Nand_init():

void Nand_Init(void)

{rNFCONF = 0x7771;

rNFCONT = 0x03 ;

}

2. NAND Flash复位函数

static void Nand_Reset(void)

{    NF_nFCE_L();/* select this chip */

      NF_CLEAR_RB();      /* clear the r/b bits*/

      NF_CMD(CMD_RESET);    /* reset cmd*/

      NF_DETECT_RB();/* detect the bit status*/

      NF_nFCE_H();/* disa the chip*/

}

3.写页面数据

static int nand_write_page(unsigned char *buf, unsigned long addr)

{

    unsigned char *ptr = (unsigned char *)buf;

    unsigned int i;

    NF_nFCE_L();      NF_CLEAR_RB();

    NF_CMD(0x80);   addr = addr >> 11;

    NF_ADDR(0);      NF_ADDR(0);

    NF_ADDR(addr& 0xff);

    NF_ADDR((addr>>8) & 0xff);

    NF_ADDR((addr>>16) & 0xff);

    for (i = 0; i < (2048); i++)

    {  rNFDATA8 = *ptr;  ptr++;    }

    NF_CMD(0x10);   NF_DETECT_RB();

    NF_CMD(0x70);   NF_WAITIO0();

    NF_nFCE_H();

    return 2048;

}

4. 擦除块数据

static int nand_erase_block(unsigned long addr)

{   NF_nFCE_L() ;//chip Enable

     NF_CLEAR_RB();

     NF_CMD(CMD_ERA1);

     addr= addr>>11;

     NF_ADDR(addr & 0xff);

     NF_ADDR((addr>>8) & 0xff);

     NF_ADDR((addr>>16) & 0xff);

     NF_CMD(CMD_ERA2);

     NF_DETECT_RB()

     NF_CMD(0x70);

     NF_WAITIO0();

     /* chip Disable */

     NF_nFCE_H();

     return 0;

}

5.读函数

static int nand_read_page(unsigned long addr, unsigned char * const buffer)

{

int i;

addr = addr>>11;

 

//Nand_Reset();

 

NF_nFCE_L();

NF_CLEAR_RB();

 

NF_CMD(CMD_READ1);

NF_ADDR(0x0);

NF_ADDR(0x0);

NF_ADDR(addr&0xff);

NF_ADDR((addr>>8)&0xff);

NF_ADDR((addr>>16)&0xff);

    NF_CMD(CMD_READ2);

//delay(500);

NF_DETECT_RB();

 

for (i = 0; i < 2048; i++)

{

buffer[i] =  NF_RDDATA8();

}

 

NF_nFCE_H();

return 0;

}

 

0 0
原创粉丝点击