自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 UEFI——PEI阶段

Pre-EFI Initialization(PEI)在引导的早期被调用,仅利用CPU资源调用PEIM,这些PEIM负责:(1)初始化一些永久内存(2)在HOBs中描述内存信息(3)将控制权传递给驱动执行环境(DXE)阶段(4)此外,PEI阶段还负责危机恢复和从S3苏醒。PEI提供了一个公共框架,通过这个框架可以独立的设计、开发、更新初始化模块。开发PEI模块是为了满足PI框架中的以下模块:(1)维护信任链,防止未经授权更新PEI阶段或PEIM。

2024-09-14 15:21:16 704

原创 UEFI——访问PCI/PCIE设备(二)

在使用EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL获取PCI/PCIE设备的时,首先需要获取EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL的所有句柄,获取句柄可以利用gBS->LocateHandleBuffer()函数,当获取到句柄后,利用gBS->HandleProtocol()函数获取到protocol实例,然后就可以调用其中的函数接口了。这三个接口的参数类型是一样的,都是EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_ACCESS。

2024-09-12 16:37:12 1009

原创 UEFI——访问PCI/PCIe设备(一)

PCI(Peripheral Component Interface,PCI)的中文为外围组件互联,所谓的外围组件指的是CPU、内存和芯片组以外的设备,这些设备通常通过各种接口连接到计算机的主板上,以扩展计算机的功能和性能,例如磁盘、网卡、声卡、显卡等。其主要目的是连接周边设备,将低速的设备与高速的处理器结合起来,以解决用户对数据传输速率越来越高的要求。PCIe (PCI Express),PCI扩展是在PCI的基础上发展而来的,最大的区别在于PCI采用并行传输,PCIE采用串行。

2024-09-11 17:50:15 995

原创 UEFI基础概念2——Handle和Protocol

句柄是动态分配的,即Handle不是启动时预先分配好的,而是需要的时候由UEFI固件动态创建的。LocateProcotol():返回第一个与Protocol匹配的Protocol接口的指针,这个函数会查找第一个支持Protocol的设备句柄,并返回该协议的指针。Handle(句柄)是一个或多个协议的集合,Protocol(协议)是由GUID命名的数据结构。使用协议的GUID名称在句柄数据库中注册协议服务,通过使用与协议关联的GUID名称在句柄数据库中查找协议来发现协议服务,以执行查找操作。

2024-09-11 14:05:34 672

原创 UEFI基础概念1——EFI SYSTEM TABLE

传递给映像的最重要的参数就是系统表(system table),这是进入一个UEFI映像的入口。系统表包含了指向各种控制设备的指针,指向引导服务表的指针和指向运行服务的指针,指向系统配置表(如ACPI、SMBIOS,SAL系统表)的指针。gRT是指向运行服务表的指针,EFI_RUNTIME_SERVICES是一个提供一组运行时服务的数据结构,所提供的服务有。Event、Timer、Task Priority Services服务。Protocol处理服务。Variable服务。

2024-09-10 16:19:58 206

原创 UEFI——获取UEFI MemoryMap

内存映射(Memory Mapping)是一种将文件内容映射到进程的虚拟地址空间的技术。在这种机制下,文件可以视为内存的一部分,从而允许程序直接对这部分内存进行读写操作,而无需传统的I/O调用。内存映射缓冲区利用虚拟内存机制,让操作系统将一部分磁盘文件映射到进程地址空间的一块连续区域当中。操作系统负责管理内存页的加载和卸载,应用程序只需要访问这块内存区域即可,从而避免了频繁的磁盘I/O操作和多余的系统调用。

2024-09-09 17:51:49 828

原创 UEFI——Variable的使用

Variable Services是Runtime Services的一部分,提供关于variable的一些服务,Variable被定义为键值对,由标识信息加上属性(键)和任意数据(值)组成。SetVariable接口的作用是设置变量的值,这个接口可用于创建新的变量或修改现有变量的值,函数原型为。配置和数据存储:UEFI变量用于存储固件配置设置、系统状态、以及启动选项等信息。编写INF文件,运行并生成efi文件(在运行efi文件的时候卡住了,原因未知)安全性:UEFI变量可用于存储安全相关的信息。

