3.UEFI中的Protocol

1.UEFI中的Protocol引入了面向对象的思想:

--用struct来模拟class

--用函数指针(Protocol的成员变量)模拟成员函数,此种函数的第一个参数必须指向Protocol的指针,用来模拟this。

(通常,计算机中有很多的块设备,每个块设备都有一个EFI_BLOCK_IO_PROTOCOL的实例,This指针就是指向这个实例,用于告诉成员函数我们正在操作哪个设备。This指针是Protocol成员函数的一个重要特征。)

2.Protocol在UEFI内核中的表示:

使用Protocol之前,我们需要知道Protocol位于什么地方。首先,我们要来认识一下EFI_HANDLE

typedef VOID * EFI_HANDLE;

EFI_HANDLE是指向某种对象的指针,UEFI用它来指向某个对象。UEFI扫描总线后,会为总线上的每个设备创立一个Controller对象,用于控制设备,所有该设备的驱动以protocol的形式安装到这个Controller中,这个Controller就是一个EFI_HANDLE对象。当我们将一个.efi文件加载到内存中时,UEFI也会为该文件创建一个image对象。在UEFI内部,EFI_HANDLE被理解为IHANDLE,IHANDLE的数据结构代码如下所示:

typedef struct{

UINTN Signature;//表明Handle的类别

LIST_ENTRY AllHandles;//所有Handle组成的链表

LIST_ENTRY Protocols;//此Handle的Protocols链表

UINTN LocateRequest;

UINT64 Key;

}IHANDLE;

每个IHANDLE都有一个protocols链表(双向链表),存放属于自己的protocol。所有的IHANDLE通过AllHandles连接起来。

3.如何使用protocol

Boot Services提供了对Protocol进行操作的services,如OpenProtocol()、HandleProtocol()、LocateProtocol()三种服务用于找出指定的protocol:OpenProtocol()用于打开指定句柄上的Protocol;HandleProtocol()是OpenProtocol()的简化版;LocateProtocol()用于找出指定protocol在系统中的第一个实例。使用完Protocol后还要通过CloseProtocol()关闭打开的protocol,否则可能造成内存泄露,由于HandleProtocol和OpenProtocol没有指定AgentHandle,所以无法关闭,如果一定要关闭,需要调用OpenProtocolInformation()获得AgentHandle和ControllerHandle,然后关闭它。

除了打开和关闭protocol,有时候还有能找出支持某个Protocol的所有设备。例如要找出支持BlockIos的所有设备(即找出所有块设备),这时候就要使用LocateHandleBuffer()服务;如果想知道某个Protocol被哪些设备打开了,那么可以使用OpenProtocolInformation()服务;ProtocolPerHandle()用于获得指定设备所支持的所有Protocol。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容

  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,310评论 0 6
  • 从我们按下开机键到进入到操作系统之前的系统初始化动作,即是BIOS run的过程。如今操作系统已经从枯燥的文本时代...
    NickHe阅读 4,166评论 0 10
  • SEC--PEI--DXE--BDS 【SEC阶段】 1.SEC的功能: SEC阶段是平台初始化的第一个阶段,计算...
    NickHe阅读 10,860评论 1 10
  • 理论部分 镜像 一、镜像的百科定义 1、维基百科 ISO映像是一种光盘的存档文件(英语:archive file)...
    幻影翔阅读 1,914评论 4 3
  • 原本以为画正方体很容易,但在缠绕画的第二堂素描课里,发现以前画的那么多正方体竟然都是错的,至少在素描领域是错的。实...
    好吃的芒果饭阅读 753评论 0 0