毕业到踏足BIOS一年以来的旅程

心之所向,素履以往,生如逆旅,一苇以航。

2020年六月离开学校开始第一份工作,作为一个涉世未深的少年,遇到了第一个主动询问的上司&hr,不亏待每一份热情,在一番闲聊之后,没投过几次简历的自己就成为了一名赛事数据工程师,正式成为了程序员。之后才了解到,我的简历中有参加过电子设计大赛这一经历,即便是志愿者,却也带来了机遇,不是么

风乍起,合当奋意向人生

第一次租房,第一次上下班,一切都发生的那么自然,但似乎身边的一切并不是那么糟,没有996,没有强制加班,甚至在初入公司时候还能暂住在上司家中,策策和藏藏是他两只宠物狗的名字,那时候想着在校时光感叹没有人不会走,也没有人会一直在,到站了就要下车,空的位置自然会有人代替。可真当联系的时候,还是会有那么一个人保持着当初的模样,能让自己忆起青葱岁月。青春本来就是马不停蹄的相遇和错过,但仍有重逢

所求皆如愿,所行化坦途,多喜乐,长安宁。

由于不可抗力的原因,我离开了公司,告别了第一个伯乐,这个30岁却已能独当一面的青年,对待后辈耐心仔细,房间两三点仍亮着的灯就是这能力最好的见证吧,我心曾经执剑的少年,怎能混迹在市井之间。短短三个月的功夫,体会着自己养活自己的新鲜感,学习着如何与同事们处理好关系,感受着独自拥抱社会的勇气,很感谢给我上了社会生活的第一课,希望安老师保重身体,心想事成

凡是过往,皆为序章。

缘分总是妙不可言,从高中自称Jerry到大学毕业,在同年九月份,我不得不改头换面成为Hubery,主管叫TOM,我何德何能敢以这个名字给代码署名,也许我的入职有jerry的很大功劳,毕竟面试三位就有主管,但以后总有再现的时候吧。
至于面试相关,询问了一些C语言的基础知识,完整的叙述了自己毕设的内容,针对毕设回答几个问题,毕设的亮点等等;关于硬件的只询问了是否学过单片机等专业课,回想起来这也许就是BIOS低门槛的原因吧,就这样,我放弃了C++,开始了嵌套嵌套的C语言中。

我们都在阴沟里,但仍有人仰望星空。

刚步入公司,就遇到了同事离职,比我来的早了些,呆了一个星期,我便顺理成章的继承了衣钵,虽然与同学Java的8K或是1W的大数据相比薪资并不怎么样,但对于佛系的自己而言,这个领域并没有什么不好,即便学习资源相对缺乏,更多的是英特尔的英文文档,但是没有内卷,只有独自作战或是合作两种模式,同事之间的关系永远是这么融洽,在后面的日子里,开始接受公司的培训,百度一些资料,完成公司的课题,与同期同事搞搞研究,直到,2021年三月新员工培训结束,开始看项目源码,而我顺手将培训学得写下,虽然言语凌乱,但还是希望给别人一些帮助,以至于有人以为这些都不是出自于一个入职半年的新人写的,谢谢捧场,帮到就好

我门没有坦途通向未来,但我们还是摸索着蹒跚前行。

由于公司培训的资料是内部的,但整体的旅程重要节点大致如下:
基本知识:在B站有一个老狼发布的视频,讲了一些,https://www.bilibili.com/video/BV1Nr4y1w7dP
练习课题

  • 1:Define PCD and Configure PCD 如何定义一个PCD以及使用PCD
  • 2:TimeOut Variable 引入PCD 和 Protocol, 访问和修改 EfiVariable: L"Timeout", gEfiGlobalVariableGuid, UINT16
  • 3:Add Sample Application to print the memory address
    调用Allocatepool()/AllocatePage()申请内存,修改内容,在shell下读取。通过gBS->HandleProtocol()读取 gEfiLoadedImageProtocolGuid获得Image。
  • 4: Source Level Debug on Emulator platform 学习Debug()和ASSERT()来代替Print()进行打印
  • 5:Add setup option
    在 VFR 修改VFR文件,在表单1中添加一个或多个Display TEXT、oneof、checkbox、numeric
  • 6:Add new DXE driver to set variable , install protocol 通过 gRT->SetVariable()设置变量;通过gBS->InstallProtocolInterface ()安装protocol
  • 7:Add PEIM module to create HOB , install PPI 使用gEfiCallerIdGuid创建GUIDED HOB ;install PPI&LOCATE PPI 需要了解EFI_PEI_PPI_DESCRIPTOR PeiServicesInstallPpi () PeiServicesLocatePpi()
  • 8:Add the public Guid/Ppi/Protocol header file for PEI and DXE 定义GUID并作用于FileInfo.h、DxeIpl.h、StatusCode.h
  • 9:Add new library class and library instance to be used for new added PEI and DXE driver Library的学习使用,添加api function ,并结合 .h .inf .dsc文件进行使用

