Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

shenghui Update #25

Merged
merged 1 commit into from
Nov 21, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion FAQ/第一回FAQ.md
Original file line number Diff line number Diff line change
Expand Up @@ -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,寄存器等,和片外的ROM,DDR,其他外设等。当CPU访问这些被提前划分好的地址时,会有不同的手段。比如对于 `UINT32 a=*(volatile UINT32)0x1000;` 来说,如果`0x1000`地址被分配至片内ram,则CPU会通过片内总线读取这段地址,如果被分配至片外,则会通过相应的总线进行访问。BIOS通常指代存在BIOS芯片中的程序,而BIOS芯片实际上就是一个ROM存储器,大部分是FLASH,BIOS程序由厂商固化至其中。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来讲就从指令地址寄存器(已被初始化)中取到第一个指令的地址,如果从这个地址拿到了有效指令,那么就开始一条一条的跑下去了。因而可以看到,硬件复位地址完全由设计人员决定,不必太过于纠结为何如此,仅需参考芯片手册即可。