青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

string

string
posts - 27, comments - 177, trackbacks - 0, articles - 0
  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
什么是protocol
從字面意思上看,protocol是server和client之間的一種約定,雙方根據(jù)這種約定互通信息。這里的server和client是一種廣義的稱(chēng)呼,提供服務(wù)的稱(chēng)為server,使用服務(wù)的稱(chēng)為client。 TCP是一種protocol, client(應(yīng)用程序)通過(guò)一組函數(shù)來(lái)壓包和解包,壓包和解包是server提供的服務(wù)。COM也是一種protocol,client通過(guò)CoCreateInstance(...)和GUID獲得指向COM對(duì)象的指針,然后使用該指針獲得COM對(duì)象提供的服務(wù), GUID標(biāo)示了這個(gè)COM對(duì)象。現(xiàn)在我們對(duì)protocol有了概念上的理解,那么具體到UEFI里,protocol是什么樣子呢? 如何標(biāo)示一個(gè)protocol?如何得到protocol對(duì)應(yīng)的對(duì)象?...容我慢慢道來(lái).
在講protocol什么樣子之前,還要插幾句C與C++的區(qū)別。我們知道UEFI是用C來(lái)開(kāi)發(fā)的,C是面向過(guò)程的一種語(yǔ)言。而管理和使用UEFI眾多的protocol完全使用面向過(guò)程的思想會(huì)使程序變得復(fù)雜。protocol作為一種對(duì)象來(lái)設(shè)計(jì)管理會(huì)比較直觀。因而UEFI中的Protocol引入了面向?qū)ο蟮乃枷耄胹truct來(lái)模擬class, Protocol用struct來(lái)實(shí)現(xiàn),用函數(shù)指針(Protocol的成員變量)模擬成員函數(shù),此種函數(shù)的第一參數(shù)必須是指向Protocol的指針,用來(lái)模擬this指針。
Protocol的摸樣
以EFI_DISKIO_PROTOCOL 來(lái)看看Protocol的樣子。 
MdePkg/Include/Protocol/BlockIo.h
:
220
///
///  This protocol provides control over block devices.
///
struct _EFI_BLOCK_IO_PROTOCOL {
  
///
  
/// The revision to which the block IO interface adheres. All future
  
/// revisions must be backwards compatible. If a future version is not
  
/// back wards compatible, it is not the same GUID.
  
///
  UINT64              Revision;
  
///
  
/// Pointer to the EFI_BLOCK_IO_MEDIA data for this device.
  
///
  EFI_BLOCK_IO_MEDIA  *Media;

  EFI_BLOCK_RESET     Reset;
  EFI_BLOCK_READ      ReadBlocks;
  EFI_BLOCK_WRITE     WriteBlocks;
  EFI_BLOCK_FLUSH     FlushBlocks;

};

extern EFI_GUID gEfiBlockIoProtocolGuid;
MdePkg/Include/Protocol/BlockIo.h
:
220
#define EFI_BLOCK_IO_PROTOCOL_GUID \
  { \
    
0x964e5b210x64590x11d2, {0x8e0x390x00xa00xc90x690x720x3b } \
  }