2024-09-09 15:26:14 245

原创 UEFI——VFR简单使用

VFR(Visual Forms Representation,可视化窗体描述)是一种用户接口组件,在UEFI中,用户接口组件主要有4中:Font(字体)、Image(图像)、Form(窗体)和String(字符串)。在UEFI开发中,FrontPageStrings.uni文件是一个包含字符串资源的文件,用于UEFI界面的本地化。在固件中充当用户界面管理者的角色,它允许用户与UEFI固件的用户界面进行交互。产生一个EFI_IFR_ACTION_OP操作码,是UEFI固件的用户界面框架(IFR)的一部分。

2024-09-09 13:37:53 894

原创 UEFI——使用标准C库

C标准库是ANSL C标准为C语言定义的标准库。C标准库包含15个头文件:assert.h ctype.h error.h float.h limits.h locale.h math.h setjmp.h signal.h stdarg.h stddef.h stdio.h stdlib.h string.h time.h。使用C标准库开发的应用程序有很强的可移植性,标准库为上层应用程序屏蔽了底层平台的差异,使得这些程序可以在任意平台上通过编译。当我们决定在工程中使用标准库函数的时候,有两种方法。

2024-09-06 08:40:12 524

原创 UEFI——Shell下读取SMBIOS信息

SMBIOS的全称为System Management BIOS,它不是一个BIOS,只是与BIOS相关。它是一个规范,定义了BIOS传递给操作系统的系统管理信息。它也表示了一系列的数据结构,包含了各类信息,由BIOS启动过程中创建并放在特定的内存,之后操作系统可以拿来用。整个结构体定义了 SMBIOS 表中的一个基本单元。每个 SMBIOS 结构都包含一个类型、长度和句柄,后面跟着与该类型相关的特定数据。

2024-09-05 15:35:58 368

原创 ARM架构

Arm架构属于精简指令集架构(RISC),具有精简指令集的特征:(1)一个大的统一的寄存器文件(2)一种加载/存储体系结构,数据处理操作只对寄存器内容进行操作,不直接处理内存(有专门的指令进行读写,其它指令不能访问内存,只能处理CPU寄存器)(3)简单寻址模式,所有的加载和存储地址由寄存器和指令决定。

2024-09-05 13:28:35 567

原创 UEFI——文件操作(FileIO)

文件的读写管理通过文件系统来完成,要支持读写文件,UEFI必须首先能操作ESP上的文件系统。首先可以通过两种方式获取EFI_SHELL_PROTOCOL协议接口,EFI_SHELL_PROTOCOL是UEFI规范中定义的一个协议,这个协议允许UEFI应用或者驱动程序与UEFI Shell交互,执行命令、运行其他应用程序、访问文件系统等。在EFI_SHELL_PROTOCOL中有很多对操作,EFI_SHELL_OPEN_FILE_BY_NAME是其中一种,目的是根据文件名打开一个文件或目录,代码原型为。

2024-09-05 08:41:49 262

原创 UEFI——Event(事件)简单使用

在UEFI中所有的异步操作都要通过事件(Event)来实现。事件通常用于通知某个事件的发生,例如设备插入、硬件错误、系统启动等等。UEFI事件可以被不同组件监听,并根据事件类型执行相应的操作。启动服务为开发者提供了一些函数,用于操作事件、定时器以及TPL(任务优先级),这些函数可以分为三类:事件相关函数、定时器相关函数及TPL相关函数。

2024-09-02 19:47:17 300

原创 UEFI——PCD的简单使用

在UEFI固件接口中,PCD(Platform Configuration Database)是一个用于存储和访问平台特定配置信息的机制。PCD允许UEFI驱动程序和应用程序在运行时获取和设置平台相关的参数,而无需硬编码这些值。PCD变量可以被动态的读取和修改。(类似于C语言中的宏而区别于宏)PCD的种类可以分为两大类:(1)在编译过程中起作用,包含以及;

