当前位置:文档之家› 13_闪存(Flash)(免费下载)

13_闪存(Flash)(免费下载)

13_闪存(Flash)(免费下载)
13_闪存(Flash)(免费下载)

目录

第1章闪存(Flash) (1)

1.1 Flash功能概述 (1)

1.2 Flash库函数 (3)

1.3 Flash例程 (7)

第1章闪存(Flash)

函 数 原 型页码void FlashUsecSet(unsigned long ulClocks) 3 unsigned long FlashUsecGet(void) 4 long FlashErase(unsigned long ulAddress) 4 long FlashProgram(unsigned long *pulData, unsigned long ulAddress, unsigned long ulCount) 4 long FlashProtectSet(unsigned long ulAddress, tFlashProtection eProtect) 5 long FlashProtectSave(void) 5 tFlashProtection FlashProtectGet(unsigned long ulAddress) 5 long FlashUserSet(unsigned long ulUser0, unsigned long ulUser1) 5 long FlashUserSave(void) 6 long FlashUserGet(unsigned long *pulUser0, unsigned long *pulUser1) 6 void FlashIntEnable(unsigned long ulIntFlags) 6 void FlashIntDisable(unsigned long ulIntFlags) 6 unsigned long FlashIntGetStatus(tBoolean bMasked) 7 void FlashIntClear(unsigned long ulIntFlags) 7 void FlashIntRegister(void (*pfnHandler)(void)) 7 void FlashIntUnregister(void) 7

1.1 Flash功能概述

在Stellaris系列不同型号里带有8~256KB的Flash存储器(后续型号容量可能更大)。Flash用于存储代码和固定数表,正常情况下只能用于执行程序,而不能直接修改存储的内容。但是,片内集成的Flash控制器提供了一个友好的用户接口,使得Flash存储器可以在应用程序的控制下进行擦除、编程等操作。在Flash存储器中还可以应用保护机制,防止Flash 内容被修改或读出。

1.Flash存储器区块

Flash存储器是由一组可独立擦除的1KB区块所构成的。对一个区块进行擦除将使该区块的全部内容复位为1。编程操作是按字(32位)进行的,每个32位的字可以被编程为将当前为1的位变为0。但是,Flash保护机制是按照2KB区块划分的,每个2KB的区块都可被标记为只读或只执行,以提供不同级别的代码保护。

2.Flash存储器时序

Flash的操作时序是由Flash控制器自动处理的。但是,如此便需要得知系统的时钟速率以便对内部的信号进行精确的计时。为了完成这种计时,必须向Flash控制器提供每微秒钟的时钟周期数。由软件负责通过函数FlashUsecSet( )使Flash控制器保持更新。

3.Flash存储器保护

Flash存储器有4种基本的操作方式:

z 执行:Flash 内容当作程序代码,由CPU 取指令机制自动读出,访问次数无限制; z 读取:Flash 内容当作固定数表,可以由应用程序读出,访问次数无限制;

z 擦除:按1KB 区块整体地被擦除,该区块的全部位内容变成1,擦除时间约20ms ; z 编程:对已擦除的Flash 内容按32位字的方式进行写操作,能将位1改为0,编程时间约20μs 。

Flash 擦除/编程循环(1→0→1)寿命10万次(典型值)。Flash 控制器以2KB 区块为基础向用户提供两种形式的基本保护策略:编程保护、读取保护。这两种保护策略可以形成4种组合的保护模式,详见表1.1的描述。

表1.1 Flash 存储器保护模式

编程保护

读取保护

保 护 模 式

0 0

只执行保护,Flash 区块只能被执行而不能被编程、擦除和读取,该模式用来保

护代码不被控制器或调试器读取和修改 1 0 Flash 区块可以被编程、擦除或执行,但不能被读取,该组合通常不可能被使用0 1

只读保护,Flash 区块可以被读出或执行,但不能被编程或擦除,该模式用来锁定Flash 区块防止对其进行进一步的修改 1 1 无保护,Flash 区块可以被编程、擦除、执行或读取

注意:实际的应用程序通常是采用C/C++等高级语言来编写的,在一个用来存储程序代码的区块里,不可避免地会出现可执行代码与只读数表共存的情况。如果对该区块进行了只执行保护,则很有可能导致程序无法正常运行!

注意:一般不要使用编程保护为1、读取保护为0这种组合。