typedef 
struct _EFI_BLOCK_IO_PROTOCOL  EFI_BLOCK_IO_PROTOCOL;
EFI_BLOCK_IO_PROTOCOL 有兩個(gè)成員變量,四個(gè)成員函數(shù)(當(dāng)然從C的角度來(lái)看,“成員函數(shù)”叫法不準(zhǔn)確,它實(shí)際上也是一個(gè)成員變量,只是這個(gè)變量是函數(shù)指針).  gEfiBlockIoProtocolGuid({0x964e5b210x64590x11d2, {0x8e0x390x00xa00xc90x690x720x3b })標(biāo)示了EFI_BLOCK_IO_PROTOCOL 。
來(lái)看成員函數(shù)的聲明

/**
  Read BufferSize bytes from Lba into Buffer.

  @param  This       Indicates a pointer to the calling context.
  @param  MediaId    Id of the media, changes every time the media is replaced.
  @param  Lba        The starting Logical Block Address to read from
  @param  BufferSize Size of Buffer, must be a multiple of device block size.
  @param  Buffer     A pointer to the destination buffer for the data. The caller is
                     responsible for either having implicit or explicit ownership of the buffer.

  @retval EFI_SUCCESS           The data was read correctly from the device.
  @retval EFI_DEVICE_ERROR      The device reported an error while performing the read.
  @retval EFI_NO_MEDIA          There is no media in the device.
  @retval EFI_MEDIA_CHANGED     The MediaId does not matched the current device.
  @retval EFI_BAD_BUFFER_SIZE   The Buffer was not a multiple of the block size of the device.
  @retval EFI_INVALID_PARAMETER The read request contains LBAs that are not valid,
                                or the buffer is not on proper alignment.

*
*/
typedef
EFI_STATUS
(EFIAPI 
*EFI_BLOCK_READ)(
  IN EFI_BLOCK_IO_PROTOCOL          
*This,
  IN UINT32                         MediaId,
  IN EFI_LBA                        Lba,
  IN UINTN                          BufferSize,
  OUT VOID                          
*Buffer
  );
EFI_BLOCK_READ具體用法我們先不看,我們來(lái)看它的第一個(gè)參數(shù),指向EFI_BLOCK_IO_PROTOCOL  對(duì)象自己的this指針,這是成員函數(shù)區(qū)別于一般函數(shù)的重要特征。

如何使用Protocol       

使用Protocol之前,我們要弄清楚Protocol位于什么地方。首先我們要來(lái)認(rèn)識(shí)一下EFI_HANDLE,
///
/// A collection of related interfaces.
///
typedef VOID                      *EFI_HANDLE;
EFI_HANDLE是指向某種對(duì)象的指針,UEFI用它來(lái)表示某個(gè)對(duì)象。 UEFI掃描總線后,會(huì)為每個(gè)設(shè)備建立一個(gè)Controller對(duì)象,用于控制設(shè)備,所有該設(shè)備的驅(qū)動(dòng)以protocol的形式安裝到這個(gè)controller中,這個(gè)Controller就是一個(gè)EFI_HANDLE對(duì)象。 當(dāng)我們將一個(gè).efi文件加載到內(nèi)存中,UEFI也會(huì)為該文件建立一個(gè)Image對(duì)象(此Image非圖像的意識(shí)), 這個(gè)Image對(duì)象也是一個(gè)EFI_HANDLE對(duì)象。 在UEFI內(nèi)部,EFI_HANDLE被理解為IHANDLE
///
/// IHANDLE - contains a list of protocol handles
///
typedef struct {
  UINTN               Signature;
  
/// All handles list of IHANDLE
  LIST_ENTRY          AllHandles;
  
/// List of PROTOCOL_INTERFACE's for this handle
  LIST_ENTRY          Protocols;
  UINTN               LocateRequest;
  
/// The Handle Database Key value when this handle was last created or modified
  UINT64              Key;
} IHANDLE;
每個(gè)IHANDLE中都有一個(gè)Protocols鏈表,存放屬于自己的protocol。所有的IHANDLE通過(guò)AllHandles鏈接起來(lái)。
要使用Protocol,首先要找到protocol對(duì)象,可以通過(guò)BootServices的OpenProtocol(...), HandleProtocl(...), LocateProtocol(...)獲得。
typedef
/**
  Queries a handle to determine if it supports a specified protocol. If the protocol is supported by the
  handle, it opens the protocol on behalf of the calling agent.
  @param  Handle                The handle for the protocol interface that is being opened.
  @param  Protocol              The published unique identifier of the protocol.
  @param  Interface             Supplies the address where a pointer to the corresponding Protocol
                                        Interface is returned.
  @param  AgentHandle        The handle of the agent that is opening the protocol interface
                                        specified by Protocol and Interface.
  @param  ControllerHandle    If the agent that is opening a protocol is a driver that follows the
                                        UEFI Driver Model, then this parameter is the controller handle
                                        that requires the protocol interface. If the agent does not follow
                                        the UEFI Driver Model, then this parameter is optional and may
                                        be NULL.
  @param  Attributes            The open mode of the protocol interface specified by Handle
                                        and Protocol.
  @retval EFI_SUCCESS         An item was added to the open list for the protocol interface, and the
                                        protocol interface was returned in Interface.
  @retval EFI_UNSUPPORTED       Handle does not support Protocol.
  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
  @retval EFI_ACCESS_DENIED     Required attributes can't be supported in current environment.
  @retval EFI_ALREADY_STARTED   Item on the open list already has requierd attributes whose agent
                                                handle is the same as AgentHandle.
**/
EFI_STATUS
(EFIAPI *EFI_OPEN_PROTOCOL)(
  IN  EFI_HANDLE                Handle,
  IN  EFI_GUID                   *Protocol,
  OUT VOID                       **Interface, OPTIONAL
  IN  EFI_HANDLE                AgentHandle,
  IN  EFI_HANDLE                ControllerHandle,
  IN  UINT32                      Attributes
  );
Handle是Protocol的提供者,如果Handle的Protocols鏈表中有該P(yáng)otocol,Protocol對(duì)象的指針寫(xiě)到*Interface,并返回EFI_SUCCESS;否則 返回EFI_UNSUPPORTED
如果在驅(qū)動(dòng)中調(diào)用OpenProtocol(), AgentHandle是擁有該EFI_DRIVER_BINDING_PROTOCOL對(duì)象的Handle;ControllerHandle是擁有該驅(qū)動(dòng)的Controller。
如果調(diào)用OpenProtocol的是應(yīng)用程序,那么AgentHandle是該應(yīng)用對(duì)應(yīng)的Handle,也就main函數(shù)的第一個(gè)參數(shù)。 
ControllerHandle此時(shí)可以忽略。
Attributes可以取以下5種值。
#define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL   0x00000001
#define EFI_OPEN_PROTOCOL_GET_PROTOCOL             0x00000002
#define EFI_OPEN_PROTOCOL_TEST_PROTOCOL           0x00000004
#define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER  0x00000008
#define EFI_OPEN_PROTOCOL_BY_DRIVER                   0x00000010
#define EFI_OPEN_PROTOCOL_EXCLUSIVE                   0x00000020

HandleProtocol是OpenProtocol的簡(jiǎn)化版,因?yàn)榇蟛糠智闆r下我們都不需要關(guān)心AgentHandle,ControllerHandle和Attributes。
EFI_STATUS
EFIAPI
CoreHandleProtocol (
  IN EFI_HANDLE       UserHandle,
  IN EFI_GUID         
*Protocol,
  OUT VOID            
**Interface
  )
{
  
return CoreOpenProtocol (
          UserHandle,
          Protocol,
          Interface,
          gDxeCoreImageHandle,
          NULL,
          EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL
          );
}
LocateProtocol(...)是從內(nèi)核中找出指定Protocol的第一個(gè)實(shí)例。
typedef
EFI_STATUS
LocateProtocol (
IN EFI_GUID 
*Protocol,
IN VOID       
*Registration OPTIONAL,
OUT VOID     
**Interface
);
UEFI內(nèi)核中某個(gè)Protocol的實(shí)例可能不止一個(gè),例如每個(gè)硬盤(pán)及每個(gè)分區(qū)都有一個(gè)EFI_DISK_IO_PROTOCOL實(shí)例。LocateProtocol順序搜索HANDLE鏈表,返回找到的第一個(gè)該P(yáng)rotocol的實(shí)例。
我們可以用BootServices提供的其它函數(shù)處理HANDLE和Protocol。
typedef
EFI_STATUS
LocateHandleBuffer (
IN EFI_LOCATE_SEARCH_TYPE SearchType,
IN EFI_GUID                         
*Protocol OPTIONAL,
IN VOID
                              
 
*SearchKey OPTIONAL,
IN OUT UINTN                       
*NoHandles,
OUT EFI_HANDLE                  
**Buffer
);
可以獲得所有支持指定Protocol的HANDLE,SearchType 有三種:AllHandles(查找所有HANDLE), ByRegisterNotify, ByProtocol(查找支持指定Protocol的HANDLE)。NoHandles是找到的HANDLE的數(shù)量, Buffer數(shù)組由UEFI復(fù)雜分配,由用戶(hù)負(fù)責(zé)釋放。
typedef
EFI_STATUS
LocateHandle (
IN EFI_LOCATE_SEARCH_TYPE SearchType,
IN EFI_GUID                        
*Protocol OPTIONAL,
IN VOID                              
*SearchKey OPTIONAL,
IN OUT UINTN                      
*BufferSize,
OUT EFI_HANDLE                  
*Buffer
);
與LocateHandleBuffer相似,只是用戶(hù)負(fù)責(zé)分配和釋放Buffer數(shù)組。
typedef
EFI_STATUS
ProtocolsPerHandle (
IN EFI_HANDLE Handle,
OUT EFI_GUID  
***ProtocolBuffer,
OUT UINTN      
*ProtocolBufferCount
);
獲得指定Handle所支持的所有Protocol, UEFI負(fù)責(zé)分配內(nèi)存給ProtocolBuffer,用戶(hù)負(fù)責(zé)釋放該內(nèi)存。