2024-09-02 15:35:38 632

原创 UEFI——HOB简单使用

UEFI提供了HOB(Hand-Off-Block)机制,即在PEI阶段将数据打包成数据块存放在一段连续的内存中,数据块的标识为GUID,DXE阶段可以通过该GUID在HOB中找到对应数据块。HOB 是非常重要数据结构,在CAR时期将会初始化好,UEFI的早期的堆栈都基于HOB,

2024-08-30 15:51:09 860

原创 UEFI——Protocol的使用

1、找到Protocol实例:每个protocol都有一个唯一的GUID,根据这个GUID,利用找到Protocol 实例。2、利用Protocol提供的接口函数实现所需要的功能。3、使用关闭打开的Protocol实例。(这本文中未关闭)

2024-08-29 14:36:48 461

原创 UEFI开发——编写一个简单的PPI

PEI阶段是由一个个的PEIM实现的,而PPI是PEIM之间互相调用的接口。所提供的服务由EFI_PEI_PPI_DESCRIPTOR这个数据结构通过PEIM向PEI foundation进行描述,这个数据结构的原型为。NotifyPpi():PPI里的function不会再派发时就执行,会有一个判定条件,通知系统这个PPI会在某个PPI被安装时才执行。(注意,要想在运行的时候输出以上DEBUG信息,需要在编译包的时候加上DEBUG_ON_SERIAL_PORT)

2024-08-28 16:54:20 462

原创 标准UEFI Shell命令

【代码】标准UEFI Shell命令。

2024-08-27 17:58:04 414

原创 中断和异常(X86架构)

中断门描述符中的段选择符包含了中断程序段的段描述符,由段描述符可以找到中断程序段的基址,过程入口点偏移值包含中断处理程序的段内偏移值,两者结合得到中断处理程序入口点。中断和异常是强制性的执行流的转移,从当前正在执行的任务或程序转移到一个特殊的称作句柄的例程或任务。当硬件发出信号时,便产生中断,中断的产生是同现在正在执行的任务是异步的,即中断的产生是随机的。异常或中断向量号乘以8即可得到IDT中的描述符的索引。过程入口点偏移值是一个32位的值,它表示中断处理程序的入口点在段描述符定义的段内的偏移量。

2024-08-23 16:12:07 626

原创 汇编语言中常用的寄存器

其中,0-1位是RPL(特权等级,请求特权级),第2位是TI位,3-15位是索引Index位。段选择子不直接指向内存的段,而是指向段定义的段描述符。CS:存放正在运行的程序代码所在段的段基址,表示当前所使用的指令代码可以从该段寄存器指定的存储器中获得,相应的偏移量由IP提供。段寄存器分为可见部分和不可见部分,可见部分是选择子,不可见部分是后来根据段描述符的内容填充的,所以说段寄存器读的是16位,写一个寄存器要96位。DS:指出当前程序使用的数据所存放段的最低地址,即存放数据段的段基址,

2024-08-23 10:07:06 809

原创 CPU的特权级(CPL)

如果应用程序请求其它特权级下的计算资源,势必会调用其它特权级下的代码段、数据段、栈,将其它特权级下的代码段、数据段、栈段链接进来。例如,CPU如果跑的是应用程序的代码,就会限制访问一些资源,如果CPU跑的是操作系统内核的代码,就不会有限制。内核代码段、数据段、栈段在计算机启动的时候,由内核自己设置为特权级0,其它特权级下计算机资源加载到内存,由操作系统决定它们的特权级。每个计算机资源都被贴上了标签,即计算机资源特权级,只有CPU特权级比这个计算资源特权级高或同等的时候,才能访问这个计算机资源。

2024-08-22 16:18:14 826

原创 X86架构基础

