日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

UEFI——PCD研究

發(fā)布時(shí)間:2023/12/16 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UEFI——PCD研究 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

??今天看UiAPP下的入口函數(shù)InitializeUserInterface()時(shí)看見一個(gè)PcdGet32,不明白是干什么的,VSCode上顯示的是本函數(shù)相關(guān)的信息(顯然不對(duì) ),后面搜索不到相關(guān)的源碼。之后就去補(bǔ)充了相關(guān)的知識(shí),記錄一下,算是一個(gè)比較簡(jiǎn)單淺顯的版本。

UEFI——PCD研究

    • 1 PCD OVERVIEW
    • 2 PCD USAGE
      • 2.1 PCD TYPES
        • FixedAtBuild
        • FeatureFlag
        • PatchableInModule
        • Dynamic/DynamicEx
        • DynamicHII/DynamicVpd
      • 2.2 EXAMPLE
    • 3 AutoGen
    • 4 PCD LIBRARY

1 PCD OVERVIEW

PCD(Platform Configuration Database),是一個(gè)UEFI下可訪問的數(shù)據(jù)庫(kù),EDK2用來進(jìn)行全局配置,對(duì)代碼復(fù)用,模塊化開發(fā)有巨大的幫助。
??具體來說就是,代碼中進(jìn)行平臺(tái)配置相關(guān)的東西,platform需要改的時(shí)候不用去修改代碼了。在編譯的時(shí)候,運(yùn)行的時(shí)候,甚至是生成了二進(jìn)制的時(shí)候都可以配置、修改。更容易有針對(duì)性的設(shè)計(jì),對(duì)代碼的維護(hù)也會(huì)方便很多。(有點(diǎn)類似于.uni和.Vfr的機(jī)制)
??雖然在EDK2源碼中他涉及到的宏很多,但是這種方式確實(shí)是有別于C/C++的宏,并不是簡(jiǎn)單的公用代碼的提取,或者說完全不是一個(gè)東西。

PCD變量格式

TokenSpaceGuidCName.PcdCName

其中TokenSpaceGuidCName是一個(gè)GUID,而PcdCName是這個(gè)PCD變量的名字,這兩個(gè)加在一起構(gòu)成了一個(gè)PCD變量。


2 PCD USAGE

2.1 PCD TYPES

PCD可以分為兩類:
1)有三個(gè)分別是:FixedAtBuild PCD , FeatureFlag PCD,PatchableInModule PCD , 其中 FixedAtBuild PCDFeatureFlag PCD 在編譯的時(shí)候起作用的,靜態(tài)的。類似于C中的靜態(tài)全局變量,但是后面不能修改。在定義的時(shí)候就賦值了,之后是不能用代碼修改的,只能是在.dec/.dsc中修改。
PatchableInModule PCD在編譯完成后的二進(jìn)制文件上是可以用特殊的辦法更改的。后面詳細(xì)介紹。
2)Dynamic/DynamicEx PCD 等其它的 可以稱為動(dòng)態(tài)的,在UEFI運(yùn)行的時(shí)候可以get,還可以用set宏修改,作用域是system級(jí),在代碼中傳遞和使用。(比前面的復(fù)雜一些)

FixedAtBuild

編譯階段確定的值,整個(gè)UEFI運(yùn)行階段不可改的靜態(tài)值,二進(jìn)制下也不可以改,可以認(rèn)為是一個(gè)宏,const全局變量。是一個(gè)module level,并非系統(tǒng)級(jí)別的。即是說不同模塊可以配置不同PCD的值。

FeatureFlag

也是編譯時(shí)確定的靜態(tài)設(shè)置,看名字中有個(gè)Flag也能猜出來這是個(gè)Boolean類型的,他和FixedAtBuild最大的區(qū)別就是他返回值就是一個(gè)TURE或者FALSE。用于判斷條件中,也是一個(gè)module level的。

PatchableInModule

在編譯時(shí)確定值,和FixedAtBuild一樣也是module level,只能影響一個(gè)模塊,不會(huì)影響其他的模塊,相當(dāng)于一個(gè)inf 的 source范圍。不同是他在編譯后的二進(jìn)制文件中可以用工具修改,并且他不是const 的全局變量。

Dynamic/DynamicEx

