- 博客(126)
- 收藏
- 关注
原创 UEFI学习笔记(十九):SEC 和 PEI阶段
Cache设置为no-eviction模式,实现数据存储功能:读取命中时返回Cache中的数据,读取或写入缺失时不会触发主存的缺失事件,从而将Cache用于临时存储。Hdr提供 PEI 服务表的头部信息,包括:1)PEI_SERVICES_SIGNATURE:表明这是 PEI 服务表。它提供了 PEI 阶段的核心服务。PEI阶段的资源仍非常有限,内存到了PEI后期才能被初始化,这主要是为DXE准备执行环境,把需要传递到DXE的信息组成HOB(Handoff Block)列表,最后把执行权转交DXE。
2024-11-25 09:48:32
1326
原创 UEFI学习笔记(十八):ARM电源管理之SCMI
PCSA 定义了系统控制处理器SCP的概念,SCP 用于抽象化电源和系统管理任务,接收来自应用处理器(AP)和其他系统代理的请求,协调这些请求,将平台中的组件置于合适的电源和性能状态。SCMI 特别适用于这种类型的系统。PSCI 接口并不涉及动态电压频率调节(DVFS)或设备电源管理(如外设的管理),对于这些功能,ARM 建议使用高级配置和电源接口(ACPI)或系统控制和管理接口(SCMI)。总的来说,SCMI 通过提供一套标准的接口规范,支持在微控制器管理的系统中进行高效的电源、性能和其他系统管理任务。
2024-11-18 18:24:02
1466
原创 UEFI学习笔记(十七):SMCCC概述
SiP 服务调用是 Secure Monitor Call (SMC) 中的一个子集。SiP 服务调用是通过 SMC 指令触发的一组特定功能,由芯片制造商定义,用于满足特定硬件平台的需求。这些功能通常与硬件安全、平台管理、设备初始化相关。
2024-11-18 17:58:04
1087
原创 UEFI PEI阶段的一些基本概念
PPI 是在 PEI 阶段提供的接口协议,由服务提供方和调用方实现。PPI 定义了一组函数或服务,其他 PEI 模块可以通过注册的 PPI 接口来访问和调用这些功能。例如,内存初始化、存储设备检测等功能都可以通过相应的 PPI 提供支持。
2024-11-15 18:31:49
693
原创 UEFI学习笔记(十六):edk2子目录大致介绍
它提供了支持嵌入式设备开发的工具和模块,涵盖了嵌入式平台的特定需求,例如硬件初始化、系统引导、设备驱动和平台配置等。通过实现不同的文件系统协议,如 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL 和 EFI_FILE_PROTOCOL,该驱动程序使 UEFI 环境能够访问存储设备上的文件系统,如 FAT 文件系统。**功能:**提供图形输出支持。UEFI 模块开发环境的核心包,提供构建 UEFI 模块所需的基础库、头文件和工具,定义标准协议、库和环境,为所有模块提供支持。
2024-11-15 14:09:02
980
原创 UEFI学习笔记(十五):edk2 UEFI HII Driver概述
一、概述二、相关ProtocolsHII 是一种用于在 UEFI 环境中创建和管理用户界面的标准。它定义了如何描述和显示用户界面元素(如菜单、按钮和文本框),以及如何处理用户输入。定义在UEFI Spec里面。HII 允许固件开发人员构建复杂的用户界面,而无需依赖特定的硬件或操作系统。HII Driver是一个用于实现用户界面元素的驱动程序。HII 驱动程序的主要作用是在 UEFI 固件环境中提供图形用户界面(GUI)支持,并管理与用户界面相关的数据结构和功能。在BDS期间加载。
2024-11-04 15:34:33
1175
原创 UEFI学习笔记(十四):UEFI驱动的分类与UEFI驱动模型
一、UEFI Driver模型1、定义2、如何加载二、Driver Binding Protocol2、Start()3、Stop()Device Driver 在 DXE 阶段加载,而应用程序则在 BDS 阶段加载。通过在 BDS 启动时访问设备,可以提供相应的输入和输出设备。引入 Device Driver 旨在实现更好的模块化管理,主要用于设备管理。它支持二进制发布,并可以集成到 Option ROM 中,同时提供清晰的外部接口,从而提升固件的扩展性。
2024-11-04 11:02:16
860
原创 UEFI学习笔记(十三):Capsule Update
在UEFI(统一可扩展固件接口)中,胶囊更新(Capsule Update) 是通过胶囊文件来更新固件组件(如BIOS或系统固件)的机制。是 UEFI(统一可扩展固件接口)规范中定义的一种数据结构,用于描述系统中固件更新资源的信息。ESRT 的主要目的是为操作系统或固件更新工具提供一个统一的接口,以便于发现和管理可更新的固件组件。FMP 主要用于支持固件更新的功能,包括固件的发现、管理和更新。胶囊内包含的更新负载是实际要应用的固件或数据,可能包括更新的BIOS代码、ACPI表、微码或其他系统关键更新。
2024-10-31 15:52:22
1380
原创 UEFI学习笔记(十一):SMBIOS的概述与访问
一、概述二、SMBIOS结构三、SMBIOS的访问1、获取 SMBIOS 入口点2、初始化和检查入口点3、访问 SMBIOS 结构表4、遍历 SMBIOS 结构5、解析每个结构6、输出信息7、错误处理SMBIOS(System Management BIOS)是一种在计算机系统中用于管理和获取硬件信息的标准接口。它提供了一种结构化的方式,通过 BIOS 来传递有关系统硬件的详细信息,包括处理器、内存、主板、以及其他组件的信息。
2024-10-16 15:28:22
1366
原创 UEFI学习笔记(十):系统表与ACPI表的遍历
SMBIOS(System Management BIOS)是一种在计算机系统中用于管理和获取硬件信息的标准接口。它提供了一种结构化的方式,通过 BIOS 来传递有关系统硬件的详细信息,包括处理器、内存、主板、以及其他组件的信息。SMBIOS 数据结构以表的形式存在,通常在系统启动时由 BIOS 提供,操作系统可以通过读取这些表来获取所需的信息。
2024-10-08 16:19:35
787
原创 UEFI学习笔记(九):ACPI详解
DSDT (Differentiated System Description Table)是 ACPI 表中的核心之一,定义了系统中的硬件和设备。它包括设备对象、方法、操作和控制策略。DSDT 描述了系统的设备和其功能,提供了系统启动和运行时所需的基本设备信息。通常在系统固件中存储,并由操作系统在启动时加载和解释。
2024-09-14 09:57:16
2453
原创 UEFI入门学习笔记(详细版,持续更新)
每个平台有其对应的 .dsc 文件(平台描述文件)和 .fdf 文件(固件描述文件),用来定义要构建的平台、所包含的模块、库、驱动程序,以及固件映像的布局。.dsc 文件是编译每个模块的主要参考,而 .fdf 文件是生成固件映像时的重要文件。模块是一个最小的可编译单元,Package是最小的对外发布的单元。模块放在包里面的。模块包括LibraryDriver等类型。每一个模块都有一个INF文件。HOB(Hand-Off Block)主要用于在不同的阶段共享数据。
2024-09-13 10:29:49
2273
原创 UEFI学习笔记(八):Memory Services
HOB(Hand-Off Block)主要用于在不同的阶段共享数据。由于Flash是只读的,直接修改全局变量是无效的。因此,在PEI(Pre-EFI Initialization)阶段,需要使用HOB来共享全局信息。HOB提供了一块临时内存,这块内存是CPU缓存的一部分,可以进行读写操作,从而在不同的阶段之间传递和共享信息。
2024-09-12 14:42:53
1637
原创 UEFI学习笔记(七):UEFI_Spec_2_10 Protocols整理
用于定位EFI MTFTPv4协议(Multicast Trivial FTP)驱动程序支持的通信设备,并创建和销毁可以使用底层通信设备的EFI MTFTPv4协议子协议驱动程序的实例。它提供了一组函数,用于初始化、控制和操作显示设备的图形输出。用于定位由EFI UDPv4协议驱动程序支持的通信设备,并创建和销毁可以使用底层通信设备的EFI UDPv4协议子协议驱动程序的实例。用于定位EFI IPv4协议驱动程序支持的通信设备,并创建和销毁可以使用底层通信设备的EFI IPv4协议子协议驱动程序的实例。
2024-09-12 09:14:33
757
原创 UEFI学习笔记(六):EDK II 模块:Libraries,Drivers&Application
(os loader 是一种特殊的application,执行完成后不会return或者exit,相反会调用EFI boot service gBS->ExitBootServices()来将控制权从fireware 传递给os)Driver可以依赖Library,Driver可以生产protocols,主要用于支持硬件。里面的(Package是EDK II 最小的对外发布的单元)。App是被UEFI loader加载的,不会装protocols。每一个模块都有一个INF文件。对应的是一个模块(INF)
2024-09-11 17:21:38
786
原创 UEFI学习笔记(五):EDK II PCD的概念、类型、使用
如果在BIOS里面有一些模块是binary方式集成进来的而这些binary又需要用到PCD(用于Binary Release),那么这些Binary集成的要用到的PCD就必须要设置为。PCD的值存在memory里面,下次启动时,上次更改的值丢失了,每次启动都是从default值开始。是存在VPD空间的(在FLASH上,只读),一般是出厂配置。如果platform是从源码build出来的,没有binary在里面的时候,PCD用的都是。作用域在一个模块中(模块级的),可以在Binary Level进行修改。
2024-09-11 14:42:29
1298
原创 UEFI学习笔记(二):edk2构建编译流程
每个平台有其对应的 .dsc 文件(平台描述文件)和 .fdf 文件(固件描述文件),用来定义要构建的平台、所包含的模块、库、驱动程序,以及固件映像的布局。.dsc 文件是编译每个模块的主要参考,而 .fdf 文件是生成固件映像时的重要文件。
2024-09-10 11:10:36
1355
原创 动态链接库加到环境变量的方法 error while loading shared libraries问题的解决方案
用静态链接库会把库直接编译进去,用静态链接库需要把库添加到环境变量,不然会出现:error while loading shared libraries1. 把它们复制到系统环境变量已有的路径下,如 /usr/lib /usr/local/lib 这些2. 另外放到一个专有目录,将路径export 到环境变量或者修改 ~/.bashrc ,在.bashrc文件中添加如下内容:
2023-07-25 14:03:25
655
原创 安装交叉编译工具链aarch64-linux-gnu-g++ 以及cmake测试
【代码】安装交叉编译工具链aarch64-linux-gnu-g++ 以及cmake测试。
2023-07-24 11:07:06
12678
3
原创 6.28 内存分配/管理 学习总结
在应用程序中,内存中连续的8个字节看似是连续的,但是在物理上并不是连续的,这是由于8个bank实际上是可以并行工作的。内存对其的情况下,工作一次,把得到的数据拼起来,就能得到内存中地址连续的8个字节,从而提高了IO效率。通过上述实验结果可以得出,在64位系统下,我们申请的内存实际占用的大小会是16x + 8,分配的内存大小在每个区间内会对应相同的一个实际占用内存大小。内存对齐就是把各种类型数据按照一定的规则在空间上排列,而不是按照顺序一个接一个的排放,这种就称为内存对齐,内存对齐是指首地址对齐。
2023-06-28 10:32:13
357
原创 Leetcode C++: 剑指 Offer 07. 重建二叉树 (根据前序遍历和中序遍历的结果)
根据该位置以及中序遍历的右边界计算出root的左边的节点个数, 然后new一个root,通过递归给root->left和root->right赋值。输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。我们需要根据前序遍历的根节点的值去定位到中序遍历中root的位置,假设输入的前序遍历和中序遍历的结果中都不含重复的数字。递归结束条件: 左边界 > 有边界。前序遍历:[根,[根的左],[根的右]]中序遍历:[[根的左],根,[根的右]]
2023-04-10 16:30:11
112
原创 3.17 Leetcode: 2389. Longest Subsequence With Limited Sum 和有限的最长子序列
对nums进行从小到大排序 (因为从小的数开始取 才会最长)然后求前缀和 遍历queries数组 找前缀和中第一个大于q的数的地址(利用upper_bound函数), 该地址减去 前缀和的初始地址 就是最大长度。
2023-03-17 21:28:35
122
原创 3.15 Leetcode: 1615. Maximal Network Rank
网络秩 = i节点相连的道路 + j节点相连的道路 - nb[i][j] (遍历更新)定义一个邻接矩阵nb 表示 两个节点是否相连 相连为1 不相连为0。最大网络秩是与两个城市直接相连的道路总数的最大值。
2023-03-16 20:04:43
183
原创 Leetcode: 2488. Count Subarrays With Median K 统计中位数为 K 的子数组
3、遍历剩下的数 计算前缀和 等于k为0 大于k为1 小于k为-1 如果在map中找到presum 或者 presum - 1 说明存在map[presum] / map[presum - 1]个满足条件的数组 用cnt进行计数。1、用哈希表存放前缀和对应出现的次数 由于 为偶数时中位数是左边那个 说明 左边可以少一个比k大的数。2、先遍历统计 k前面的数的前缀和出现的次数 大于k为1 小于k为-1。
2023-03-16 16:56:47
178
原创 Leetcode:1605. Find Valid Matrix Given Row and Column Sums 给定行和列的和求可行矩阵
每个的值必须要小于 当前行的和and当前列的和 所以为 min(rs[i], cs[j])并且对每行的和 and 每列的和进行更新 (-val)
2023-03-14 21:15:01
131
原创 Leetcode: 2383. Minimum Hours of Training to Win a Competition 赢得比赛需要的最少训练时长
2、再考虑经验, 遍历 ex:experience, 如果当前initialEnergy > ex,则不需要额外训练,且initialEnergy += ex;如果当前initialEnergy > ex, 则需要额外训练ex - initialExperience + 1小时,且initialEnergy = initialEnergy + (额外训练的) (ex - initialExperience + 1) + (比赛赢获得的)ex = ex * 2 + 1。
2023-03-13 10:52:11
103
原创 Leetcode : 1590. Make Sum Divisible by P
移除subarray 只需要固定两个端点 (subsequence 移除不一定连续的子序列)1、前缀和 + 暴力解法 (超过时间了 没通过 但逻辑应该是没问题的)2、前缀和 + 哈希表。
2023-03-13 10:06:25
319
原创 Leetcode DAY 60:柱状图中最大的矩形Largest Rectangle in Histogram
【代码】Leetcode DAY 60:柱状图中最大的矩形Largest Rectangle in Histogram。
2023-03-10 11:19:50
168
原创 Leetcode DAY 59: 下一个更大元素 and 接雨水
循环遍历height[i] 当height[i] 比栈顶元素大 说明找到凹槽 当前栈顶元素为mid 栈顶元素的下一个元素为左边最大 当前i为右边最大。相较于I, 主要是数组变成了环状的, 需要循环数组两边 将 i下标 替换为 i % nums.size()用 Lh[i] = max(Lh[i - 1], height[i]) 对左边最大元素进行更新。第i列的储水量为 min(Lh[i], Rh[i]) - height[i]用两个数组记录每个元素左边最大的元素和右边最大的元素。
2023-03-10 10:20:59
116
原创 Leetcode DAY 58: 每日温度 and 下一个更大元素 I
把第0个元素(的下标)放入栈中 从第一个元素开始遍历 比较第一个元素和栈顶元素的大小 如果小于等于栈顶元素 放入栈中 循环判断如果大于栈顶元素 则得到当前res[st.top()]为当前元素和栈顶元素下标的差值 再把当前元素放入栈中。本题相当于找nums2中第i个元素右边比他大的第一个数 并且把第i个元素与nums1中的元素进行匹配 把右边第一个比他大的数放进res[index]中。两个for循环 遍历并判断(超出时间限制了)496.下一个更大元素 I。
2023-03-08 21:23:21
70
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人