X86目前的架构有32位和64位两种,不同的架构支持的运行模式也是不一样的,64位的基本能兼容32位。64位是X86架构的主流,本文内容默认以64位位基础。X86平台目前的支持的运行模式有以下几种:1、实模式:这是最早的X86运行模式,用于早期的8086、8088和8080处理器;实模式使用16位地址线,支持最大640KB的内存空间;实模式不支持内存保护、分页和多任务处理等现代操作系统特性。2、保护模式:X86架构的一个重要特性。从80286处理器开始引入;

2024-08-19 18:13:44 871

原创 浅谈虚拟内存

虚拟内存是一种内存管理技术,它为每一个进程提供了一个私有的、连续的空间。每个进程都感觉自己独享了整个内存空间。实际上,虚拟内存通过把物理内存和硬盘存储空间结合起来,实现了这种错觉。虚拟内存实际上就是根据程序的局部性原理,将一个作业分多次调入内存,不用将所有的作业都调入内存就可以启动,将不常用的数据存储在硬盘上。这样就允许程序在运行过程中访问超出物理内存容量的内存空间。

2024-08-19 13:41:45 138

原创 UEFI开发(三)构建UEFI应用

UEFI的主要目的是为了提供一系列的服务和接口,这些服务在计算机启动时由固件(如BIOS)提供给操作系统和应用程序。UEFI规范了操作系统和固件之间的标准接口,使得操作系统能够有效控制硬件,提高系统的启动速度和安全性。Event(事件)服务:允许程序进行异步操作,这是UEFI程序能够执行并发操作的基础。Timer(定时器)服务:配合Event提供定时器功能。内存管理:提供内存的分配和释放服务,管理系统的内存映射。

2024-08-16 11:09:25 355

原创 UEFI开发(二)——UEFI文件关系

dsc文件:edk的平台描述文件,用来描述和编译包。会定义一些变量,设置编译器参数,模块所使用的库的路径,所包含的模块,在编译一个模块的时候,会将模块的inf文件添加到包的dsc文件中。dec文件:包声明文件,声明包的公共数据和接口,有包提供的头文件的所在目录,库和头文件的对应关系、Protocol的GUID、GUID常量等。inf文件:模块的工程文件,用来描述模块的属性,里面会定义模块的变量,源文件、所引用的包的dec文件、所用的库、protocol、ppi、pcd等。

2024-08-14 15:48:27 624

原创 指令集架构——CISC、RISC

通俗来说就是计算机处理器的设计结构和组织方式。它决定了硬件如何执行软件指令,以及如何处理和存储数据。其核心组件为。指令集架构(Instruction Set Architecture, ISA):定义了CPU可以执行的机器指令集合,以及这些指令的编码方式。ISA是软件与硬件之间的接口,它决定了软件如何与处理器交互。微架构(Microarchitecture):也称为内部架构,是指实现ISA的处理器内部设计,包括数据路径、控制单元、寄存器、缓存、管线和其它执行指令所需的硬件。

2024-08-14 10:29:02 1444

原创 UEFI开发——EDK2的Ubuntu16.04环境搭建

在这里我们在Ubuntu16.04的系统上进行搭建,版本过高的系统容易出现问题(利用Ubuntu20.04时安装的GCC9会出现编译错误)。

2024-08-09 19:39:02 368

原创 Linux简介及常用命令

宏内核:内核的所有代码,包括子系统(如内存管理、文件管理、设备驱动程序)都打包到一个文件中。目前支持模块的动态卸载(裁剪)。(3)文件系统:提供了文件、目录和其它文件系统对象的抽象,包括文件操作、文件系统挂载和磁盘空间管理等。(5)设备驱动程序:负责与硬件设备进行交互,包括输入输出设备、网络接口、存储设备等。(2)内存管理:负责文件系统中的物理内存和虚拟内存,包括内存映射和页面置换。(7)安全模块:提供安全机制,以保护系统资源和数据的完整性和机密性。(1)进程管理:负责管理进程的创建、销毁、调度和通信。

2024-08-07 10:17:35 217

原创 启动固件——BIOS、UEFI、云原生固件

