- 积分
- 1721
- 最后登录
- 2024-3-9
- 精华
- 0
- 阅读权限
- 50
- 主题
- 40
- UID
- 262174
- 帖子
- 3147
- PB币
- 260
- 威望
- 77
- 贡献
- 0
- 技术
- 197
- 活跃
- 1896
- UID
- 262174
- 帖子
- 3147
- PB币
- 260
- 贡献
- 0
- 技术
- 197
- 活跃
- 1896
|
64F
发表于 2015-6-18 16:45:17
IP属地重庆
|只看该作者
本帖最后由 bizongyi 于 2015-6-18 16:46 编辑
hasimu 发表于 2015-6-18 16:40
技嘉官网有3个bios版本 , 我都刷了一遍,
虽有句话说的好,有用的东西记在脑子里,没有的记在笔记本上。但是现在的信息量越来越大,而且随着时间的推移记忆力会越来越不可靠,所以只好把最近工作之余看的一些东西记录下来,避免被迅速忘记。这里就记录一下一些NVRAM相关的东西。
NVRAM的定义就不必罗嗦了,非易失性存储器,当然这种定义很宽泛,我们且不一样一个去说明,这里只说UEFI 里面最常用的狭义的NVRAM(SPI ROM里面的一块区域)。一般而论UEFI当中会用到两块区域作为NVRAM分别为NVRAM,NVRAM_BackUp,至于为什么要这么做其实原因很简单,那就是备份和安全保护,应为NVRAM在DXE阶段是可以读写的,既然能写就表示可能会出错,比如突然断电,软件或者硬件错误等等,而NVRAM作为UEFI当中非常重要的一个可供用来提供系统灵活配置的机制如果没有一套完美的容错机制就会发生很严重的问题,比如某个block由于某些原因出错,我们就需要保证这种错误不会导致系统的崩溃。
再来,NVRAM其实就是在整个SPI rom的区域划分出两个FV,这个FV的属性是可以读写的,在PEI阶段提供readonly variable 的ppi来仅提供读取的功能,在DXE阶段我们 就能在RT service里面提供getvariable和setvariable的服务来通过GUID和variableName来搜索我们需要的变量,如setup的设定值。在X86当中NVRAM所存储的区域是刚好被南桥映射到CPU的内存空间,这个区域可以使用MMIO的方式直接读取和写入
就类似于x86系统在reset的时候从FFFFFFF0位置通过MMIO方式读取第一条指令一样。这个区域的大小是可以通过南桥的相关寄存器来设定的,一般会在sec阶段或者早期的pei阶段去设置它,保证该区域能被正确的映射。当然我们也可以使用南桥的SPI控制器来直接使用NOR Flash的读写命令来直接读写这段区域,就类似于在dos下用软件来刷新bios一样。这种一般会在RT或者是SMM模式下提供一些服务提供给其他的工具来调用,这些超出了NVRAM要将的范畴,先不管。
先讲下NVRAM在SPI Nor Flahs当中是如何存储的。其实它大概分成3部分:每一家的BIOS vendor的实现都不太一样,但是基本的东西差不多,就我看到的AMI A4的和UDK2014里面的实现就不一样,为了不违法NDA这里就只介绍UDK里面的实现方式。
第一部分:这里就只有一个EFI_FIRMWARE_VOLUME_HEADER的头,主要是将整个NVRAM当作一个FV来看待,这里FV的位置有是在buid的时候定义好的不可更改,在AMI的方案当中一般用token来控制,在UDK当中可以使用FDF里面来定义。我们可以从实际的build logo里面找到它对应的位置,然后使用UE来打开2进制文件来查看。这里先上一个UDK里面的图,这里定义NVRAM存在0x280000位置,长度为0xc000.
文章的意思是,NVRAM是存在BIOS ROM中, 为何你刷了bios还是不行?
如果是旧的Legacy BIOS, BIOS default 還是存CMOS里.
但在 EFI里, BIOS default 都是存在SPI ROM 里, 可以說是比較稳, security也比較好.(以前的人喜歡用Clear CMOS來清 Password).
NVRAM里的值是不會拷貝到CMOS的,因為沒有這種必要.
再加上 BIOS setup 的值越加越多, CMOS的容量也放不下那么多. |
|
|