今天把EFI 的一些心得筆記整理的差不多了,所以開始去Trace 一些Source code,在追蹤的過程中發現了Intel 在寫EFI 的時候真的把所有的東西都模組化了,以後寫BIOS的時候可以很方便的去撰寫。
而在這些EFI Code之中,因為幾乎都是C (不是C++,但是Phoenix BIOS可以使用C++方式撰寫,不過我還沒接觸到他們的EFI,所以還不確定是否真的可以!)的語法去撰寫,所以在模組化的同時他也使用了很多巨集指令,也就是使用#define 的方式去宣告了很多不同的巨集指令,在這裡面發現了"##"這個東西,例如下面的範例:
#define MyMacro(a,b,c) {a ## b ##c}
MyMacro(A,B,C)
而##是用來連結字串的,所以展開後會變成ABC,所以在Blog 留下筆記心得的紀錄。
將自己踏入BIOS領域中所學習到的知識做一些心得整理,像是Legacy BIOS、EFI BIOS、Windows Driver...etc. ※版權與智慧財產權聲明:保留所有法律權利。我在寫文章時如果有引用到其他人的地方我會盡量說明參考出處,如果有遺漏的地方請告訴我,我會馬上註明! 而轉貼我的文章時也請您註明出處!
星期四, 5月 31, 2007
星期二, 5月 29, 2007
EFI Protocol 觀念小筆記
C語言的宣告與定義:
1.C語言中只允許變數或函數的定義出現一次。
由於變數只有定義規則,沒有宣告規則,所以當你鍵入int a;時,代表此變數已經被定義了。我們如何宣告一個變數呢? 加上extern 變成exern int a;,告訴comipler,此變數a只是一個宣告,它的定義在別處。
2. C語言函數規則分成宣告與定義二種。當一個函數只有傳回值、名稱、傳入值, 沒有大括號{},compiler會把此種形式當成是函數宣告;如果加上了{}, 形成函數定義。所以你要宣告一個函數,只須鍵入int f(); compiler會自動把它示為函數宣告。
// EFI Protocol
------------------
EFI Protocol 可以看作是一個介面(Interface),透過這個Interface 去存取Data 或是函數,簡單說就是一個指標,指標指向的記憶體可能是Data,也可能是函數。
安裝一個 EFI Protocol 後會以 (GUID | Pointer) 的欄位格式存放在Handle DataBase中,然後就可以在其他地方利用LocateProtcol()方式去得到指標,然後使用他。
1.Data 型式的EFI Protocol
(a)宣告你的Sturcture與GUID在你的Protocol.h 與Protocol.c中
EFI_GUID gGuid=MY_GUID;
Extern gGuid;
typedef struct {
...
UINT8 Array[10];
...
} MY_PROTOCOL;
(b)在DXE Driver中使用使用MY_PROTOCOL "定義"一個變數Test
UINT16 i;
MY_PROTOCOL Test={......};
然後在呼叫InstallProtocol(&gGuid,&Test)去安裝一個Protocol到Handle Database,所以Handle Database中的Guid=gGuid,而指標Pointer=&Test。
2.Function 型式的EFI Protocol也是跟Data型式一樣作法,不同的地方在於宣告的是函數原型。
所以觀念在於如何去宣告Protocol與如何透過GUID+Pointer去做你要做的事情。
1.C語言中只允許變數或函數的定義出現一次。
由於變數只有定義規則,沒有宣告規則,所以當你鍵入int a;時,代表此變數已經被定義了。我們如何宣告一個變數呢? 加上extern 變成exern int a;,告訴comipler,此變數a只是一個宣告,它的定義在別處。
2. C語言函數規則分成宣告與定義二種。當一個函數只有傳回值、名稱、傳入值, 沒有大括號{},compiler會把此種形式當成是函數宣告;如果加上了{}, 形成函數定義。所以你要宣告一個函數,只須鍵入int f(); compiler會自動把它示為函數宣告。
// EFI Protocol
------------------
EFI Protocol 可以看作是一個介面(Interface),透過這個Interface 去存取Data 或是函數,簡單說就是一個指標,指標指向的記憶體可能是Data,也可能是函數。
安裝一個 EFI Protocol 後會以 (GUID | Pointer) 的欄位格式存放在Handle DataBase中,然後就可以在其他地方利用LocateProtcol()方式去得到指標,然後使用他。
1.Data 型式的EFI Protocol
(a)宣告你的Sturcture與GUID在你的Protocol.h 與Protocol.c中
EFI_GUID gGuid=MY_GUID;
Extern gGuid;
typedef struct {
...
UINT8 Array[10];
...
} MY_PROTOCOL;
(b)在DXE Driver中使用使用MY_PROTOCOL "定義"一個變數Test
UINT16 i;
MY_PROTOCOL Test={......};
然後在呼叫InstallProtocol(&gGuid,&Test)去安裝一個Protocol到Handle Database,所以Handle Database中的Guid=gGuid,而指標Pointer=&Test。
2.Function 型式的EFI Protocol也是跟Data型式一樣作法,不同的地方在於宣告的是函數原型。
所以觀念在於如何去宣告Protocol與如何透過GUID+Pointer去做你要做的事情。
標籤:
EFI BIOS相關知識
星期一, 5月 28, 2007
今天收到的新聞~~~
外傳廣達接獲新的iPhone訂單,廣達表示,廣達接單方向積極朝多元化產品發展,不會對單一客戶進行評論。據瞭解,開發一款手機約要六個月到九個月,隨著第一代iPhone推出,蘋果內部確實也在開發第二代iPhone,但訂單花落誰家,要視第一代產品銷售狀況才會決定。
看樣子我要去問問我那些做Apple代工的朋友們消息是否正確了....呵呵!
看樣子我要去問問我那些做Apple代工的朋友們消息是否正確了....呵呵!
訂閱:
文章 (Atom)