小華的部落格: 2007/5/27 - 2007/6/3

搜尋此網誌

網頁

星期四, 5月 31, 2007

EFI v.s #define

今天把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 留下筆記心得的紀錄。

星期二, 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去做你要做的事情。

星期一, 5月 28, 2007

今天收到的新聞~~~

外傳廣達接獲新的iPhone訂單,廣達表示,廣達接單方向積極朝多元化產品發展,不會對單一客戶進行評論。據瞭解,開發一款手機約要六個月到九個月,隨著第一代iPhone推出,蘋果內部確實也在開發第二代iPhone,但訂單花落誰家,要視第一代產品銷售狀況才會決定。

看樣子我要去問問我那些做Apple代工的朋友們消息是否正確了....呵呵!