x86 处理器开机顺序

无论是千万行的linux ,还是百万行的uefi ,或者百十行的app, 它都有一个主线。应用程序是main() 函数里面全部函数运行完,程序结束。这里main() 做为程序的起点,uefi 能够觉得,就是peimain.c  dxemain.c bds.c 这三个函数运行完,bios 结束。假设进一步的细分。 假设 把pei 和 sec 叫做early initialization, 这一阶段 主要就是在做microcode 更新。跳到保护模式,用cache 去模拟内存以便实现C函数的子过程调用,内存配置,内存(控制器)的配置,就是mrc
的运行,事实上就是依照 JEDEC 定好的初始化顺序,主要是取得这些信息, rank的数量。 地址是8 bit 还是16 bit, 内存容量,内存的电源管理。page 关闭策略, 内存初始化好之后,就是进行memory 測试。最常见的就是ECC.  当这一切做完了,就把bios 代码 shadowing 到内存上面。  剩下来就是完毕 板子上其它设备的初始化了, GPIO, 中断控制器,timer, 串口, 时钟(超频), pci bus 初始化(就是找到它们,并给它们分资源。 事实上就是内存,i/o space,
mmio, irq, 找到option rom ,以及运行option rom). 网卡初始化, usb, sata. 最后就是 装载os, 通过efi 的 load image 或者 int 19h 去调用 os loader.

Application Processor (AP) 初始化

这年头。即使手机,平板电脑,也配备了多核处理器。BSP + AP 的组合方式。由BSP 负责去初始化系统, 在内存初始化之前,AP 处于未初始化状态。当内存起来之后。内存被初始化,处于等SIPI 状态。 详细是这样玩的:

1 找到microcode ,拷贝到内存中。

2 在SIPI 里面找到cpu code ,拷贝到内存中

3 向全部的处理器发送IPI

4 Disable NEM

5 对全部处理器进行micro code 更新

6 把全部处理器cache 打开

具体的细节去參考software Developer‘s Manual,  更具体的过程就要參考bios writer‘s guide了。

假设从UEFI 的角度看,那么AP 的初始化能够划在PEI 阶段。

CPUID-线程以及core

如今 对一些常见的术语进行解释:

thread. -  线程。 逻辑上的处理器,与其它logical 处理器处于同一个package上面。并与其它逻辑处理器共享资源。

core.  与其它core 处于同一个packge 上面,但不须要与其它core 共享不论什么资源。

package 即我们看得见的芯片,能够包括随意数量的core 和 thread.

Startup Inter-Processor Interrupt (SIPI)

BSP 通过向每个core ,thread 去发送SIPI 去叫醒(wake up) 它们。

详细来说是通过BSP 的LAPIC , LAPIC 标识了SIPI 要发给哪一个AP.

发送IPI JQA是通过写寄存器ICR完毕的, 先来看一下ICR, ICR是64位寄存器。 可分为两个32位寄存器。ICR 的数据结构例如以下图所看到的:

详细过程就是这种:

AP Wakeup State

当AP 接收到SIPI 之后。就開始运行sipi 指向的代码。

Platform 初始化过程:

现行代码分成mem initial 之前的部分和mem initial 之后的部分。即PlatformInitPreMem.c 和PlatformInit.c。

premem 阶段,主要完毕pch 一些主要的初始化(主要是完毕对gpio的定义, LPC IO 的配置), 还有timer 的初始化,

PCH 初始化入口为:PchInitPreMem.c  它主要也是分两个阶段 :early PEI phase(Memoyr 初始化之前) 和memory is available(memory 能用了)

??

??

时间: 2024-10-11 16:44:42

x86 处理器开机顺序的相关文章

分配粒度和内存页面大小(x86处理器平台的分配粒度是64K,内存页是4K,所以section都是0x1000对齐,硬盘扇区大小是512字节,所以PE文件默认文件对齐是0x200)

分配粒度和内存页面大小 x86处理器平台的分配粒度是64K,32位CPU的内存页面大小是4K,64位是8K,保留内存地址空间总是要和分配粒度对齐.一个分配粒度里包含16个内存页面. 这是个概念,具体不用自己操心,比如用VirtualAllocEx等函数,给lpAddress参数NULL系统就会自动找一个地方分配你要的内存空间.如果需要自己管理这个就累了...... 一个分配粒度是64K,这就是为什么Null指针区域和64K进入区域都是 64K的原因,刚好就是一个分配粒度.一个内存页是4K,这就是

[转帖]又一国产x86处理器可大规模上市:Intel至强核心 安全监测管控

