Struct 內的物件記憶體佈列如下 :
Status = AcpiMain(&RsdpPtr);
((EFI_MEMORY_POOLS_LISI *) 0) : 0
((TYPE *) ( (CHAR8 *)(Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
Status = LibGetSystemConfigurationTable (&gEfiAcpiTableGuid, TablePtr); // gEfiAcpi20TableGuid "ACPI 2.0 Table"
if (EFI_ERROR (Status)) {
拆解以後 Print 的了局 :
速記法 : 要點竄內容請傳址 (&Ptr)
((TYPE *) ( (CHAR8 *)(Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
利用_CR 的體例 :
(CHAR8 *)(NowLink) : 6194C9C
_CR 會去計算出構造的起始位址,然後回傳回來
重點在於 &(((EFI_MEMORY_POOLS_LISI *) 0)->Link) 這個特別的用法
Entry {
Script = _CR(NowLink, EFI_MEMORY_POOLS_LISI, Link);
Entry {
}
}
Status = EFI_SUCCESS;
...
EFI_STATUS
AcpiMain (
IN OUT EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER **TablePtr
)
{
EFI_STATUS Status;
EFI_MEMORY_POOLS_LISI *Script;
}
利用雙指標的時機
替代後以下
Status = LibGetSystemConfigurationTable (&gEfiAcpiTableGuid, &TablePtr); // gEfiAcpi20TableGuid "ACPI 2.0 Table"
if (EFI_ERROR (Status)) {
Status = AcpiMain(RsdpPtr);
&(((EFI_MEMORY_POOLS_LISI *) 0)->Link) : C
#define _CR(Record翻譯社 TYPE, Field)
EFI_STATUS
AcpiMain (
IN OUT EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER *TablePtr
)
{
EFI_STATUS Status;
((EFI_MEMORY_POOLS_LISI *) ( (CHAR8 *)(NowLink) - (CHAR8 *) &(((EFI_MEMORY_POOLS_LISI *) 0)->Link)))
RsdpPtr 內容不會被改
接下來是重點
ST->ConOut->SetAttribute(ST->ConOut, EFI_BACKGROUND_BLACK | EFI_LIGHTGREEN );
Print (L"ACPI Utility by Harry Lin
%N");
Script = _CR(NowLink, EFI_MEMORY_POOLS_LISI翻譯社 Link);
(CHAR8 *) &(((EFI_MEMORY_POOLS_LISI *) 0)->Link) : C => 注意他掏出 Link 的 Offset
Link : 0x6194C9C
...
#define _CR(Record翻譯社 TYPE, Field)
_CR tracing
Status = EFI_SUCCESS;
Address : 0x6194C90
NowLink 是 萬國翻譯公司們要取的誰人構造內的Link 位址
EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER *RsdpPtr;
ex:
...
首先先講Struct
Script : 0x6194C90
好,那_CR 又是怎麼做的呢??
所以 NowLink 的位址減掉 Offset,就會是它的結構肇端點位址!!!
EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER *RsdpPtr;
再來是 _CR(Record, TYPE翻譯社 Field)
ST->ConOut->SetAttribute(ST->ConOut, EFI_BACKGROUND_BLACK | EFI_LIGHTGREEN );
Print (L"ACPI Utility by Harry Lin
%N");
}
typedef struct _EFI_MEMORY_POOLS_LISI{
EFI_PHYSICAL_ADDRESS Address;
UINTN PoolSize;
EFI_LIST_ENTRY Link;
} EFI_MEMORY_POOLS_LISI;
PoolSize : 0x6194C98
...
本來寫法,這一種方式不可!!
當
以下文章來自: http://linch0520.pixnet.net/blog/post/53222884-%5bcode%5d-c%e8%aa%9e%e8%a8%80---%e9%9b%9c...-有關各國語文翻譯公證的問題歡迎諮詢萬國翻譯公司02-23690931