typedef
EFI_STATUS
(EFIAPI 
*EFI_OPEN_PROTOCOL_INFORMATION) (
IN EFI_HANDLE Handle,
IN EFI_GUID    
*Protocol,
OUT EFI_OPEN_PROTOCOL_INFORMATION_ENTRY 
**EntryBuffer,
OUT UINTN     
*EntryCount
);
typedef struct {
  EFI_HANDLE  AgentHandle;
  EFI_HANDLE  ControllerHandle;
  UINT32        Attributes;
  UINT32        OpenCount;
} EFI_OPEN_PROTOCOL_INFORMATION_ENTRY;
OpenProtocolInformation()獲得指定Handle中指定Protocol的打開(kāi)信息。
SPEC2.3.1第165頁(yè)有很好的例子演示了怎么打開(kāi)一個(gè)Protocol, 
EFI_BOOT_SERVICES *gBS;
EFI_HANDLE ImageHandle;
EFI_DRIVER_BINDING_PROTOCOL 
*This;
IN EFI_HANDLE ControllerHandle,
extern EFI_GUID gEfiXyzIoProtocol;
EFI_XYZ_IO_PROTOCOL 
*XyzIo;
EFI_STATUS Status;

Status 
= gBS->OpenProtocol (
ControllerHandle,
&gEfiXyzIoProtocol,
&XyzIo,
ImageHandle,
NULL,
EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL
);