心怀浪漫,珍惜日常;风尘仆仆,终有归途。

  • 10:Add NotifyPpi and Notify Event for Protocol and EventGroup
    学习notify PPI,并在PEIM Driver ,DXE Driver 中使用 。gBS->CreateEventEx()用于创造notify PPI
  • 11:Use gBS->AllocatePages() service to allocate the different memory type
    结束需要FreePages() and FreePool()来释放空间
  • 12:Add UEFI Application to consume BaseLib & BaseMemoryLib StrLen ()、StrSize ()、StrCpyS ()、StrnCpyS ()、StrCmp ()、StrStr ()、CopyMem ()、SetMem ()、CompareMem ()
  • 13:Add UEFI Application to display UEFI DevicePath
    设备路径的学习使用,ConvertDevicePathToText()将设备路径转换为字符串
    DevicePath,“PciRoot(0x0)/Pci(0x1F,0x0)/Serial(0x0)/Uart(115200,8,N,1)/VenPcAnsi()”
  • 14:Add Application to use BaseLib BitField APIs LShiftU64 ()、RShiftU64 ()、BitFieldRead32 ()、BitFieldWrite32 ()、BitFieldOr32 ()、BitFieldAnd32 () 、BitFieldAndThenOr32 ();逻辑位的使用,(TestValue >> 10) & 0x1f) + ‘A’ - 1,设定TestValue的值 观察结果
  • 15:Add Application to consume macros in Base.h and string functions in BaseLib.h Base.h:MAX_INT32 MAX_UINT32、BIT0…BIT63、SIZE_1KB…SIZE_16GB、OFFSET_OF ()、SIGNATURE_32 () ‘BYO2’ ==> UINT32、BASE_CR ()、ALIGN_VALUE ()、ALIGN_POINTER ()
    BaseLib.h: UnicodeStrToAsciiStrS () L"1234" => “1234”、AsciiStrToUnicodeStrS () “1234” => L"1234"、StrDecimalToUintnS () ‘1234’ => 1234、StrHexToUintnS () ‘0x1234’ => 0x1234
  • 16:Add the application to print FV information 使用 GetSectionFromAnyFv ()在 MdePkg\Include\Library\DxeServicesLib.h get FV data.解析FV image (FvBuffer) EFI_FIRMWARE_VOLUME_HEADER 、 EFI_FFS_FILE_HEADER 、 EFI_COMMON_SECTION_HEADER
  • 17:Add application to dump PCI device information
    MdePkg\Include\Protocol\PciIo.h defines PciIo protocol.
    MdePkg\Include\IndustryStandard\Pci22.h defines PCI definition.
    gBS->LocateHandleBuffer () gBS->HandleProtocol() ;
    PciIo->Pci.Read () to read Pci header (PCI_TYPE00)
    PciIo->GetLocation() to get PCI device Segment, Bus, Device and Function.
    Refer to MdeModulePkg\Library\UefiBootManagerLib\BmConsole.c.
  • 18:Add the application to use IoWrite8 and IoRead8 API In OVMF, write the ascii string to serial port (0x3F8) by IoLib IoWrite8().The example code is in Edk2\PcAtChipsetPkg\Library\SerialIoLib\SerialPortLib.c.

少年与爱永不老去,即便披荆斩棘,丢失怒马鲜衣。

在一系列培训结束后,开始了撰写博客,四处搜集材料,既然是个偏僻的圈子,希望这些博客能存在的久一点,毕竟都是网上的资料,指不定哪天就会被警告,到时自会删除。

我们终其一生都是为了选择的权利以及拒绝的底气。

我想去很远地方,去他乡 陌生方向,漫无目的地流浪,去疯狂 去飞翔,看看成群的牛羊,高原星空的模样,那曲天湖的流淌和海阔天茫。

在EDKII中,可以使用EFI_PCI_IO_PROTOCOL协议来问PCI设备。以下是一个简单的代码示例,用于枚举PCI设备并打印它们的设备ID和厂商ID: ``` #include <Uefi.h> #include <Library/UefiLib.h> #include <Library/UefiBootServicesTableLib.h> #include <Protocol/PciIo.h> EFI_STATUS EnumeratePciDevices() { EFI_STATUS Status; EFI_HANDLE *HandleBuffer; UINTN HandleCount, Index; Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiPciIoProtocolGuid, NULL, &HandleCount, &HandleBuffer); if (EFI_ERROR(Status)) { Print(L"Failed to locate PCI IO protocol: %r\n", Status); return Status; } for (Index = 0; Index < HandleCount; Index++) { EFI_PCI_IO_PROTOCOL *PciIo; UINT16 VendorId, DeviceId; Status = gBS->HandleProtocol(HandleBuffer[Index], &gEfiPciIoProtocolGuid, (VOID **)&PciIo); if (EFI_ERROR(Status)) continue; Status = PciIo->Pci.Read(PciIo, EfiPciIoWidthUint16, 0, offsetof(PCI_DEVICE_HEADER, VendorId), 1, &VendorId); if (EFI_ERROR(Status)) continue; Status = PciIo->Pci.Read(PciIo, EfiPciIoWidthUint16, 0, offsetof(PCI_DEVICE_HEADER, DeviceId), 1, &DeviceId); if (EFI_ERROR(Status)) continue; Print(L"Device %04x:%04x\n", VendorId, DeviceId); } gBS->FreePool(HandleBuffer); return EFI_SUCCESS; } ``` 在此示例中,我们使用gBS->LocateHandleBuffer函数来获取所有PCI IO协议句柄。然后,我们遍历每个句柄并使用gBS->HandleProtocol函数获取PCI IO协议指针。使用PciIo指针,我们可以读取设备ID和厂商ID,并将它们打印到控制台上。 请注意,此示例假定您已经包含了必要的EDKII头文件,并且您的代码将在UEFI固件环境中编译和运行。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值