自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(252)
  • 资源 (2)
  • 收藏
  • 关注

原创 带你从BIOS 小工到年薪百万 之 sense amplifier 的作用以及MRC 如何初始化它

对世界充满好奇心的你,是否想过 其中 Sense amplifier 是做什么用的?BIOS 又是如何训练它的?做过BIOS 的同学,肯定看过这张图片。

2024-04-15 21:59:59 89

原创 解密内存初始化 带你从BIOS 小工到年薪百万

因为DDR 4/5 采用了FLY BY 连线方式,控制信号,命令信号还有时钟到达DIMM 端的时间不一样,TRAINING 就是为了将这些信号对齐。有书的同学打开 4.21.1 Write Leveling Training Mode.没书的同学,私信我,我发给你,18.88 一份。问题引出, 为什么要内存TRAINING?

2024-02-27 22:10:31 1667 2

原创 从软件角度看PCIE

即然PCIE 是串行信号,那只能在“包“里传输地址,数据了,PCI 接口引脚是并行的,PCIE是串行的,每个方向的数据。包怎么传递给对方, 怎么确保不出错,有重传机制,有检验码。首先,要配置,这个设备就有一个地址范围,这个地址,转换。使用的是串行,发送的时候有TX + , TX - ,头部,你是内存读,还是写, 你是IO读还是IO 写。出错的时候,要重传,对这些数据,我们继续添加一些信息。某一个设备发现这个地址是他可以处理的,他就会回应。当时钟的频率越来越高的时候,对高速率的传输,

2024-01-06 11:12:41 440

原创 ddr4 基础

DDR 控制器继续加入延时后发送DQS 信号, DDR4 芯片在DQS上升沿采样CK 信号, 发现CK=1, 则等待一段时间后, DDR4芯片将DQ 信号置高。RESET 释放拉高后, 需要等500US, CKE 才置高有效, 在这个期间DDR4 芯片完成内部初始化, 而这个初始化工作都不依赖外部时钟。DDR 控制器加入步进延时后发送DQS 信号, DDR4 芯片在DQS 上升沿采样CK 信号, 发现CK=0, 则DQ 仍然保持为0,DDR 会读取时钟信号的上升沿和下降沿上的数据。

2023-12-24 20:11:44 571

原创 linx pci 的初始化过程

单纯从一种处理器系统的角度来看, linux pci的实现机制远非完美。在pci_scan_bus_parented 函数调用pci_scan_child_bus 函数时,其输入参数为host 主桥的pci_bus结构, 些pci_scan_slot 函数首先初始化与host 主桥直接相加的pci 设备, 即bus 号为0r pci 设备。pci 总线树枚举由pci_scan_child_bus 函数完成, 该函数的主要作用是分配pci 总线树的pci 总线号, 而并初始化pci 设备使用的bar 空间。

2023-08-23 18:07:17 313

原创 uefi pci bus number 怎么分配

为了存储bridge 和secondarybusno 和 subordinatebusno , 我们要用到pci bar 这个结构体。根据读到的header , 可以判断是device , 还是p2p 桥,还是p2c 桥。列出当前扫到的bus, device, function.枚举parnetbrg 背后的pci bus 以及确定它的子设备需要多少资源。device.address.addr.bus 拥有 primarybusno。从device 0 开始, 一直扫描到31,startbus是传过来的。

2023-08-22 19:35:49 306

原创 PCI 总线树BUS 号

值得注意的是,与host 主桥直接相连的pci 总线,其编号都为0, 因此当处理器系统中存在多个host主桥时,将有多个编号为0 的pci 总线。2,host 主桥首先发现pci 桥1, 并将pci 桥1的secondary bus 命名为pci 总线1. 系统软件将初始化pci 桥1 的配置空间, 将pci 1 的primary bus number 寄存器赋值为0. 而将secondary bus number 寄存器赋值为1, 即pci 桥1 的上游pci 总线号为0, 而下游pci 总线号为1.

2023-08-18 18:10:59 257

原创 signal

在多次传输,想达到更高的带宽,会产生冲突,为什么会冲突呢,因为active 的时候,行列地址都在总线上。相当于人为的引入一些噪声, 让你下面的数据都是无效的,以目前的状态,是否人的margin 还是很好。数据的开始,在这个地方,把我们采样的阀门打开。dqs 是对齐到dq的边沿 , 在silicon 内部,还是通过移位完成的。读信号,dqs 是对齐到dq的边沿, 写信号,dqs 的边沿是对到中间的。我们在dq的最中间的采样,肯定是最安全的。我已经发了,但内部逻辑上,我已经发了这个信号了。

2023-06-11 14:07:15 406

原创 write leveling