Status 
= gBS->OpenProtocol (
ControllerHandle,
&gEfiXyzIoProtocol,
&XyzIo,
This
->DriverBindingHandle,
ControllerHandle,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
打開(kāi)Protocol之后就可以使用了,最后要通過(guò)CloseProtocol關(guān)閉打開(kāi)的Protocol。
typedef
EFI_STATUS
(EFIAPI 
*EFI_CLOSE_PROTOCOL) (
IN EFI_HANDLE Handle,
IN EFI_GUID 
*Protocol,
IN EFI_HANDLE AgentHandle,
IN EFI_HANDLE ControllerHandle
);
通過(guò)HandleProtocol和LocateProtocol打開(kāi)的Protocol因?yàn)闆](méi)有指定AgentHandle,所以無(wú)法關(guān)閉。如果一定要去關(guān)閉它,要調(diào)用OpenProtocolInformation()獲得AgentHandle和ControllerHandle,然后關(guān)閉它。
下面看一個(gè)完整的例子,用EFI_DISK_IO_PROTOCOL讀取GPT硬盤(pán)的分區(qū)表
#include <Uefi.h> 
#include <Base.h> 
#include <Library/UefiLib.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/PrintLib.h>
#include <Protocol/DiskIo.h> 
#include <Protocol/BlockIo.h> 
#include <Protocol/DevicePath.h>    
#include <Uefi/UefiGpt.h>
#include <Library/DevicePathLib.h>
EFI_STATUS
EFIAPI
UefiMain(
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
        EFI_STATUS                              Status;
        UINTN                                       HandleIndex, HandleCount;
        EFI_HANDLE                               *DiskControllerHandles = NULL;
        EFI_DISK_IO_PROTOCOL               *DiskIo;

        /*找到所有提供 EFI_DISK_IO_PROTOCOL 的Controller  */
        Status = gBS->LocateHandleBuffer(
                        ByProtocol,
                        &gEfiDiskIoProtocolGuid,
                        NULL,
                        &HandleCount,
                        &DiskControllerHandles);

        if (!EFI_ERROR(Status)) {
                CHAR8 gptHeaderBuf[512];
                EFI_PARTITION_TABLE_HEADER* gptHeader = (EFI_PARTITION_TABLE_HEADER*
)gpHeaderBuf;
                for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {
                       /*打開(kāi)EFI_DISK_IO_PROTOCOL  */ 
                       Status = gBS->HandleProtocol(
                                        DiskControllerHandles[HandleIndex],
                                        &gEfiDiskIoProtocolGuid,
                                        (VOID**)&DiskIo);

                        if (!EFI_ERROR(Status)){
                                {
                                        EFI_DEVICE_PATH_PROTOCOL                 *DiskDevicePath;
                                        EFI_DEVICE_PATH_TO_TEXT_PROTOCOL   *Device2TextProtocol = 0;
                                        CHAR16*                                             TextDevicePath = 0;
                                          /*1. 打開(kāi)EFI_DEVICE_PATH_PROTOCOL  */  
                                        Status = gBS->OpenProtocol(
                                                        DiskControllerHandles[HandleIndex],
                                                        &gEfiDevicePathProtocolGuid,
                                                        (VOID**)&DiskDevicePath,
                                                        ImageHandle,
                                                        NULL,
                                                        EFI_OPEN_PROTOCOL_GET_PROTOCOL
                                                        );
                                        if(!EFI_ERROR(Status)){
                                                if(Device2TextProtocol == 0)
                                                        Status = gBS->LocateProtocol(
                                                                        &gEfiDevicePathToTextProtocolGuid,
                                                                        NULL,
                                                                        (VOID**)&Device2TextProtocol
                                                                        );
                                                /*2. 使用 EFI_DEVICE_PATH_PROTOCOL  得到文本格式的Device Path  */  
                                                TextDevicePath = Device2TextProtocol->ConvertDevicePathToText(DiskDevicePath, TRUE, TRUE);
                                                Print(L"%s\n", TextDevicePath);
                                                if(TextDevicePath)gBS->FreePool(TextDevicePath);
                                                /*3. 關(guān)閉 EFI_DEVICE_PATH_PROTOCO */   
                                                Status = gBS->CloseProtocol(
                                                                DiskControllerHandles[HandleIndex],
                                                                &gEfiDevicePathProtocolGuid,
                                                                ImageHandle,
                                                                );
                                        }
                                }
                                {
                                        EFI_BLOCK_IO_PROTOCOL* BlockIo = *(EFI_BLOCK_IO_PROTOCOL**) (DiskIo + 1);
                                        EFI_BLOCK_IO_MEDIA* Media = BlockIo->Media;
                                        /*讀1號(hào)扇區(qū)。  */   
                                        Status = DiskIo->ReadDisk(DiskIo, Media->MediaId, 512, 512, gptHeader);
                                        /*檢查GPT標(biāo)志。  */    
                                        if((!EFI_ERROR(Status)) &&( gptHeader -> Header.Signature == 0x5452415020494645)){
                                                UINT32 CRCsum;
                                                UINT32 GPTHeaderCRCsum =  (gptHeader->Header.CRC32);
                                                gptHeader->Header.CRC32 = 0;
                                                gBS -> CalculateCrc32(gptHeader , (gptHeader->Header.HeaderSize), &CRCsum);
                                                if(GPTHeaderCRCsum == CRCsum){
                                                // Find out a GPT Header
                                                }

                                        }

                                }

                        }

                }
                gBS->FreePool(DiskControllerHandles);
        }
}
 









