【我所認知的BIOS】—>SPD

本文详细介绍了SPD(Serial Presence Detect)的功能及其在BIOS中的作用,解释了SPD如何存储内存模块配置信息,并通过SMBUS读取这些信息来自动调整内存设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【我所認知的BIOS—>SPD

By LightSeed

2009-7-22

1、什麼是 SPD

存在SPDSerial Presence Detect的縮寫,中文意思是模組存在的串列檢測。也即是通過上面講的I2C串列介面的EEPROM堆記憶體插槽中的模組存在的資訊檢查。這樣的話,模組有關的資訊都必須紀錄在EEPROM中。習慣的,我們把這顆EEPROM IC就稱為SPD了。以往開機時BIOS必須偵測memory,但有了SPD就不必再去作偵測的動作,而由BIOS直接讀取 SPD取得記憶體的相關資料。那我們來看看事物的SPD吧,先看我們的SPD位於記憶體的哪個部位,比如說圖1中紅線框住的地方就是SPD。然後我們再放大來看看我們的SPD,比如說其他記憶體上的SPD放大圖見圖2.

1 記憶體的實物圖

2 SPD放大圖

2SPD內容

SPD是一組關於記憶體模組的配置資訊,如P-Bank數量、電壓、行位址/列地址數量、位寬、各種主要操作時序(如CLtRCDtRPtRAS等)……它們存放在一個容量為256位元組的EEPROMElectrically Erasable Programmable Read Only Memory,電擦除可編程唯讀記憶體)中。讓我們來看看SPDspec的一個截圖,見圖3

3 SPD的內容截圖

實際上在SPD中,JEDEC規定的標準資訊只用了128個位元組(還有128位元組,屬於廠商自己的專用區)。一般的,一個位元組至少對應一種參數,有的參數需要多個位元組來表述(如產品續列號,生產商在JEDEC組織中的代碼)。

其中,一個位元組中的每個bit都可能用來表示這一參數的具體數值。由於SPD的資訊很多,在此就不一一列出了,有興趣的讀者可以參閱相關文檔。

3SPD的作用

SPD內的時序資訊由模組生產商根據所使用的記憶體晶片的特點編寫並寫入至EEPROM,主要用途就是協助北橋晶片精確調整記憶體的物理/時序參數,以達到最佳的使用效果。如果在BIOS中將記憶體設置選項定為“By SPD”。那麼在開機時,北橋會根據SPD中的參數資訊來自動配置相應的記憶體時序與控制寄存器,避免人為出現調校錯誤而引起故障。當然,對於DIYer來說,也可以自由調整時序與控制參數(物理參數仍要借助SPD或北橋自己檢測來確定)。前面所說的 by SPD”在AWXXXsetup介面就會出現了。

上面這三部分,主要是參考百度里的資訊,另外加了自己的截圖等等。

4、讀取SPDread by byte的實戰)

既然SPD裏面存儲有這麼重要的資訊,而且又和整個系統有這麼密切關係,那麼我們應該怎麼讀取出來呢?

關於SPD裏的資訊,要讀取它的話就要說到上一章講的SMBUS的操作了。因為SPD是通過SMBUS來讀取的。在這裏我把主要的讀取演算法寫出來,然後加注我想就可以了。因為如果能夠有心情看這篇文章的人,我想也應該對BIOS有一定興趣的,那麼自己再加點週邊的code肯定是不成問題的啦。

通過SMBUS來讀取SPD大約要有這麼幾個重要的步驟要去做。但是我們要首先明確是以什麼的方式去讀取呢?因為SMBUS的讀取可以分read by byteread by wordread by block。不過現在我們從read by byte開始說起。

通過遍曆PCI設備,比較class code來找到SMbus controllerbase address。這個base address我們可以參考ICH6datasheet的相關說明。(當然只要是ICH系列的datasheet都是可以查閱的。)它代表了SMBUSsystem I/O base address。也就是前面我們提到的SMBUSIO埠。(因為我們都要通過這些IO來實現我們動作比如說readwrite等等。關於怎麼在我們的板子上獲取這個base address,如果您有興趣可以參考我的好友peterhublog“戲說BIOSclock generator”裏有相應的程式操作。)

根據SMBUS的協定,我們要先向controlleroffset 04h也就是(Transmit Slave Address)發送slave address。然後等帶這個SMBUS準備ok

以上兩步ok了以後,我們就可以讀取相應的寄存器了。這是向controllerHost Command0ffset 03h)發的命令。內容就是對應的寄存器indexok了。

有了上面的準備,那麼我們就準備給controller說開始讀取資料吧,這個動作是通過向Host Controloffset 02h)發送讀取的命令48h。(如果不太清楚就自己對應到ICHdatasheet詳細看看是什麼意思。)

經過SMbus準備好了以後,我們就可以從data0這個埠取得我們需要的資料了(offset 05h)。

如果想要把SPD的內容(128bytes)一下子全部讀出來,那麼就直接用加了迴圈就ok了,迴圈~

溫馨提示,在通過SMBUS controller來讀取SPD的內容的時候,一定要去等待SMBUS準備ok才能去讀或者其他操作哦。只需要一直去判斷狀態位元就好了。

下面我提供一段核心代碼,希望以此抛磚引玉的效果,當然我也是參考了別人的代碼:

;[]============================[]

;Input : CL - register index