注意:对于Sandstorm 和Fury 家族,Flash 区块的只读保护是一次性的,即如果使用库函数FlashProtectSave( )确认了对Flash 区块保护设置的保存操作,则该Flash 区块以后再也不能被擦除或编程,并且无法恢复!对于2008年新推出的DustDevil 家族,Flash 区块的只读保护属性是可以恢复的,比如借助于LMFlashProgrammer 之类的工具软件,通过解锁操作“Unlock ”就能恢复,参见图1.1。

4. 用户寄存器

在Sandstorm 和Fury 家族里,Flash 控制器提供有3个用户寄存器: z USER_DBG :用户调试寄存器 z USER_REG0:用户寄存器0 z USER_REG1:用户寄存器1

在DustDevil 家族里,增加了两个用户寄存器: z USER_REG2:用户寄存器2 z USER_REG3:用户寄存器3

有关用户寄存器的详细说明,请参考具体型号的《数据手册》。

注意:对于Sandstorm 和Fury 家族,用户寄存器的写操作是一次性的,一旦修改则无法恢复!对于DustDevil 家族,用户寄存器改写后可以借助于LMFlashProgrammer 等工具软件,通过解锁操作“Unlock ”就能恢复,参见图1.1。

图1.1 通过解锁操作恢复Flash设置

5.ROM存储器

从2008年新推出的DustDevil家族(LM3S3000/5000全部,以及LM3S1000/2000部分型号)开始,在地址0x01000000处固化了16KB的ROM存储器,包含以下内容:z串行Flash下载器和中断向量表

z外设驱动库(DriverLib)

z一些用于出厂测试的预装代码

1.2 Flash库函数

为了确保Flash控制器能够正常工作,必须要事先利用函数FlashUsecSet( )设置每微秒的CPU时钟数。函数FlashUsecGet( )用来获取已设置的时钟数。参见表1.2和表1.3的描述。

1.时钟数设置与获取

表1.2 函数FlashUsecSet( )

功能设置每微秒钟的处理器时钟个数

原型void FlashUsecSet(unsigned long ulClocks)

参数ulClocks:每微秒钟的处理器时钟个数,例如在20MHz系统时钟下,这个时钟数就是20

返回无

表1.3 函数FlashUsecGet( )

功能获取每微秒钟的处理器时钟数

原型unsigned long FlashUsecGet(void)

参数无

返回每微秒钟的处理器时钟数

2.Flash擦除与编程

函数FlashErase( )用来擦除一个指定的Flash区块(1KB),在确保Flash已擦除过的情况下,可以用函数FlashProgram( )按字(4B)的方式来编程。参见表1.4和表1.5的描述。

在实际应用当中,可以先把一个Flash区块读到一个SRAM缓冲区里,再修改内容,然后擦除区块,最后编程回存。如此操作,可以避免把同在一个区块内的其它数据抹掉。

表1.4 函数FlashErase( )

功能擦除一个Flash区块(大小1KB)

原型long FlashErase(unsigned long ulAddress)

参数ulAddress:区块的起始地址,如0、1024、2048等等

返回0表示擦除成功,-1表示指定了错误的区块或者区块已被写保护

注意请勿擦除正在执行程序代码的Flash区块

表1.5 函数FlashProgram( )

功能编程Flash

原型long FlashProgram(unsigned long *pulData, unsigned long ulAddress, unsigned long ulCount)

参数pulData:指向数据缓冲区的指针,编程是按字(4字节)进行的ulAddress:编程起始地址,必须是4的倍数

ulCount:编程的字节数,也必须是4的倍数

返回0表示编程成功,-1表示编程时遇到错误

3.Flash保护

为了Flash保护应用的方便,在里定义有枚举类型tFlashProtection:

typedef enum

{

FlashReadWrite,

//

Flash能被读出或改写

FlashReadOnly,

//

Flash只能被读出

FlashExecuteOnly //

Flash只能被执行

} tFlashProtection;

函数FlashProtectSet( )用来设置Flash的保护,这是临时性的保护,下次复位或上电就会自动解除。调用函数FlashProtectSave( )能够保存对保护的设置,并且不能被解除。函数FlashProtectGet( )用来查知Flash的保护情况。详见表1.6、表1.7和表1.8的描述。

表1.6 函数FlashProtectSet( )

功能 设置Flash 区块的保护方式

原型

long FlashProtectSet(unsigned long ulAddress, tFlashProtection eProtect) 参数

ulAddress :区块的起始地址

eProtect :枚举类型,区块的保护方式,取下列值之一:

FlashReadWrite FlashReadOnly FlashExecuteOnly

返回 0表示保护成功,-1表示指定了错误的地址或者保护方式

说明

注意,本函数只是提供临时性的保护措施,芯片复位或重新上电就能够解除设置的保护

表1.7 函数FlashProtectSave( )

表1.8 函数FlashProtectGet( )

功能 获取Flash 区块的保护情况

原型 tFlashProtection FlashProtectGet(unsigned long ulAddress) 参数 ulAddress :区块的起始地址

返回

枚举类型,参考表1.6当中参数eProtect 的取值

4. Flash 用户寄存器访问

这是一组用来管理用户寄存器的函数。FlashUserSet( )临时性地设置用户寄存器的值,下次复位或上电就能自动解除。一旦调用

FlashUserSave( )就会永久性地保存所设置的值,并且不能恢复。FlashUserGet( )用来读取用户寄存器的值。详见表1.9、表1.10和表1.11的描述。

表1.9 函数FlashUserSet( )

功能 设置用户寄存器

原型 long FlashUserSet(unsigned long ulUser0, unsigned long ulUser1) 参数 ulUser0:用户寄存器0 ulUser1:用户寄存器1 返回 无

说明 注意,本函数只是提供临时性的设置,芯片复位或重新上电就能够解除设置

表1.10 函数FlashUserSave( )

表1.11 函数FlashUserGet( )

功能 获取用户寄存器的内容

原型 long FlashUserGet(unsigned long *pulUser0, unsigned long *pulUser1) 参数 pulUser0:指向保存用户寄存器0的变量指针 pulUser1:指向保存用户寄存器1的变量指针 返回

0表示获取成功,-1表示遇到硬件故障无法获取

5. Flash 中断控制

这是一组管理Flash 中断的函数。Flash 中断有两种情况:编程中断,如果使能则会在对一个字(32位)的编程操作完成时申请中断;访问中断,如果使能则可以用来拦截对已保护的Flash 区块的非法访问。

函数FlashIntEnable( )用来使能Flash 中断,FlashIntDisable( )用来禁止Flash 中断。参见的表1.12和表1.13描述。

函数FlashIntGetStatus( )用来获取Flash 的中断状态,而FlashIntClear( )用来清除中断状态。参见表1.14和表1.15的描述。

函数FlashIntRegister( )用来注册一个Flash 中断服务函数,而FlashIntUnregister( )用来注销。参见表1.16和表1.17的描述。

表1.12 函数FlashIntEnable( )

功能 使能

Flash 控制器的中断

原型

void FlashIntEnable(unsigned long ulIntFlags)

参数

ulIntFlags :要使能的中断源,取下列值之一或者它们之间的“或运算”组合形式:

FLASH_FCIM_PROGRAM // Flash 编程中断屏蔽 FLASH_FCIM_ACCESS // Flash 访问中断屏蔽

返回

表1.13 函数FlashIntDisable( )

功能

禁止Flash 控制器的中断

原型void FlashIntDisable(unsigned long ulIntFlags)

参数ulIntFlags:要禁止的中断源,取值参见表1.12

返回无

表1.14 函数FlashIntGetStatus( )

功能获取Flash控制器的当前中断状态

原型unsigned long FlashIntGetStatus(tBoolean bMasked)

参数bMasked:要获取原始的中断状态取值false,要获取屏蔽的中断状态取值true

返回中断状态的位组合,参见表1.12当中参数ulIntFlags的取值

表1.15 函数FlashIntClear( )

功能清除Flash控制器的中断状态

原型void FlashIntClear(unsigned long ulIntFlags)

参数ulIntFlags:要清除的中断源,取值参见表1.12

返回无

表1.16 函数FlashIntRegister( )

功能注册一个Flash控制器的中断服务函数

原型void FlashIntRegister(void (*pfnHandler)(void))

参数pfnHandler:函数指针,指向要注册的中断服务函数

返回无

表1.17 函数FlashIntUnregister( )

功能注销Flash控制器的中断服务函数

原型void FlashIntUnregister(void)

参数无

返回无

1.3 Flash例程

1.Flash简单擦写

程序清单1.1演示了Flash区块的擦写操作。该例程指定要操作的Flash扇区号是62,可直接运行于Flash容量大于等于64KB的型号。Flash擦除操作采用函数FlashErase( ),编程操作采样函数FlashProgram( )。如果在操作过程中遇到意外故障,则会通过UART报错。

程序清单1.1 Flash例程:简单擦写