Feedback

# re: UEFI 實(shí)戰(zhàn)(4) protocol   回復(fù)  更多評(píng)論   

2012-08-13 13:55 by 劉煒
EFI_BLOCK_IO_PROTOCOL* BlockIo = *(EFI_BLOCK_IO_PROTOCOL**) (DiskIo + 1);

這是說(shuō)明兩個(gè)協(xié)議的數(shù)據(jù)結(jié)構(gòu)連續(xù)地放在一起嗎?

# re: UEFI 實(shí)戰(zhàn)(4) protocol [未登錄](méi)  回復(fù)  更多評(píng)論   

2012-08-15 22:02 by djx_zh
@劉煒
是的。
MdeModulePkg\Universal\Disk\DiskIoDxe\DiskIo.h:36
typedef struct {
UINTN Signature;
EFI_DISK_IO_PROTOCOL DiskIo;
EFI_BLOCK_IO_PROTOCOL *BlockIo;
} DISK_IO_PRIVATE_DATA

# re: UEFI 實(shí)戰(zhàn)(4) protocol   回復(fù)  更多評(píng)論   

2012-10-04 16:29 by 關(guān)于 gptHeader-> Header.Signature
你好 我接觸 UFEI 不長(zhǎng)時(shí)間
有個(gè)問(wèn)題
CHAR8 gptHeader[512];
gptHeader-> Header.Signature
這樣寫(xiě)可以嗎?
gptHeader 應(yīng)該是個(gè) struct吧
還有能否把inf文件也發(fā)上來(lái)呢 謝謝了