但dqs 17 对应clock 1. 我发一个clock 下去, 我期望都在一个command 的clock 下, 所以dqs 的training 分为两步, 第二部叫做write fly by. 发一个command 下去。都是for tx 的, 第二步 就是粗调, 就是write fly by. 首先我不知道 dqs 和clock 两者之间的关系, 我就开始挪, 我也不知道往前挪, 还是往后挪。这就是FLY BY 的模型, 所以,这样子的话,就出现一个问题, 当问题是需要写的时候, 我们暂且理解为同。

2023-06-10 17:31:33 864

原创 pci 介绍

switch 的功能是让root port 接到更多的endpoint. 通常的接法一对多的, 同一个bus, 不同的device , function.一个测试, 叫做ltssm. 如何建立一个machine state 的变化,万一ltssm 出问题的时候,我们知道,大概在哪一层。传送过来,会有一个buffer, 就像讲话一样,讲快了,别人理解不了, 像rap 的时候,就只能知道大概讲了什么。root port: 一个link 开始的位置,他扮演的角色,一个接线生的角色,转达的一个功能。

2023-05-25 16:28:12 1517

原创 uefi 内存管理

memory allocation acpi 指向黄色区域,一会传到dxe. dxe 就知道pei 用了之方面的内存。在此状态下,FLASH 可读不可写,所以是不能使用全局变量的。如果有需要模块间共享信息,需要申请HOB.PEI 阶段最为重要的结构是HOB, 初始化内存服务前,PEI 申请的内存其实是插入到FV 文件。HANDOFF 是第一个hob. 我们平常看代码。也就是FLASH 里面去运行。DXE 阶段就更丰富一些,像。HOB 拥有以下类型。

2023-04-09 17:30:35 1775

原创 服务器RAS

MCA 机制可以上报并尽可能地修复系统总线,ECC, 奇偶校验,缓存和TLB 等等错误,识别故障。AER 机制负责侦测,记录并发送各种IIO 模块的了模块的错误信号,作用域包括iio 模块下的。源并将故障信息记录在mc bank中,通过mac 机制,cpu内部的可纠正错误和不可纠正错误。所有了模块, 如pcie 接口, dmi, iio 的核心逻辑和intel vt -d等。的作用域包括处理器的所有模块,core, uncore, 和iio。RAS 技术主要是通过MCA机制,AER 机制实现的。

2022-09-24 23:26:01 1461

原创 【无标题】cpu 温度获取

//// Name: <CPUHwmSetup.sd>//// Description: HWM form template, setup screen definition file.////<AMI_FHDR_END>//**********************************************************************#ifdef SETUP_DATA_DEFINITION/**********************..

2022-01-25 19:47:57 1822

原创 csapp compile method

Compiling with the CSAPP libraryThe csapp collection of useful auxilliary functions are declared in the file csapp.h and defined in the csapp.c file.These functions include the utility functions for Unix file i/o, sockets, signals, threads and semaphor

2021-11-27 15:25:03 715

原创 申请分配物理页面的操作

#define __get_free_page(gfp_mask) \ __get_free_pages((gfp_mask),0)/* * Common helper functions. */unsigned long __get_free_pages(int gfp_mask, unsigned long order){ struct page * page; page = alloc_pages(gfp_mask, order); if (!page) return .

2021-10-30 16:12:45 1177

原创 失业了就去做网管 利用iscsi 搭建无盘启动服务器搭建以及关键代码的分析

iscsi服务器搭建bios端的设置常见的debug手段关键代码情景分析

2021-09-18 19:49:34 2716 1

原创 iscsi

iscsi (internet small computer system interface)协议由IETF组织制定,旨在基于TCP支持的标准的SCSI (small computer system interface)架构。 SCSI架构包括一个通用的架构模型、基础命令集、适用于不同设备的标准命令集、以及各种SCSI协议。SCSI主要定义系统和IO设备通信的协议,尤其侧重于存储设备。当传统的BUS架构系统发展到网络架构,SCSI需要提供网络支持,iscsi由此应运而生。 SCSI是...

2021-09-15 10:05:01 1335

原创 sel system event log 情况分析

比如进入setup的时候,我们向spService Processor发送一个log,表示来过了,跟串口信息一样,具体长相为:3697 Tue Aug 24 08:32:56 2021 IPMI Log minor ID = e6b : 08/24/2021 : 08:32:56 : System Firmware Progress : BIOS : User-initiated system setup : Asserted3696...

2021-08-24 16:52:06 2663

原创 ctl+alt+del三键重启情景分析