動(dòng)態(tài)值,在整個(gè)UEFI運(yùn)行的過程中,有人會(huì)get,有人會(huì)set,是一直可以改變的值,system level,作用域是整個(gè)system。整個(gè)BIOS代碼每個(gè)模塊訪問這個(gè)Dynamic PCD 都是共享同一個(gè)值,如果某個(gè)模塊修改了他的值,那么其他模塊訪問的就是修改以后的值了。通過set宏來改變。Dynamic 有三個(gè)子類DynamicHII、DynamicVpd、DynamicEx。區(qū)別目前還不是特別理解,只知道DynamicExDynamic的加強(qiáng)版,如果在代碼中沒有二進(jìn)制形式,或者二進(jìn)制文件沒有用到PCD,那么這里使用的PCD 類型就是Dynamic的,但是如果是用binary方式集成進(jìn)來了,要使用二進(jìn)制中的PCD就必須要用DynamicEx類型的PCD。

DynamicHII/DynamicVpd

DynamicHII與Dynamic不同,后者是放在memory中的,也就是說修改了再加載的話會(huì)丟失上一次的值,獲取到最新define的值。而DynamicHII是放在EFI variable(NVRAM中)的,修改是非易失性的,就是set了以后下次加載還是這次set的值。
DynamicVpd ReadOnly,不可寫。存放系統(tǒng)的default section,廠商的出廠設(shè)置就放在這里,是必不會(huì)也不可被修改的。

2.2 EXAMPLE

原本計(jì)劃介紹 FixedAtBuild 類型的,但是我看到的代碼中的PcdSetupVideoHorizontalResolution是PatchableInModule類型的,這兩個(gè)類型的訪問方式?jīng)]什么不同,后者只是可以在二進(jìn)制文件生成之后修改,而前者不可以。
PcdSetupVideoHorizontalResolution在源碼中的位置:

可以看到也是有這個(gè)PcdGet32宏,我也是因?yàn)闆]找到這個(gè)的定義才進(jìn)行相關(guān)知識(shí)的學(xué)習(xí)。

  • 在.dec文件中聲明這個(gè)PCD變量:

  • 源碼:

    [PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution|800|UINT32|0x4000000b

    介紹一下聲明的格式:
    ??他這里有兩句,第一句[PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx],聲明了這個(gè)PCD的類型,就前面介紹的PCD類型。
    ??第二句的規(guī)則是這樣的:

    #Comment PcdTokenSpaceGuidName.PcdTokenName|Value[|DatumType[|MaxSize]]|Token

    PcdTokenSpaceGuidName.PcdTokenName前面已經(jīng)介紹過了,不可以重復(fù),也不可以輕易改變,這兩個(gè)共同構(gòu)成一個(gè)PCD變量。Value也叫做DefaultValue 就是這個(gè)PCD變量的默認(rèn)值,如果你在后面的.dsc文件中沒有修改他的值,他就是用這個(gè)默認(rèn)值。DatumType是這個(gè)PCD變量的數(shù)據(jù)類型有UINT 8 16 32 等等,如果是VOID * 的話還要在MaxSize部分寫上這個(gè)Buffer的最大值,比如128、256等等。Token是UINT 32類型的,每個(gè).dec文件中的PCD都有獨(dú)一無二的Token。

    他是符合BNF的,#后面的是注釋,[ ]內(nèi)的是可選項(xiàng),沒有應(yīng)該也可以。

  • 在.dsc中可以修改

    修改的規(guī)則:
  • [Pcds...] PcdTokenSpaceGuidName.PcdTokenName|Value[|DatumType[|MaximumDatumSize]]

    這些字段的值和前面的一樣,[ ]內(nèi)的也是可選的,不是必須包括的。一般的寫法就是PcdTokenSpaceGuidName.PcdTokenName|Value,像圖片里面的那樣。
    將原本的800改成了640,當(dāng)然這還不是同一個(gè)文件下的dsc文件,從側(cè)面也證實(shí)了這確實(shí)是一個(gè)全局變量。

    PCD可以在.dsc文件中進(jìn)行修改,包括PCD的值和類型,假如PCD在.dec文件中進(jìn)行了定義,在inf文件中使用,但在.dsc中并沒有重新set,這時(shí)候PCD就會(huì)使用默認(rèn)值(.dec中的Value),類型則是支持的最初的類型,類型也是有一個(gè)優(yōu)先級(jí),優(yōu)先考慮FixAtBuild,其次PatchInModule,然后Dynamic,DynamicEx。(這部分不確定)

    3.在.inf文件中引用

    [Pcd] PcdTokenSpaceGuidName.PcdTokenName|[Value]

    一般的寫法就是列出這個(gè)變量的名字,值是不管的。

    3 AutoGen

    AutoGen.h

    這里可以看見 在AutoGen.h 中 將 _PCD_PATCHABLE_VALUE_PcdSetupVideoHorizontalResolution 設(shè)置成了800u

    AutoGen.c

    然后最精彩的操作在于,他通過一些的#define 將_PCD_PATCHABLE_VALUE_PcdSetupVideoHorizontalResolution這個(gè)變量改成PcdSetupVideoHorizontalResolution 加上前綴_PCD_GET_MODE_32_,而后面的PcdGet32()中直接用##拼接這個(gè)變量名就可以直接得到他的值,所以也算知道了PcdGet32()這個(gè)函數(shù)的來龍去脈了。

    4 PCD LIBRARY

    為了方便代碼的編寫。引入了PCDLib,這里面有常用的接口可以使用,我之前看到的PcdGet32()就在其中。

    這里面有許多好用的函數(shù),比如

    PcdGetXX()PcdSetXX() PcdGetExXX()PcdSetEx()PcdToken() PcdSetSku()PcdGetNextToken() PcdGetNextTokenSpace()CallBackOnSet() CancelCallBack()

    其中“XX" = 8 16 32 Size Ptr Boolean

    而我們最常使用的就是PcdGetXX() 和 PcdSetXX()

    最后:動(dòng)態(tài)的PCD機(jī)制還不太了解,而修改二進(jìn)制文件中的PCD還需要去實(shí)踐。

    參考博客:

    • https://blog.csdn.net/luobing4365/article/details/120835863
    • https://blog.csdn.net/jiangwei0512/article/details/80288001
    • https://blog.csdn.net/weixin_45279063/article/details/117704225
    • https://blog.csdn.net/szhb5251/article/details/105961860

    總結(jié)

    以上是生活随笔為你收集整理的UEFI——PCD研究的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 伊人论坛 | 真人一及毛片 | 91国内视频 | 日韩毛片无码永久免费看 | 成人va在线观看 | 美女久久| 久久网一区二区 | 亚洲综合激情五月久久 | 日韩电影精品 | 中国极品少妇videossexhd 就要干就要操 | 免费观看亚洲视频 | 91在线欧美| eeuss鲁丝片一区二区三区 | 蜜桃91丨九色丨蝌蚪91桃色 | 国产96在线 | 亚洲 | 九九热色 | 亚天堂| 瑟瑟视频免费看 | 亚洲精品无码一区二区 | 日本少妇aaa| 激情小说图片视频 | 99精品毛片| 精品人妻一区二区三区四区五区 | 不卡三区 | 丰满少妇被猛烈进入高清播放 | 91精品91久久久中77777老牛 | 91国内在线视频 | 动漫美女被吸乳奶动漫视频 | 国产精品无码成人网站视频 | ass日本| 欧美精品在欧美一区二区少妇 | 精品妇女一区二区三区 | 男人天堂社区 | 久久精品3 | 亚洲女人在线 | 夜夜爽天天爽 | 国产视频你懂得 | 国产精品破处 | 日本在线精品 | 一级大黄毛片 | 免费在线观看a级片 | 精品久久人人妻人人做人人 | 粉色视频免费观看 | 少妇久久久久久被弄高潮 | 婷婷五月在线视频 | 91av久久| 污在线观看 | 亚洲成人av在线播放 | 性猛交xxxx乱大交孕妇印度 | 日韩大片在线观看 | 蜜臀av免费一区二区三区水牛 | 91成人在线观看喷潮 | www.久久久久久久久久 | 国产欧美日韩综合精品一区 | 爱就操| 一本色道久久综合亚洲精品按摩 | 色婷婷av久久久久久久 | 台湾性生生活1 | 激情偷乱人成视频在线观看 | 17c一起操| 韩国日本中文字幕 | 欧美爽妇 | 亚洲国产高清在线 | 精品人妻少妇一区二区 | 午夜影视体验区 | 国产精品www | 韩日欧美 | 国产成人无码精品久在线观看 | 午夜综合 | 午夜精品久久久久久久蜜桃 | 青草视频在线免费观看 | 欧美男人的天堂 | 欧美日韩亚洲激情 | 和黑帮大佬的365 | 欧美人和黑人牲交网站上线 | 亚洲妇女av| 波多野结衣绝顶大高潮 | 国产精品黄色av | 日本亚洲欧洲色 | 久久久久久久久久久久久女国产乱 | 免费三级在线 | 国产精品国产三级国产aⅴ 欧美bbbbbbbbbbbb18av | 成年人看的毛片 | 性中文字幕| 久久久久久毛片 | 久草视 | 久久精品大片 | 国产在线不卡视频 | 伊人久久免费 | 色亚洲天堂 | 69式视频| 亚洲九九色 | 一级黄色录像免费观看 | 亚洲玖玖爱 | 欧洲一区二区三区四区 | 亚洲乱码国产乱码精品 | 中文字幕在线播放av | 9i看片成人免费 | 神马久久久久久久久久久 |