; CH - device ID

;Output : AL - Value read

;[]============================[]

Smbus_ReadByte Proc Near

Push cx ;保存cx

mov dx,05000h ;SMBus Base address,在我的機器上的

mov dl,04h ;選擇Transmit Slave Address

or ch01h ;read

mov al,ch ;ID cmd(read)

out dx,al

IODELAY

call Chk_SMBus_Ready ;如SMbusok就一直停在這裏,直到超過規定的時間,如果SMbus還不ok那麼就報錯。

pop ax ;恢復cxax

mov dl,03h ;選擇Host Command Register

out dx,al ;把要讀取的寄存器index送出去

IODELAY

mov dl,02h ;選擇Host Control Register

mov al,48h ;下命令開始讀取by Byte Data:

out dx,al Read data

IODELAY

mov cx, 100h

@@:

IODELAY

loop short @B ;這裏這個迴圈是為了讓smbus準備好而加的延時

call Chk_SMBus_Ready

mov dl,05 ;選擇Host Data 0 Register

in al,dx Data0

IODELAY

ret

Smbus_ReadByte Endp

讀取的顯示效果如圖4

4 byte形式讀取的SPD顯示截圖

<think>嗯,用户现在想了解DIMM中EEPROM的作用和功能。结合之前的对话历史,用户已经对DIMM频率有了深入理解,现在转向更具体的硬件细节。看来用户可能是硬件工程师或系统管理员,需要精确的技术信息。从用户引用的资料来看,重点在SPD芯片(即EEPROM)的功能描述。需要特别强调以下几点:1)SPD本质是个配置数据库,存储了JEDEC标准规定的所有关键参数2)它与频率设置直接相关——比如之前讨论的tCL值就存储在这里3)服务器和消费级产品的SPD容量差异(128Bvs256B)值得说明用户可能正在调试内存兼容性问题,所以补充了主板读取SPD的流程图。考虑到ta的专业程度,可以加入电气接口细节(I²C协议)但避免过度展开。最后用“内存配置核心参考”这个比喻来强化认知,比单纯罗列参数更直观。之前的回答提到过RDIMM/UDIMM区别,这次特意在表格中加入SPD内容差异,保持知识连贯性。超频相关内容(XMP)也做了呼应,因为本质上XMP是扩展SPD数据。用户没问但可能需要的隐藏信息:SPD损坏会导致什么现象(开机黑屏/反复重启)、如何重新烧录SPD。不过既然ta没提,暂时不扩展,留在相关问题上即可。</think>DIMM上的EEPROM(即SPD芯片)是内存模块的核心配置存储器,其作用与功能详解如下: --- ### **EEPROM核心作用** 1. **硬件参数存储库** SPD(Serial Presence Detect)芯片本质是一个小型EEPROM,存储内存模块的**物理规格与时序参数**: - 基础配置:内存类型(DDR4/DDR5)、容量、Rank数量、位宽(如64位)、电压(如1.2V) - 时序参数:CL值(CAS延迟)、tRCD(行到列延迟)、tRP(行预充电时间)等[^1][^2] - 制造商信息:颗粒型号、生产批次、序列号 2. **自动配置中枢** 主板启动时通过**I²C总线**读取SPD数据,自动完成内存初始化: ```mermaid graph LR A[主板开机] --> B[读取SPD EEPROM] B --> C{配置内存控制器} C --> D[设置频率/时序/电压] D --> E[内存正常运行] ``` --- ### **关键功能详解** | **功能** | **技术细节** | **影响范围** | |--------------------|-----------------------------------------------------------------------------|--------------------------| | **即插即用** | 主板无需手动配置,自动识别内存规格 | 保障兼容性,简化安装 | | **超频支持** | 存储XMP/EXPO预设:高频/低时序/高电压组合(如DDR5-6000 CL30 1.35V) | 一键超频,释放性能[^1] | | **容错管理** | ECC DIMM的SPD记录纠错算法参数 | 服务器内存错误校正基础 | | **容量扩展** | 记录Rank与Bank数量,支持高密度模组(如LRDIMM的8 Rank) | 服务器大内存支持关键[^2] | --- ### **SPD数据结构示例(DDR4)** ```plaintext 地址 0x00: 内存类型 (DDR4=0x0C) 地址 0x04: 容量 (8GB=0x02) 地址 0x05: 位宽 (64bit=0x08) 地址 0x0E: 电压 (1.2V=0x01) 地址 0x14: tCL (CL16=0x10) 地址 0x15: tRCD/tRP (16时钟周期=0x10) 地址 0x48: XMP配置起始标志 ``` > **注**:UDIMM通常用256B SPD,RDIMM/LRDIMM因寄存器占用缩减为128B[^2]。 --- ### **实际应用场景** 1. **故障诊断** 工程师通过`spd-tools`读取SPD,验证时序是否与标签匹配,排查兼容性问题。 2. **超频优化** 加载XMP配置:BIOS依据SPD中的超频预设自动调整参数(需手动启用)。 3. **服务器部署** 大型服务器启动时读取数十条RDIMM的SPD,同步配置多通道内存控制器[^1][^2]。 > 引用说明: > [^1] SPD存储JEDEC标准参数及XMP超频配置,是主板自动配置的核心依据。 > [^2] RDIMM的128B SPD因寄存器占用空间缩减,但仍包含关键时序参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值