在bios的setup界面,按下cll alt del会由相应的handler函数处理,也就是:/** Function which is called when the Ctrl-Alt-Delete key sequence is detected. This function will cause the system to reset by calling the runtime services table's ResetSystem. @param KeyData P...

2021-08-21 19:52:12 3106 2

原创 一句话说清楚capsuleupdate 工作流程

updateCapsule函数updateCapule用来将capsule传递给系统固件,包含虚拟地址和物理地址的对应关系。系统根据Capsule的炻会采取不同的处理方式,如立即处理capsule,或者系统重启后再对capsule进行处理。EFI_STATUSEFIAPIUpdateCapsule ( in efi_capsule_header **CapsuleHeaderArray, in uintn ...

2021-03-29 00:11:09 4710 3

原创 一句话说清楚c代码中如何内嵌汇编

内嵌汇编语法如下:_asm_ _volatile_ ( 汇编语句模板: 输出部分: 输入部分: 破坏描述部分)下面通过一个简单的例子来熟悉内嵌汇编的语法规则。max@ubuntu:~$ cat add.c#include <stdio.h>int main(){

2021-03-28 20:21:50 2899

原创 C语言与汇编语言的对应关系,以递归调用为例

我们写一个C文件,包含如下代码:root@ubuntu:/home/max# cat rfact.clong rfact(long n){ long result; if (n <= 1) result = 1; else result = n * rfact(n-1); return result;}root@ubuntu:/home/max# 然后使用编译器生成汇编代码,这里我们需要用到-S选项。root@ubuntu:/home/max# gcc -..

2021-03-20 20:46:42 2411 1

原创 可执行文件的内部长啥样

在linux里面,不管是用户空间的应用程序还是各种库,包括内核本身也是ELF格式的。layout以及结构每一个section里面都放着相关文件的各种信息,比如,符号表,以及实际的二进制代码,还有一些固定值的内容,像字符串,程序中用到的常量。我们可以用readelf来分析ELF文件的结构。我们用上面这个程序来阐明可执行文件是怎样生成的。root@ubuntu:/home/max# gcc test.c -o testroot@ubuntu:/home/max# ...

2021-03-14 19:32:25 1693

原创 从dxe 是如何切换到bds 的

在函数 DxeMain (位于MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c )最后一句是gBds->Entry (gBds); 此时由DXE阶段切到BDS.在同一个文件的开始,我们有看到gBds的定义,并赋值为NULL,EFI_BDS_ARCH_PROTOCOL *gBds = NULL;接下来,就会跑到gBds->Entry (gBds), 但我们并没有显式的看到 gBds...

2020-10-10 20:45:12 4195

原创 variable Architecture protocol 的安装

variablearchitecture protocol是pi规范中定义的架构协议。安装此协议的驱动是运行时驱动。它负责注册variable的运行时服务(variable Runtime Service). UEFI规范定义了4个variable运行时服务:GetVariable,GetNextVariableName, SetVariable和QueryVariableInfo. SystemTable->RuntimeServices->GetVari...

2020-09-27 15:26:19 2146

原创 学习 the linux programming interface 遇到的问题以及解决办法 中文名《Linux/Unix 系统编程手册》

1 cd mnt 2 cd /mnt 3 ls 4 cd c: 5 ls 6 cd c 7 ls 8 cd Users/ 9 cd maxwell/ 10 cd Do 11 cd Downloads/ 12 cp tlpi_hdr.h /home 13 suod cp tlpi_hdr.h /home 14 sudo cp tlpi_hdr.h /home 15 cd /...

2020-09-12 22:26:07 1869

原创 举例分析CoreConnectController 的Recursive 参数

ConnectController() Recurive 举例分析Recursive 是一个重要参数, BIOS 对开机时间在是非常在意的,如果每个controller 都以 Recursive 带TRUE,那就会非常耗时。EFI_STATUS(EFIAPI *EFI_CONNECT_CONTROLLER)( IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE *Driv...

2020-06-17 02:14:02 3822

原创 driver model 代码解读

EFI_STATUSEFIAPIAtaAtapiPassThruSupported ( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath ){ EFI_STATUS Status;...

2020-06-16 00:35:31 3293

原创 variable Architecture Protocol 的安装

Variable Architectue Protocol 是PI 规范中定义的架构协议。安装此协议的驱动是个运行时驱动。它负责注册Variable 的运行时服务(variable runtime services). uefi 规范定义了4个Variable运行时服务: GetVariable, GetNextVariableName, SetVariable 和 QueryVariableInfo。MdeModulePkg\Universal\Variable\RuntimerDxe..

2020-06-03 12:51:33 1591

原创 event 情景分析

在进biossetup之前,我们可以在屏幕上显示“Entering BIOS SetupBIOS以一秒为步长周期性的打印到屏幕上。这个就是用event来实现的。相关代码如下: // // Create a timer to indicate "Entering Setup". // IndicatorMessage = NULL; IndicatorMessage = HiiGetString (mStringHiiHandle, STRING...

2020-06-02 10:25:35 3229 1

原创 目标文件格式

在Linux 0.12系统中, GNUgcc或gas编译输出的目标模块文件和链接程序生成的可执行文件都使用了UNIX传统的a.ou格式。这是一种被称为汇编与链接输出(assembly & linker editor output)的目标文件格式。对于具有内存分页机制的系统来说,这是一种简单有效的目标文件格式。a.out格式文件由一个文件头和随后的代码区(text section,也称为正文段)已初始化数据区(data section,也称为数据段),重定位信息区。符号表以及符号名字符...

2020-05-13 23:43:29 1068

原创 dxe 如何跟smm 沟通 SMM Communication Protocol

This protocol provides a means of communicating between drivers outside of SMM and SMIhandlers inside of SMM.SmmCommunication>Communicate();当前在DXE环境,但是需要在smm mode做一些事情。此时就需要把dxe的数据信息传递给smm.然后在smi callback里面做相做的事情。sample:注册一个smi handler cal...

2020-05-10 11:02:33 4035

原创 以i2c触摸板驱动为例讲解edkii 驱动模型

i2c 可能是bios中最简单的驱动了,麻雀虽小,五脏俱全,在程序结构上和其他驱动是没有任何区别的。uefi 为了简化驱动的编写,提出了驱动模型的概念,即所有的驱动,都按这个框架去堆代码。所有follow uefi driver 模型的驱动,都要实现driver binding 协议,也就是包含support, start, stop 函数。通常在drivername.c 就可以找到这些函...

2020-04-21 23:54:17 3879 1

原创 Firmware volume Block 驱动

dxe Foundation 的firmware volume block驱动是只读版本的,所以协议中所有写相关的函数setAttribute()write(), EraseBlock() 都只是简单的返回EFI_UNSUPPORTED.FwVolBlockDriverInit() 函数FwVolBlockDriverInit()函数是内置的Firmware Volume Blo...

2020-04-20 11:28:41 1198

原创 HII 介绍

HII, 全称Human Interface Infrastructure, 定义了一套管理用户输入的基础架构,支持多种类型的用户输入。在这个架构中HII数据库处于底层位置,负责提供用户安装、卸载及使用各种字符串、字体及图片等资源的接口。HII 数据库主要包括以下功能模块:1 HII 数据库协议 以包列表的为单位管理HII相关的数据结构。2 HII字体协议 从HII数据库获取...

2020-03-29 00:01:54 3882

原创 HII数据库协议的实现

本节介绍HiiDatabase 驱动程序中EFI_HII_DATABASE_PROTOCOL协议的实现。在HII数据库中所有的表项均采用包列表的方式存放。包列表由GUID标识其唯一性,每个包列表包含标准头部,含一个或多个GUID包,表格表,字符串包,字体包等等。HII_DATABASE_PACKAGE_LIST_INSTANCE数据结构typedef struct _HII_DATAB...

2020-02-28 22:37:27 958

原创 HII 小节

HII 对大部分工程师可能比较陌生,因为是纯软件的概念。先解释一下package 是什么HII 数据库协议 是以包列表(package list) 为单位管理HII相关的数据结构。目前支持的包类型有://// A package list can contain only one or less than one device path package.// This r...

2020-02-27 23:24:25 1026

原创 人人都会写驱动 (EDK II 常见编译错误及其处理办法)

对于编程来说,如果编译成功了,也就完成了90%。 剩下的总归可以慢慢去debug.一个大型项目,涉及到数万个.c 文件, 往往在a.c 里面需要调用b.c 里面的函数。今天就把常见的编译错误列出来以飧读者。举个例子:在文件:C:\trunk\MaxwellPkg\Library\EcIoLib\EcIoLib.c 存在函数EcMailboxMEMWrite()而我们需要在C:\tr...

2020-01-03 00:30:36 2998

原创 随笔

板子一把点亮,甲方组织庆功宴,芯片厂商,ibv, oem 的十余位研发人员聚在一起,半斤“口子窖”下肚,感觉任督二脉突然就被打开了,瞬间文思泉涌,好多问题一下就清楚了,入行十余年,spec阅读数以万页,现将心得分享给各位,电脑搞开机,其实就是让主板上的每个设备正常工作,那么如何才能工作,这时候就要讲到driver protocol handle device path, install proto...

2019-12-31 11:22:46 773 1

原创 UsbBusControllerDriverStart() 函数

UsbBusControllerDriverStart() 是UsbBus 驱动程序的初始化函数。status = gBS->OpenProtocol( Controller, &mUsbBusProtocolGuid, (V...

2019-12-03 06:58:07 782

汇编语言ppt 了解汇编才是真正了解了计算机

想了解计算机底层原理的,一定不要错过,里面讲解了关于汇编语言的每一个细节

2018-08-24

X86开机过程详解 tex源代码

源代码,你可以自由下载安,更新它,打印它,注明出处就行了。

2015-09-14

空空如也

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

TA关注的人

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