# re: UEFI 實(shí)戰(zhàn)(4) protocol   回復(fù)  更多評(píng)論   

2012-10-04 17:44 by snowman1101
你好
我復(fù)制了你的代碼
編譯后提示 未聲明 DevicePathToText 于是我加入了
#include <Protocol/DevicePathToText.h>
修改所有錯(cuò)誤以后
又說(shuō) 外部 gEfiDevicePathToTextProtocolGuid
請(qǐng)問(wèn)怎么解決呢。可以發(fā)一下完整代碼嗎
謝謝了

# re: UEFI 實(shí)戰(zhàn)(4) protocol   回復(fù)  更多評(píng)論   

2012-10-05 08:37 by djx_zh
代碼中少了一句
EFI_PARTITION_TABLE_HEADER* gptHeader = (EFI_PARTITION_TABLE_HEADER*
)gpHeaderBuf;

在你.inf文件的[Protocols]下面加上
gEfiDevicePathToTextProtocolGuid

# re: UEFI 實(shí)戰(zhàn)(4) protocol [未登錄](méi)  回復(fù)  更多評(píng)論   

2012-10-06 22:06 by snowman1101
多謝指教,已經(jīng)可以了


# re: UEFI 實(shí)戰(zhàn)(4) protocol [未登錄](méi)  回復(fù)  更多評(píng)論   

2012-11-15 11:47 by ktfun
親,find out a GPT header 后面的內(nèi)容呢?

# re: UEFI 實(shí)戰(zhàn)(4) protocol   回復(fù)  更多評(píng)論   

2013-01-07 17:43 by linhao
關(guān)于:EFI_BLOCK_IO_PROTOCOL* BlockIo = *(EFI_BLOCK_IO_PROTOCOL**) (DiskIo + 1);
我認(rèn)為這樣更方便理解:
DISK_IO_PRIVATE_DATA *Private_Data;
Private_Data = DISK_IO_PRIVATE_DATA_FROM_THIS (DiskIo);
BlockIo = Private_Data;

# re: UEFI 實(shí)戰(zhàn)(4) protocol   回復(fù)  更多評(píng)論   

2013-01-07 17:45 by linhao
修改:
BlockIo = Private_Data->BlockIo;

# re: UEFI 實(shí)戰(zhàn)(4) protocol   回復(fù)  更多評(píng)論   

2013-01-07 22:12 by djxzh
@linhao
是的。如果你看DiskIO的源碼會(huì)發(fā)現(xiàn)EDK2就是這樣做的。

# re: UEFI 實(shí)戰(zhàn)(4) protocol   回復(fù)  更多評(píng)論   

2013-02-28 06:44 by howard
hi, 請(qǐng)問(wèn)如何選擇特定的device進(jìn)行讀寫(xiě)?我想parse EFI_DEVICE_PATH_PROTOCOL 的bus id 部分,然后找到目標(biāo)進(jìn)行讀寫(xiě),但貌似沒(méi)有合適的API可以用

Thanks in advance!

# re: UEFI 實(shí)戰(zhàn)(4) protocol   回復(fù)  更多評(píng)論   

2013-03-06 06:08 by djxzh
@howard

EFI_DEVICE_PATH_PROTOCOL 是一個(gè)辦法, 確實(shí)沒(méi)有順手的API, 你要一個(gè)node一個(gè)node的分析。

也可以用PciIo讀取PCI設(shè)備的配置空間,來(lái)判斷設(shè)備。

# re: UEFI 實(shí)戰(zhàn)(4) protocol   回復(fù)  更多評(píng)論   

2013-03-08 03:29 by howard
恩,我現(xiàn)在暫時(shí)用capacity來(lái)找我的device. 不知樓主用過(guò)EADK嗎,把C標(biāo)準(zhǔn)庫(kù)加到EDKII里。 我試了一下,build出來(lái)的efi放在shell那一跑就crash with exception, sample efi也一樣問(wèn)題。。

# re: UEFI 實(shí)戰(zhàn)(4) protocol   回復(fù)  更多評(píng)論   