文件:main.c

#include "systemInit.h"

#include "uartGetPut.h"

#include

#include

#include

// 定义Flash扇区号(每个扇区1024字节)

#define SECTION 62

// Flash读取操作

char flashRead(unsigned long ulAddress)

{

*pcData;

char

pcData = (char *)(ulAddress);

return(*pcData);

}

// 主函数(程序入口)

int main(void)

{

char cString[ ] = "Hello, world\r\n";

unsigned long *pulData;

i;

int

c;

char

size;

long

jtagWait( ); // 防止JTAG失效,重要!

clockInit( ); // 时钟初始化:晶振,6MHz uartInit( ); // UART初始化

设置每微秒的CPU时钟数

//

1000000);

/

FlashUsecSet(TheSysClock

pulData = (unsigned long *)cString;

if (FlashErase(SECTION * 1024))

{

error>\r\n");

uartPuts("

(;;);

for

}

ok>\r\n");

uartPuts("

size = 4 * (1 + sizeof(cString) / 4);

if (FlashProgram(pulData, SECTION * 1024, size))

{

error>\r\n");

uartPuts("

(;;);

for

}

ok>\r\n");

uartPuts("

for (i = 0; i < sizeof(cString); i++)

{

c = flashRead(SECTION * 1024 + i);

uartPutc(c);

}

ok>\r\n");

uartPuts("

(;;)

for

{

}

}

2.Flash当作EEPROM

EEPROM是Electrically Erasable Programmable Read-Only Memory的缩写,意为电可擦除可编程只读存储器,是一种很常见的非易失性存储器。CAT24C02是一款经典的I2C接口EEPROM,可以按字节进行擦除和编程,典型擦除/编程循环寿命为100万次。

Stellaris系列的Flash具有擦除/编程特性,因此也可以当作是EEPROM来使用。不过擦除时是按照1KB区块进行的,编程时是按照字(4B)进行的,并且擦写寿命仅有10万次,不及EEPROM。在采用适当的软件算法后,可以在函数接口上使得Flash具有类似于EEPROM的按字节擦写的操作特性,并且还可以延长使用寿命。程序清单1.2演示了这种用法。

程序清单1.2 Flash例程:当作EEPROM

文件:FlashEEPROM.h

#ifndef __FLASH_EEPROM_H__

#define __FLASH_EEPROM_H__

// 初始化用Flash虚拟的EEPROM

extern void FlashEEPROM_Init(void);

// 从Flash虚拟的EEPROM指定地址处读取1个字节

extern char FlashEEPROM_Read(unsigned short usAddr);

// 从Flash虚拟的EEPROM指定地址处读取N个字节

extern void FlashEEPROM_ReadN(unsigned short usAddr, char *pcData, unsigned short usN);

// 向Flash虚拟的EEPROM指定地址处写入1个字节

extern void FlashEEPROM_Write(unsigned short usAddr, char cData);

// 向Flash虚拟的EEPROM指定地址处写入N个字节

extern void FlashEEPROM_WriteN(unsigned short usAddr, const char *pcData, unsigned short usN); #endif // __FLASH_EEPROM_H__

文件:FlashEEPROM.c

#include

#include

#include

#include

// 定义Flash扇区号(每个扇区1024字节)

#define SECTION 62

extern unsigned long TheSysClock;

// 初始化用Flash虚拟的EEPROM

void FlashEEPROM_Init(void)

{

1000000);

设置每微秒的CPU时钟数

//

/

FlashUsecSet(TheSysClock

}

// 从Flash虚拟的EEPROM指定地址处读取1个字节

// usAddr=0~1023

char FlashEEPROM_Read(unsigned short usAddr)

{

*pcData;

char

pcData = (char *)(SECTION * 1024 + (usAddr & 0x03FF));

return(*pcData);

}

// 从Flash虚拟的EEPROM指定地址处读取N个字节

void FlashEEPROM_ReadN(unsigned short usAddr, char *pcData, unsigned short usN)

{

i;

unsigned

short

if (usN > 0)

{

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

{

pcData[i] = FlashEEPROM_Read(usAddr + i);

}

}

}

// 向Flash虚拟的EEPROM指定地址处写入1个字节

// usAddr=0~1023

void FlashEEPROM_Write(unsigned short usAddr, char cData)

{

cBuf[1024];

char

unsigned long *pulData = (unsigned long *)(cBuf);

//

读取1KB扇区内容

cBuf,

1024);

FlashEEPROM_ReadN(0,

修改1个字节缓冲区内容

//

cBuf[usAddr & 0x3FF] = cData;

擦除1KB扇区

1024); //

*

FlashErase(SECTION

SECTION * 1024, 1024); // 编程1KB扇区

FlashProgram(pulData,

}

// 向Flash虚拟的EEPROM指定地址处写入N个字节

void FlashEEPROM_WriteN(unsigned short usAddr, const char *pcData, unsigned short usN)

{

cBuf[1024];

char

unsigned long *pulData = (unsigned long *)(cBuf);

short

i;

unsigned

if (usN > 0)

{

读取1KB扇区内容

//

FlashEEPROM_ReadN(0,

cBuf,

1024);

for (i = 0; i < usN; i++) // 修改1KB缓冲区内容

{

cBuf[(usAddr + i) & 0x03FF] = pcData[i];

}

擦除1KB扇区

1024); //

FlashErase(SECTION

*

SECTION * 1024, 1024); // 编程1KB扇区

FlashProgram(pulData,

}

}

文件:main.c

#include "systemInit.h"

#include "uartGetPut.h"

#include "FlashEEPROM.h"

#include

// 主函数(程序入口)

int main(void)

{

char cString[ ] = "Hello, world\r\n";

cBuf[30];

char

jtagWait( ); // 防止JTAG失效,重要!

clockInit( ); // 时钟初始化:晶振,6MHz uartInit( ); // UART初始化

FlashEEPROM_Init( ); // 虚拟的FlashEEPROM初始化

cString, sizeof(cString));

FlashEEPROM_WriteN(100,

FlashEEPROM_ReadN(100, cBuf, sizeof(cString));

uartPuts(cBuf);

(;;)

for

{

}

}

VSAN存储解决方案

目录 1Virtual SAN描述 (2) 1.1Virtual SAN简介 (2) 1.2功能和优势 (2) 1.2.1主要特性和功能 (2) 1.2.2优势 (4) 1.3体系结构 (5) 1.3.1独立节点可靠阵列(RAIN) (5) 1.3.2仲裁和副本 (6) 1.3.3固态磁盘的作用 (6) 1.4基于存储策略的管理 (6) 1.4.1Virtual SAN功能 (7) 1.4.2仲裁示例 (8) 1.4.3虚拟机存储策略 (8) 2配置清单及说明 (11) 2.1硬件配置需求 (11) 2.3Virtual SAN部署要求 (11) 2.3.1vSphere (12) 2.3.2存储要求 (12) 2.3.3网络要求 (12) 3方案优势总结 (14) 3.1评估 (15) 3.2规划与设计 (15) 3.3实施 (15) 3.4运维 (16)

1.1 Virtual SAN简介 Virtual SAN是极其简单的虚拟化层融合的存储解决方案。为vSphere虚拟化架构提供高性能,可扩展的存储解决方案。这是适合任何虚拟化应用程序,包括关键应用工作负载的企业级存储解决方案。它与vSphere和对整个VMware功能的无缝集成使它成为理想的存储平台的虚拟机。 1.2 功能和优势 1.2.1 主要特性和功能 VMware Virtual SAN体现了VMware软件定义存储愿景,它在全面集成的直连磁盘解决方案中纳入基于策略的控制层、以应用程序为核心的服务以及虚拟数据层。VMware Virtual SAN采用分布式架构,利用SSD实现高性能的读/写缓存,并利用硬盘实现高成本效益的数据长期保存。功能特性包括: 内置在vSphere内核中 Virtual SAN在vSphere内核内部实施, 从而优化数据 I/O 路径以提供最高级别的性能以及最小化对 CPU 的影响,同时提供最佳性能和可扩展性。简单的一键式部署——VMware Virtual SAN易于配置和部署,如下图所示,只需要单击对话框就可完成。 全闪存或混合式体系结构 Virtual SAN 可用于全闪存体系结构中,在这样的体系结构中服务器连接的闪存设备提供缓存和数据持久性容量,以实现始终如一的超高性能级别。或者,Virtual SAN 可用于混合式配置中,在这样的配置中服务器端闪存设备进行池化以提供读 / 写缓存,而服务器连接的HDD提供数据持久性。 以虚拟机为中心的基于策略的管理

Fujitsu 存储双活解决方案

谈谈Fujitsu 存储双活解决方案 前两天,《高端存储知识》的作者西瓜哥发表了一篇文章《原来富士通ETERNUS DX S3系列已经支持双活,但好像没有看到仲裁机制》,文中对ETERNUS DX S3系列StorageCluster(存储高可用)解决方案进行了相关的介绍和应用场景的分析。在这里要感谢西瓜哥对Fujitsu ETERNUS存储双活解决方案关注和技术普及,同时,我们也将对文中的一些理解偏差(姑且这么说吧)进行进一步的解释和阐述。 问题一:Storage Cluster是否有仲裁机制? 要回答这个问题,我们首先来看看Storage cluster解决方案架构图。 这里仅简单说明一下:生产存储和备用存储之间使用FC链路,通过存储自带的远程复制技术实现LUN数据的实时同步复制,同时生产LUN和备份LUN都Mapping给前端业务主机。当生产存储出现故障时,将自动切换到备用存储上,由于生产存储和备用存储Mapping 给前端主机的端口共享相同的一组逻辑WWPN/WWNN,所以对前端主机来说,后台只有一台存储,且切换是透明的,所以前端绝大多数应用是不会中断的。

上图中的工作站Storage Cluster Controller就是存储双活解决方案中的仲裁者,它时刻监控着生产存储、备用存储的健康状态,当生产存储或者备用存储出现问题,它就开始执行Failover策略。这里需要说明的是Storage Cluster Controller并不是一个单独的软件,它只是一个后台服务进程,该服务进程集成在ETERNUSSF Storage Cruiser Agent软件中,需要单独准备一台工作站或者服务器安装ETERNUSSF Storage 管理套件。 那Storage Cluster Controller什么时候干活呢?它如何干活呢?它干些什么事呢?那就进入第二个话题----Storage cluster 故障处理机制。 问题二:Storage Cluster 故障处理机制 在一个SAN环境中基本包含三类组件:主机、交换机、存储。StorageCluster不关心前端的主机和交换机故障,只关注存储故障。也就是说主机链路或者交换机故障,多路径软件负责链路的切换,跟后台存储没有一分钱关系。 现分别介绍存储出现故障时,Storage Cluster Controller怎么来仲裁的? 场景一:生产存储RAID故障

华为存储双活解决方案

华为双活解决方案彩页Huawei Active-Active Solution Brochure

前言Overview 随着企业信息系统的快速发展和业务大集中速度的加快,企业信息中心技术风险也相对集中。一旦生产中心需要升级维护,或发生停电、火灾等灾难时,将导致企业业务处理停顿,甚至客户数据丢失,给企业带来巨大的经济和名誉损失。 作为全球领先的信息与通信解决方案供应商,华为基于对企业容灾需求的深刻理解,通过对容灾领域多年的技术研究,开发出华为存储双活解决方案,对用户数据的和业务连续性的有效保护,完成存储资源的整合和按需分配,还通过可视化的管理极大提高容灾业务运维的便利性。 华为存储双活解决方案将帮助企业应对突发事件和灾难,为企业的业务连续性和数据安全保驾护航。 挑战Challenges 随着信息化技术的发展,企业的容灾建设正面临着诸多挑战: 需要保证数据的安全性和可恢复性,满足7x24小时高可靠运行的业务连续性要求。 各类应用系统环境复杂,文件、数据库、虚拟化平台等均有业务连续性需求。 容灾演练操作步骤复杂,需要太多人工干预,容易发生遗漏和误操作;同时容灾 业务管理复杂,运维成本高,效率低。

SAN/NAS/Dorado 其他华为站点A SAN/NAS/Dorado 其他华为站点B 华为公司基于对容灾建设需求的深入了解,结合华为在容灾领域的多年技术积累和优秀实践,推出了华为存储双活解决方案。它在实现了对数据和业务的多层次容灾保护的同时,解决了不同厂商设备之间容灾的兼容性问题,并通过可视化的容灾管理系统,有效提高了容灾业务的管理效率。 为了更贴近客户的真实场景,华为还与应用厂商进行联合调优,共同输出华为存储、网络、光传输设备与应用结合的经过验证的端到端的最佳实践,覆盖Oracle、VMware、SAP等主流数据库、虚拟化和应用平台。 华为双活解决方案Huawei Active-Active Solution HyperMetro 华为存储双活解决方案 Oracle RAC集群 VMware集群 文件系统集群 SAP应用集群 …… SAN/NAS/Dorado 其他华为IP&FC 站点A SAN/NAS/Dorado 其他 华为IP&FC 站点B

相关主题
相关文档 最新文档