又一国产x86处理器可大规模上市:Intel至强核心 安全监测管控 https://www.cnbeta.com/articles/tech/850525.htm 不知道是不是有一起汉芯事件 国产CPU 最近风声狠劲 从去年到今年,中兴.华为等公司接连被美国制裁,刺激了国内摆脱美国芯片依赖的决心,这其中国内依赖最严重的当属高性能处理器,特别是X86,因为X86是当前桌面.笔记本的主流选择,生态最为成熟,短时间替换不了. 有意思的是,最近有不少国产处理器露面了,上海兆芯与VIA威盛合作的兆芯8核X

【X86】---X86处理器大小端的数据存储验证

之前也关注过大小端的存储,可能时间久了,加之又之前的电脑抽象换成了当前的处理器寄存器的值判断,导致自己总是有点蒙圈.看Spec手册的时候,有时会无法与手册中某个Bit的值与RU/RW工具读出来的对应上.这就很尴尬了.专门花时间整理下该部分的内容: 1. 什么是大小端 先解释下什么是大小端(自行百度) 2. X86处理器用RU工具读取的值如何与Spec的描述进行Bit对应 2.1 如:下面是一个Spec中GP_LVL寄存器,另一个是RU工具读出来的.我想判断该寄存器的Bit3的值是多少,这下犯难了

汇编语言:基于 X86 处理器第三章复习笔记

一:基本语言元素 1:整数常量 整数常量表达式:[{ + / - }] digits [ radix ] 整数常量的表达与进制是分不开的,通常通过在尾部添加字母加以区分: 十六进制 h 十进制   t(一般省略) 八进制   o/q 二进制   b 编码实数 r 注意:以字母开头的十六进制为了与标识符分区,必须在前面加数字 0 2:整形常量表达式 整形常量表达式是指一种算术表达式,由整数常量,算术运算符构成,注意:整形常量表达式的运算结果也必须是一个整数常量,其位数应该在处理器的位数之内 算术表

ubuntu双系统开机顺序及时间设置

1,打开终端(按下ctrl+alt+t) 2.输入sudo gedit /boot/grub/grub.cfg,然后输入密码. 3,在弹出到文本文件编辑器里面的第十三行左右到位置的set default=""默认是等于零.这个时候,如果你想默认启用windows,需要看一下开机到时候你的windows排在第几个,假设你的windows排在第n个,则set default里面输入n-1即可 4,大概第三行的位置的else后面到set timeout设置成你想要到开机选择系统的时间!!注意

ubuntu修改grub,修改开机顺序,配置grub启动顺序

方法一: 1.进入Ubuntu系统后打开终端 2.终端中输入以下命令 sudo gedit /boot/grub/grub.cfg 3.找到Windows的配置将其剪切到Ubuntu的前面 把下面 ### BEGIN /etc/grub.d/30_os-prober ###menuentry 'Windows 7 (loader) (on /dev/sda1)' --class windows --class os $menuentry_id_option 'osprober-chain-D4C

《汇编语言 基于x86处理器》第九章字符串与数组部分的代码

? 书中第九章的程序,主要讲了 ● 代码,Irvine32 中的字符串库函数代码范例 1 INCLUDE Irvine32.inc 2 3 .data 4 str1 BYTE "abcde////", 0 5 str2 BYTE "ABCDE", 0 6 msg0 BYTE "Upper case: ", 0 7 msg1 BYTE "str1 == str2", 0 8 msg2 BYTE "str1 < s

《汇编语言 基于x86处理器》第十章结构和宏部分的代码

? 书中第十章的程序,主要讲了结构与宏的使用 ● 代码,使用结构,对比是否对齐的性能差距 1 INCLUDE Irvine32.inc 2 INCLUDE macros.inc 3 4 structN STRUCT ; 非对齐的结构 5 Lastname BYTE 30 DUP(0) ; 30 6 Years WORD 0 ; 2 7 SalaryHistory DWORD 0, 0, 0, 0 ; 16 8 structN ENDS ; 48 Byte 9 10 structA STRUCT

《汇编语言 基于x86处理器》第十三章高级语言接口部分的代码 part 1

? 书中第十三章的程序,主要讲了汇编语言和 C/++ 相互调用的方法 ● 代码,数组求和的几种优化 1 int arraySum(int array[], int count) ; O0 2 { 3 010716D0 push ebp 4 010716D1 mov ebp,esp 5 010716D3 sub esp,0D8h 6 010716D9 push ebx 7 010716DA push esi 8 010716DB push edi 9 010716DC lea edi,[ebp-0