Browse Source
shenghui Update
Update desciprion of note 'CPU 刚启动时为什么能直接访问 BIOS 的代码?'
pull/25/head
c-blessed
3 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with
16 additions and
1 deletions
-
FAQ/第一回FAQ.md
|
|
@ -18,4 +18,19 @@ |
|
|
|
 |
|
|
|
|
|
|
|
### 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来讲就从指令地址寄存器(已被初始化)中取到第一个指令的地址,如果从这个地址拿到了有效指令,那么就开始一条一条的跑下去了。因而可以看到,硬件复位地址完全由设计人员决定,不必太过于纠结为何如此,仅需参考芯片手册即可。 |
|
|
|