- 博客(30)
- 收藏
- 关注
原创 【BIOS/UEFI】Edk2中的各个Package是干什么的
MdeModulePkg:提供了一组基于UEFI和PI规范的跨平台的驱动和库,UEFI/PI的基本服务都是由这个目录下的Core模块提供的。
2023-07-10 15:44:41 1187
原创 【BIOS/UEFI】 Memory Service(篇目二)DXE内存服务
DXE阶段内存布局: DXE阶段的内存服务包括: 用于内存的分配和释放,以及获取系统的内存映射。 函数分配请求的页面数,返回一个指针指向内存引用的位置中的页面范围的基址。该函数通过扫描内存映射定位空闲的内存页面。当发现一个物理上连续的页面足够大且满足Type类型时,函数会更改内存映射,指示这些页面是 MemoryType 类型。 函数将由 AllocatePages() 分配给固件的内存返还给系统。 函数返回当前的内存映射。映射是一个内
2023-03-30 09:51:20 1126
原创 【BIOS/UEFI】Memory Service(篇目一)PEI内存服务
HOB是一个临时内存,放在CPU 的catch上,可读可写(使用时是只读的)。PEI阶段,同一模块或者不同模块的function之间用HOB传递信息,可以实现全局信息共享(是共享)。根据不同的使用需求,HOB被定义为不同的Type:【CAR(Cache As RAM)是以CPU的Cache作为RAM为PEI阶段的C提供memory资源,以便EFI尽早进入C语言环境。【PPI共享的是Services。
2023-03-29 17:31:47 1770 4
原创 【BIOS/UEFI】内存布局,包括 PEI Memory 和 DXE Memory
分配机制EFI_MEMORY_TYPE_INFORMATION可保证同种类型的内存尽可能分配在一起。初次分配时需要估算预留空间,在Boot OS前,收集真正使用的内存并用一个EFI Variable保存。在之后的启动就可以得到一个较为准确的预留值(不够再从Remaining Memory中分配)
2023-03-29 17:10:47 1422
原创 【BIOS/UEFI硬件储备知识】内存读写机制
关于一个存储单元的容量的大小是多少,网上有人说是1bit,有人说是8bit。此篇用来给我自己一个满意的答案,也分享给需要的同学。【直接先给出总结:】L-Bank中的基本存储单元的容量是若干个Bit,对于SDRAM,就是芯片的位宽。而每个Bit则是存放于单独的存储体中的,这些存储体是内存最小的存储单元。用硬盘中的簇与扇区来理解内存中的存储形式,扇区是硬盘最小的存储单元,而簇包含多个扇区,是数据交换的基本单位。
2023-03-29 16:33:59 716 6
原创 【BIOS/UEFI硬件储备知识】内存模组结构
单Rank配置的宽度为 64 位,双Rank内存模组的宽度是单Rank模组的两倍,为128 位。每多一列还会增加其他元器件的数量,用于多路器,分路器,以及为了控制位线预充电而增设的元器件。由于SDRAM的工作原理限制,单一的Bank将会造成非常严重的寻址冲突,大幅降低内存效率。Cell是DRAM中能够存储单个二进制数(0或1)的最基本的单元,电容被充电存储为1,放电为0。,存储单元位于行列选择线的交叉处,其存储大小是Chip的位宽,也是Bank的位宽(位宽即每个传输周期芯片能提供的数据量)。
2023-03-29 16:32:04 4066 1
原创 【BIOS/UEFI】PCD配置和使用
DynamicEx类的PCD主要用在二进制文件中使用到PCD的情况,可以实现跨平台访问和修改以二进制发布的驱动中的PCD的值。Pcd 是一个包对外的一个接口,在 Dec(Pkg)中声明,在 Inf (Module)中使用,在 DSC (Platform)中配置。不同类型的 PCD 在 文件中对应的块名称不同,使用多种类型的 PCD 要分别在 INF 文件中对应的块中引用。在 DSC 文件中对 PCD做初始化,如果没有初始化则使用 DEC 中默认的 PCD 值。【进阶PCD类型基本用不到,还有难度,略过……
2023-03-13 10:55:36 2286 1
原创 【UEFI/BIOS】UEFI Shell Command (UEFI Shell 命令)篇目一
显示系统、I/O寄存器、PCI/PCIe配置空间或设备内存的内容。如果不指定-MMIO/IO/PCI/PCIE,则显示系统主内存(volatile或persistent)。显示SMBIOS信息。显示或修改I/O寄存器、内存内容或PCI/PCIe配置空间。显示PCI设备列表,或PCI功能配置空间和PCIe扩展配置空间。显示系统、I/O寄存器、PCI/PCIe配置空间或设备内存的内容。显示PCI设备列表,或PCI功能配置空间和PCIe扩展配置空间。显示或修改MEM/MMIO/IO/PCI/PCIE地址空间。
2023-03-03 17:30:14 13412 1
原创 【BIOS/UEFI硬件知识储备】内存——UMA和NUMA两种内存访问方式
根据处理器对内存的访问方式,将共享存储器方式的分为两大类,即UMA(Uniform Memory Access,统一内存访问)和NUMA(Non Uniform Memory Access,非统一内存访问。
2023-01-31 10:30:21 2245
原创 【BIOS/UEFI硬件知识储备】内存——主板布线、双通道
D-Type插A2、B2槽是没有残线的,插A1、B1槽有了两节残线,导致并行串扰,降低电气性能。依次插(4、4、8、8)时,第一个通道提供8G的内存,与第二个通道提供的16G中的一半构成双通道,共16G。以2个通道4个插槽为例,理论上,在插满4个内存时,由于所有地链路都装有内存,所有的线路等长而完整,讯号损失是最小的,电气性能也是最高的。CPU和内存交换数据的部分叫IMC(Memory Controller I/O,内存控制器),能最大使用多少通道的内存由IMC决定,与主板上有多少内存插槽是没有关系的。
2023-01-31 09:26:34 6300 1
原创 【BIOS/UEFI硬件知识储备】内存——相关电子元器件
MUX(Multiplexer,多路选择器)的作用是从多路输入数据中选择一个输出到唯一的一个输出路线中。分路器与多路器相反,其作用是将单路输入数据输出到多个输出端中的一个,同样也需要控制端的控制。如果三条地址线都是0V(低电平),那么只有最上面与门输出高电平,对应最上面的那条字线(字线0)被选中。一个非门连接两个解码器,可以确保其中一个解码器的启用引脚为1时,另一个解码器的启用引脚一定为0。充电表示二进制数1。地极是电路中其他电压的参考点,所有电压测值都是相对的,即电压测值都要与电路中的另外某个点作比较。
2023-01-30 08:59:40 366
原创 【BIOS/UEFI】HII 基本框架及概述
HII(Human Interface Infrastructure )定义了一套管理用户输入的基础框架。HII数据库主要提供用户安装、卸载以及使用各种字符串、字体和图片等资源的接口。驱动程序和应用程序将元素(如字体、字符串、图像和表单)安装到 HII 数据库中,该数据库充当整个平台的中央存储库。Forms Browser 使用这些元素在显示设备上呈现用户界面,并通过 HID 设备从用户接收信息。
2022-12-23 16:32:16 5586 6
原创 C语言——C预处理器(预处理指令、类函数宏、条件编译、预定义宏)
使用 #define 指令定义符号常量。 预处理器发现程序中的宏时,用宏的替换体进行替换。(注意:这里printf 的双引号里的 x 是文本,而非可被替换的记号,替换的是逗号后面的 x 。) 在C语言中,允许在字符串中包含宏参数。例如,x 是宏参数(形参),则#x 是转换为字符串 "x" 的参数名(形参数名)。 【 PSQR(5)宏展开为:printf( " The square of " "5" " is %d.\n", ( (5)*(5) ) );然后字符串具有联合功能:prin
2022-12-14 11:22:03 482
原创 C语言——按位运算符(按位逻辑运算符、移位运算符)
对于有符号数,其结果取决于机器,空出的位可用 0 补齐,或是用原先运算对象的符号位补齐。按位比较两个运算对象中的每一位,只要其中一个是 1,另一个为 0,则为 1,否则为 0(都为 0,或 1 时为 0)。按位比较两个运算对象中的每一位,只要其中一个是 1,结果就是 1,否则为 0(同 0 为 0,否则为 1 )。按位比较两个运算对象中的每一位,同 1 取 1,否则取 0。// 此时,才修改了 val 的值为 ~val 的值,即 253。按位运算符的应用有:掩码、打开位、变比位、切换位、检查位。
2022-12-12 16:04:19 2094 1
原创 【BIOS/UEFI】SMBIOS
SMBIOS( System Management BIOS)是主板或者系统制造商以标准格式显示产品信息所遵循的规范。依据该规范,BIOS在POST阶段可以知道如何去创建。OS阶段,操作系统和应用程序知道如何使用,解释内存区域表示什么意思。在物理上,SMBIOS是上电开机,BIOS在内存中建立的一块区域,保存了平台的相关信息。在 EFI 系统中,SMBIOS 表的地址可以通过 SMBIOS GUID (SMBIOS_TABLE_GUID)在 EFI 配置表(EFI Configuration Table)中
2022-12-08 13:56:19 3593 2
原创 【C++】变量和变量类型(引用、指针、typedef、auto、decltype)
声明确定了变量的名字和类型,而定义则创建了与变量名相关的实体(申请了内存空间)。变量只能被定义一次,但是可以被多次声明。一个文件中需要使用另一个文件中定义的代码,则必须在该文件中对变量进行声明。如果想要声明一个变量而非定义它,就在变量 前面使用extern关键字,而且不要显示初始化。例如://声明而非定义int j;//声明并定义//非声明而是定义(在给变量赋初值后,关键字extern就失效了,相当于定义。)
2022-11-24 09:53:16 303
原创 C语言——标准函数库
s1 和 s2 的参数类型是 void * ,而void * 类型的指针可以接收任意类型的指针,所以函数memcpy 和memmove 可以实现任意类型的数组的拷贝。(函数 strcpy() 和 strncpy() 只能用于处理字符数组。)函数memcpy() 不知道也不关心数据的类型,更不会做类型转换,它只会做字节拷贝工作。而通过循环(利用循环按下标依次赋值)把一个数组中的值赋给另外一个数组时,在赋值的过程中是会做数据类型转换的。
2022-11-23 15:10:58 2143
原创 指针边角料——void*指针, const指针, 函数指针等
数组变量本身就是const指针,而这里的const的作用是表示数组中的每一个元素都是不可变的,所以数组中的元素只能通过初始化来赋值。NULL 指针并不指向任何对象。记住,除非用于赋值或者比较运算,出于其他任何目的使用NULL指针都是非法的。
2022-11-23 10:27:27 477
原创 UEFI——USB
通用串行总线(Universal Serial Bus, USB)具有支持热插拔插(Hot Plug)、即插即用(Plug&Play)和易扩展的特点。每个 USB 主控制器(USB Host)可通 过 5 层 USB 集线器(USB Hub)来连接多达 127 个外设。USB控制器驱动、USB总线驱动和USB设备驱动构建了UEFI平台的USB驱动协议栈。平台硬件的PCI总线上有一个单独的USB控制器。
2022-11-21 14:02:59 2744 4
原创 UEFI——PCI/PCIe
PCI设备驱动不会使用PCI Root Bridge I/O协议访问PCI设备,而是会使用PCI总线驱动为PCI设备产生的PCI IO Protocol来访问PCI设备的IO/MEMORY空间和配置空间。为1表示使用PCI桥的配置空间;EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL为PCI根桥提供了抽象的IO功能,由PCI Host Bus Controller(PCI主总线驱动器)产生,一般由PCI/PCIe总线驱动枚举设备、获得Option ROM、分配PCI设备资源等。
2022-11-17 17:17:11 4434
原创 Git命令
git status 显示,将要被提交的修改包括readme.txt。在Git中,HEAD表示最新版本,HEAD^是上一个版本,上上一个版本是HEAD^^,第三个版本往上写成HEAD~3。git add 是将文件修改添加到暂存区,git commit是将暂存区中的所有内容提交到当前分支。来跟踪管理版本库的,如果你没有看到 .git 目录,那是因为这个目录默认是隐藏的,用。1、git add告诉Git,把文件添加到仓库(无任何显示则添加成功);2、git commit 告诉Git,把文件添加到仓库。
2022-11-15 15:41:26 111
原创 UEFI——EFI Systable Table
别问图片为啥是两只猫,我也不知道~ 。我想找一个合适的文章标签的没有,然后还是带星必填,哦~好难受。等来日博客等级上三级,本姑娘我自定义一个,哼~
2022-11-07 16:37:57 2174 1
原创 指针和数组C++
数组变量是特殊的指针,数组变量(数组名)本身表达地址。在数组参数中一下四种函数原型是等价的: int demo(int *arr, int n) ; int demo(int *, int); int demo(int arr[], int n); int demo(int [], int);#include<iostream> using namespace std;void minmax(int a[]){ //函数参数表里的数组其实是一个指针...
2022-04-03 20:45:24 567
原创 指针的应用场景C++
应用一:交换两个变量的值【如果不使用指针作为参数是无法交换的!】//交换两个变量#include<iostream>using namespace std;void swap(int *p, int *q){//传入两个指针 int t = *p; *p = *q; *q = t;}int main(){ int a = 5; int b = 6; swap(&a,&b);//调用 ,实参为a,b的地址 cout<<a<
2022-04-03 20:19:08 747 3
获取SMBIOS的Type信息
2022-11-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人