2014-12-27 03:54 by asam
【UEFI是用C來(lái)開(kāi)發(fā)的,C是面向過(guò)程的一種語(yǔ)言。而管理和使用UEFI眾多的protocol完全使用面向過(guò)程的思想會(huì)使程序變得復(fù)雜。protocol作為一種對(duì)象來(lái)設(shè)計(jì)管理會(huì)比較直觀。因而UEFI中的Protocol引入了面向?qū)ο蟮乃枷耄胹truct來(lái)模擬class, Protocol用struct來(lái)實(shí)現(xiàn),用函數(shù)指針(Protocol的成員變量)模擬成員函數(shù),此種函數(shù)的第一參數(shù)必須是指向Protocol的指針,用來(lái)模擬this指針。。。。。。】



怪不得,看了hello world,沒(méi)有消息機(jī)制。特別是和硬件打交道,對(duì)這個(gè)uefi表示亞歷山大。

# re: UEFI 實(shí)戰(zhàn)(4) protocol   回復(fù)  更多評(píng)論   

2015-05-29 15:07 by 周彬彬
@djx_zh
這個(gè)在EDK2 SPE2.4的MdeModulePkg\Universal\Disk\DiskIoDxe\DiskIo.h
這樣定義的:二者并沒(méi)有相鄰
#define DISK_IO_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('d', 's', 'k', 'I')
typedef struct {
UINT32 Signature;

EFI_DISK_IO_PROTOCOL DiskIo;
EFI_DISK_IO2_PROTOCOL DiskIo2;
EFI_BLOCK_IO_PROTOCOL *BlockIo;
EFI_BLOCK_IO2_PROTOCOL *BlockIo2;

UINT8 *SharedWorkingBuffer;

EFI_LOCK TaskQueueLock;
LIST_ENTRY TaskQueue;
} DISK_IO_PRIVATE_DATA;

# re: UEFI 實(shí)戰(zhàn)(4) protocol   回復(fù)  更多評(píng)論   

2015-06-01 04:38 by djx_zh
@周彬彬
對(duì)。本文中的方法依賴(lài)于 DISK_IO_PRIVATE_DATA的實(shí)現(xiàn),而這個(gè)實(shí)現(xiàn)沒(méi)有一個(gè)標(biāo)準(zhǔn),故不能保證向前兼容。這不是一個(gè)安全的方法,只是一個(gè)快速的方法。安全的方法還是調(diào)用OpenPrototocol或LocateProtocol。

# re: UEFI 實(shí)戰(zhàn)(4) protocol   回復(fù)  更多評(píng)論   

2015-06-02 19:58 by 夏濤
怎么添加關(guān)注的啊?