而LinuxBoot带来的Linux成熟的协议栈,可以补上这些短板,如网络启动、RedFish等;于是两者结合,提供一个。枚举启动设备,发现启动设备,并把启动设备之前需要依赖的节点打通,开始移交工作,将控制权交给Windows或Linux。这时没有内存,没有C语言运行所需要的栈空间,开始往往是汇编语言,直接在ROM上运行。2、Ram Stage:在经过ROM阶段的困难情况后,有了内存,可以进行初始化芯片组、CPU、主板等模块等核心模块。目前的启动固件有:BIOS、UEFI、coreboot、云原生固件。

2024-08-05 17:45:52 201

原创 AMD CPU处理器可扩展平台

AMD的Rome平台是AMD EPYC(霄龙)7002 服务器处理器的代号,它代表了AMD在服务器CPU市场上的一个重要的进步。Rome平台的特点有:1.核心和线程数量:Rome处理器提供多达64个核心和128个进程,这使得一个双插槽主板能够支持多达128个核心和256个进程。2.制造工艺:Rome处理器基于7纳米制造工艺。3.CPU微架构:Rome处理器采用了AMD的Zen 2 CPU微架构。4.内存支持:Rome处理器配备了八通道DDR4内存控制器,每个插槽最多支持4TB的DDR4内存。

2024-07-29 14:50:59 853

原创 Intel CPU处理器可扩展平台

第三代Intel可扩展处理器平台Whitley采用Ice Lake-SP(),面向2P服务器(2路服务器)。该架构支持每插槽64个PCIe Gen4通道,可实现更高的每核I/O带宽,并在8个通道、2DPC(每通道2个DIMM)配置下支持频率高达3200MT/秒的DDR4内存。

2024-07-29 11:51:03 1440

原创 计算机硬件(二)——通信方式、总线、接口、协议

通信方式是指通信双方之间的工作方式或信息传输方式。终端设备与其他设备的通过数据传输进行通信,根据数据的传输方式,有串行通信和并行通信。串行通信又叫做点对点通信。串行通信(serial communication)是指计算机主机与外设之间以及主机系统与主机系统之间数据的串行传送。使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信。

2024-07-26 16:30:44 1237

原创 计算机硬件知识(一)——存储器

chip往下分是bank,每个bank往下分就是实际的存储单元,横向的一排称为row,直向的一排的称为column,每直向的一排的下方有一个row buffer,用于存储暂时从row排读取到的数据,等待 column 地址送到后输出正确的位,以及判断储存的数据是 0 还是 1。辅存的速度比主存的速度低,而且不能和CPU直接交换信息,但它的容量比主存大得多,可以存放大量暂时未用到的信息,当CPU需要的时候,从辅存调入到主存中。(1)缓存-主存层次解决的是CPU和主存的存取速度不匹配的问题。

2024-07-23 15:27:22 956

原创 BIOS开发之路(三)——UEFI的概念及启动阶段

1、UEFI的全称是Unified Extensible Firmware Interface,统一可扩展固件接口,定义了操作系统和平台固件之间的接口,可以让PC从预启动的操作环境,加载到操作系统上,是BIOS的替代者。UEFI提供给操作系统的接口包括启动时服务和运行时服务。2、UEFI相对于BIOS的改进:(1)UEFI对硬件的支持超过BIOS。UEFI可以使用2.2TB以上的硬盘作为启动盘,而BIOS不借助第三方软件只能作为数据盘。

2024-07-22 16:10:29 1322

原创 BIOS开发之路(一):BIOS的定义和功能

本人作为新入职的BIOS开发工程师,简单记录自己从零开始的学习流程。欢迎一起讨论,指正,建议。

2024-07-22 10:10:48 212

原创 C语言字符串(sizeof strlen)的区别

(1)sizeof求得是占据的字节数,而strlen求的是元素个数。(2)字符串常量包含\0,

2023-04-28 22:26:53 60

原创 C语言小知识

学习C语言中的小知识汇总

2023-04-28 20:59:54 57 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除