shenghui Update

Update desciprion of note 'CPU 刚启动时为什么能直接访问 BIOS 的代码?'
This commit is contained in:
c-blessed
2021-11-19 00:02:53 +08:00
committed by GitHub
parent 66b6ea0c1a
commit 37eb1f8c9c

View File

@@ -18,4 +18,19 @@
![image](https://user-images.githubusercontent.com/25787738/141405471-44a45263-df37-418a-bc47-3bf1f3729f64.png)
### CPU 刚启动时为什么能直接访问 BIOS 的代码?
@解答人ShengHui
可以分两部分来解释1.CPU的硬件通路可以直接访问BIOS的地址。2.CPU复位后的硬件地址在BIOS所在的地址。
首先解释1。在设计CPU时会把CPU可以访问的地址进行划分包括片内的ram寄存器等和片外的ROMDDR其他外设等。当CPU访问这些被提前划分好的地址时会有不同的手段。比如对于 `UINT32 a=*(volatile UINT32)0x1000;` 来说,如果`0x1000`地址被分配至片内ram则CPU会通过片内总线读取这段地址如果被分配至片外则会通过相应的总线进行访问。BIOS通常指代存在BIOS芯片中的程序而BIOS芯片实际上就是一个ROM存储器大部分是FLASHBIOS程序由厂商固化至其中。CPU的硬件通路可直接通过外设总线通常是SPI访问其中内容。
再来解释2。CPU在上电复位后一定是从一个确定的地址启动该地址在PC机的结构下被分配至BIOS所在的地址并由内部硬件逻辑控制。其他类型的CPU可能会被分配至其他片内/片外存储器上如51在0地址启动MIPS大多在`0xBF400000`,不同的CPU复位启动地址可能会不同。 如果想了解更多可继续向下看,本人也不专业,仅做原理说明。
咨询了一下大佬硬件复位逻辑EDA的实现大致如下
```
always@(negedge rstn or posedeg clk)
if(~rst)
begin
reg<=0;
end
else
begin
reg<=wire;
end
```
简单解释下就是当芯片复位假设高有效之前寄存器会被赋一个初值且如果RST没有被放开则所有的逻辑都会被强制拉住不会有任何动作。RST有效之后硬件逻辑才会开始工作对于CPU来讲就从指令地址寄存器已被初始化中取到第一个指令的地址如果从这个地址拿到了有效指令那么就开始一条一条的跑下去了。因而可以看到硬件复位地址完全由设计人员决定不必太过于纠结为何如此仅需参考芯片手册即可。