只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品综合| 女女同性精品视频| 美国十次成人| 久久精品盗摄| 久久久精品免费视频| 欧美综合二区| 久久久久久伊人| 久久久一二三| 欧美大学生性色视频| 欧美高清视频| 亚洲精品免费电影| 欧美国产日韩亚洲一区| 亚洲国产日本| 中文亚洲视频在线| 羞羞视频在线观看欧美| 久久蜜臀精品av| 国产日韩欧美麻豆| 欧美连裤袜在线视频| 欧美日韩国产123区| 欧美日韩在线看| 国产一区二区高清不卡| 亚洲国产精品va在线看黑人 | 亚洲成色777777女色窝| 欧美激情第1页| 亚洲无线一线二线三线区别av| 亚洲一区二区在线播放| 久久久之久亚州精品露出| 欧美精品久久天天躁| 国产麻豆精品theporn| 亚洲成色www8888| 亚洲综合日韩| 欧美激情第六页| 亚洲一区三区在线观看| 久久久蜜桃精品| 国产精品久久精品日日| 亚洲国产成人久久综合| 亚洲欧美日韩综合国产aⅴ| 欧美va天堂| 香蕉av福利精品导航| 欧美人交a欧美精品| 国产一区二区三区久久久久久久久 | 亚洲私拍自拍| 久久三级福利| 国产欧美日韩视频| 亚洲五月六月| 91久久精品视频| 久久国产精品久久久| 欧美丝袜第一区| 亚洲乱码国产乱码精品精可以看 | 欧美一区影院| 欧美无乱码久久久免费午夜一区| 亚洲二区三区四区| 久久精品视频免费| 亚洲欧美日韩另类精品一区二区三区| 欧美高清你懂得| 亚洲国产精品久久久| 久久精品青青大伊人av| 亚洲一区在线播放| 国产精品草莓在线免费观看| 一本到高清视频免费精品| 欧美搞黄网站| 老司机午夜精品视频| 国外成人在线视频| 国产一区二区精品久久99| 欧美美女bbbb| 亚洲美女电影在线| 欧美高清在线视频观看不卡| 久久久精品一品道一区| 精品成人国产| 美脚丝袜一区二区三区在线观看 | 亚洲国产精品福利| 久久综合给合| 亚洲精品乱码久久久久久日本蜜臀 | 欧美日韩在线观看视频| 在线视频精品一区| 一区二区三区欧美激情| 欧美日一区二区三区在线观看国产免 | 国产精品99久久久久久久vr| 欧美日韩亚洲三区| 亚洲一区二区三区久久 | 99re国产精品| 欧美日韩一区国产| 亚洲欧美在线一区| 午夜伦理片一区| 一区二区三区在线看| 欧美承认网站| 欧美日韩另类字幕中文| 香蕉免费一区二区三区在线观看 | 亚洲欧美制服另类日韩| 黑人一区二区| 亚洲国产精品va在看黑人| 欧美精品尤物在线| 午夜激情综合网| 久久免费观看视频| 亚洲夜间福利| 久久精品网址| 一本久久综合亚洲鲁鲁五月天| 一区二区毛片| 在线观看欧美亚洲| 99国产精品久久久久久久成人热| 国产欧美一区二区三区久久人妖| 久久久精品一区| 欧美福利影院| 久久精品国产第一区二区三区| 嫩草国产精品入口| 欧美在线视频a| 欧美劲爆第一页| 久久这里有精品视频| 欧美日韩情趣电影| 久久动漫亚洲| 亚洲欧美自拍偷拍| 久久免费视频网| 亚洲欧洲av一区二区| 久久综合久久综合这里只有精品 | 在线性视频日韩欧美| 久久成人羞羞网站| 中国日韩欧美久久久久久久久| 欧美一进一出视频| 亚洲一区在线看| 欧美经典一区二区三区| 久久综合国产精品| 国产精品久久久久久久久久三级| 欧美不卡高清| 国产在线麻豆精品观看| 洋洋av久久久久久久一区| 亚洲国产高清在线| 久久精品国产亚洲5555| 欧美在线观看一区二区三区| 欧美日韩不卡视频| 91久久黄色| 亚洲精品永久免费| 久久综合久久美利坚合众国| 久久久亚洲精品一区二区三区| 国产精品亚洲精品| 亚洲视频网在线直播| 亚洲视频免费在线观看| 欧美伦理影院| 亚洲精选久久| 亚洲一本大道在线| 欧美日韩一区二区视频在线观看| 亚洲欧洲美洲综合色网| 亚洲理论在线观看| 免费中文日韩| 亚洲区在线播放| 夜夜嗨av一区二区三区网页| 欧美激情2020午夜免费观看| 亚洲国产高清高潮精品美女| 亚洲另类视频| 国产精品久久久久久久久久ktv | 亚洲一区二区三区国产| 欧美日韩中文字幕在线视频| 一本久道久久综合狠狠爱| 9色精品在线| 国产精品成人一区二区三区吃奶| 一本大道久久a久久精品综合| 亚洲综合日韩在线| 国产伦精品一区二区三区| 性欧美在线看片a免费观看| 久久xxxx精品视频| 激情综合色综合久久| 美女网站在线免费欧美精品| 亚洲国产高潮在线观看| 亚洲午夜视频在线| 国产精品一区二区久久国产| 欧美一区二区三区在线观看视频| 久久久久久久一区二区| 亚洲激情第一区| 欧美视频在线一区二区三区| 亚洲一区二区高清| 老色批av在线精品| av成人黄色| 国产女优一区| 欧美成人a视频| 午夜精品视频网站| 亚洲欧美中日韩| 免费视频一区| 99国产精品99久久久久久| 欧美制服丝袜| 亚洲日本电影| 国产日韩欧美在线看| 免费成人激情视频| 国产精品99久久久久久宅男 | 另类尿喷潮videofree| 亚洲免费观看高清完整版在线观看| 午夜久久久久| 亚洲精品亚洲人成人网| 国产精品综合久久久| 免播放器亚洲| 午夜精品久久久久久久| 亚洲三级色网| 免播放器亚洲一区| 欧美一区二区三区喷汁尤物| 亚洲精品中文字| 激情五月婷婷综合| 国产精品久久久久久久久免费桃花| 麻豆成人精品| 久久夜色精品| 久久久免费观看视频| 欧美伊人久久久久久午夜久久久久| 99成人免费视频|