將自己踏入BIOS領域中所學習到的知識做一些心得整理,像是Legacy BIOS、EFI BIOS、Windows Driver...etc. ※版權與智慧財產權聲明:保留所有法律權利。我在寫文章時如果有引用到其他人的地方我會盡量說明參考出處,如果有遺漏的地方請告訴我,我會馬上註明! 而轉貼我的文章時也請您註明出處!
星期一, 10月 19, 2009
InsertList
1.EFI中都是喜歡使用雙向鏈結串列(doubly linked list)
在雙向鏈結串列中的節點(Node)至少有2個欄位,一個為向後結欄 (BackLink) ,另一個為向前鏈結欄 ( ForwardLink ) 。其必要的宣告為:
typedef struct node *node_ptr ;
typedef struct node {
node_ptr Flink ;
node_ptr Blink ;
} ;
2.插入鏈結串列可以從頭插入或是從尾插入兩種,底下是圖示來表示這兩種差別。
InsertHeadList();
InsertTailList();
這些鏈結的運用在EFI中隨處可見,所以在這邊留下筆記來紀錄一下學習心得!
星期五, 10月 09, 2009
NMAKE (1)
而為了測試NMAKE.EXE 的使用方式,所以自己就會去做一些小實驗來了解一些東西,然後順便把他紀錄下來。
底下是我為了想知道$** 跟$@ 是代表什麼用意時所做的一些實驗,因為是初學者,所以各位看官就別取笑小弟我的土法煉鋼法喔~
1.準備test.mak,其內容如下:
SOURCE_FILE_NAME = test.mak
DEST_DIR = c:\maktest
BASE_NAME = test
$(DEST_DIR)\$(BASE_NAME).bin : $(SOURCE_FILE_NAME)
echo $**
echo $@
copy $** $@
all: $(BIN_DIR)\$(BASE_NAME).bin
2.進入NAMKE環境,鍵入:
C:\maktest\>NMAKE /F test.mak
3.結果
echo test.mak
test.mak
echo c:\maktest\test.bin
c:\maktest\test.bin
copy test.mak c:\maktest\test.bin
1 file(s) copied.
C:\maktest>
4.結論
可以看的到$** 是代表$(SOURCE_FILE_NAME)
而$@ 看起來是代表$(DEST_DIR)\$(BASE_NAME).bin
所以copy $** $@ 等同於 copy test.mak c:\maktest\test.bin
從makefile寫法來看:
$**應該就是[dependency]
$@ 應該就是[target]
[target]: [dependency] [dependency]
[TAB][rule] <--要注意,寫rule之前要加tab.
[TAB][rule]
星期二, 10月 06, 2009
星期四, 6月 18, 2009
Visual C++ 編譯器選項
因為怕微軟更新網站資料就消失了,因此在這邊記錄選項的部分內容,如果有興趣了解更多的人可以到經由連結到微軟網站得到更多詳細的訊息:
選項 | 用途 |
---|---|
指定回應檔。 | |
列出編譯器選項。 | |
指定一個要搜尋的目錄,以解析傳遞給 #using 指示詞的檔案參考。 | |
啟用程式碼分析 | |
在程式碼產生時使用 SSE 或 SSE2 指令 (僅適用於 x86)。 | |
增加 .obj 檔中可定址區段的數目 | |
在前置處理過程中保留註解。 | |
編譯而不連結。 | |
產生輸出檔案,以便在 Common Language Runtime 上執行。 | |
定義常數和巨集。 | |
將文件註解處理成 XML 檔案 | |
複製前置處理器輸出至標準輸出。 | |
指定例外處理模型。 | |
複製前置處理器輸出至標準輸出。 | |
讓您直接提供內部編譯器錯誤 (ICE) 資訊給 Visual C++ 團隊 | |
設定堆疊大小。 | |
產生已為特定 x64 架構最佳化的程式碼,或為 AMD64 和 延伸記憶體 64 技術 (Extended Memory 64 Technology, EM64T) 架構中微架構特性最佳化的程式碼 | |
建立清單檔。 | |
設定清單檔名稱。 | |
顯示在診斷測試中傳遞給 cl.exe 的原始程式檔完整路徑 | |
重新命名程式資料庫檔案。 | |
重新命名可執行檔。 | |
前置處理指定的包含檔。 | |
建立對應檔 (Mapfile)。 | |
建立目的檔。 | |
指定浮點行為 | |
指定先行編譯標頭檔的名稱。 | |
產生瀏覽器檔案。 | |
強制使用某一檔名,就如同它已傳遞給 #using 指示詞一樣。 | |
將插入的程式碼與原始程式檔合併。 | |
為 Itanium 處理器執行最佳化。只有 IPF 跨平台編譯器或 IPF 原生編譯器才有提供。 | |
為 Itanium2 處理器最佳化 (預設值為 /G1 與 /G2 之間),只有 IPF 跨平台編譯器或 IPF 原生編譯器才有提供。 | |
對 Windows 應用程式進行程式碼最佳化。 | |
使用 __cdecl 呼叫慣例 (僅適用於 x86)。 | |
啟動堆疊探查。 | |
啟用字串共用。 | |
呼叫攔截 (Hook) 函式 _pexit。 | |
呼叫攔截 (Hook) 函式 _penter。 | |
啟用整個程式最佳化。 | |
啟用最少重建。 | |
啟用執行階段型別資訊 (RTTI)。 | |
使用 __fastcall 呼叫慣例 (僅適用於 x86)。 | |
緩衝處理安全性檢查。 | |
控制堆疊探查。 | |
對使用靜態執行緒區域儲存區配置的資料支援 Fiber 安全性。 | |
啟用同步例外處理。 | |
啟用函式階層連結。 | |
與 /RTC1 相同。/RTC (執行階段錯誤檢查) | |
使用 __stdcall 呼叫慣例 (僅適用於 x86)。 | |
限制外部 (公用) 名稱的長度。 | |
列出編譯器選項。 | |
在函式進入時,強制暫存器中所傳遞的參數寫入至堆疊上的位置。這個編譯器選項只適用於 x64 編譯器 (原生和跨平台編譯) | |
建立可線上修補的影像 | |
搜尋包含檔的目錄。 | |
變更預設 char 型別。 | |
建立動態連結程式庫。 | |
建立偵錯動態連結程式庫。 | |
傳遞指定的選項給 LINK。 | |
建立 MSIL 模組 | |
使用 MSVCRT.lib 建立多執行緒 DLL。 | |
使用 MSVCRTD.lib 建立偵錯多執行緒 DLL。 | |
使用 LIBCMT.lib 建立多執行緒可執行檔。 | |
使用 LIBCMTD.lib 建立偵錯多執行緒可執行檔。 | |
隱藏登入程式的啟始資訊。 | |
建立小型程式碼。 | |
建立快速程式碼。 | |
控制內嵌展開。 | |
停用最佳化。 | |
使用全域最佳化。 | |
產生內建函式。 | |
在原始程式碼中啟用 #pragma omp | |
偏好小的程式碼。 | |
偏好快的程式碼。 | |
使用最大最佳化 (/Ob2gity /Gs)。 | |
省略框架指標 (僅適用於 x86)。 | |
在必須從浮點型別轉換為整數型別時,抑制 _ftol (僅適用於 x86)。 | |
根據 B CPU 逐步偵錯的 errata,不會產生指令順序,而導致意外結果(僅適用於 IPF)。 | |
根據 C CPU 逐步偵錯的 errata,不會產生指令順序,而導致意外結果(僅適用於 IPF)。 | |
不要使用上層 96 浮點暫存器(僅適用於 IPF)。 | |
產生影像加上與位置有關的程式碼 (僅適用於 IPF) | |
為不在執行階段建立函式的程式增強效能(僅適用於 IPF)。 | |
將前置處理器輸出寫入檔案。 | |
啟用執行階段錯誤檢查。 | |
在編譯時顯示包含檔清單。 | |
指定 C 原始程式檔。 | |
指定 C++ 原始程式檔。 | |
移除某個預先定義巨集。 | |
移除所有預先定義巨集。 | |
設定版本字串。 | |
抑制或啟用隱藏的 vtordisp 類別成員。 | |
對指向成員的指標使用最佳基底。 | |
對指向成員的指標使用完整一般性。 | |
宣告多重繼承。 | |
宣告單一繼承。 | |
宣告虛擬繼承。 | |
設定警告層級。 | |
停用所有警告。 | |
啟用所有警告,包括預設停用的警告。 | |
從命令列編譯 C++ 原始程式碼時啟用一行錯誤和警告訊息診斷。 | |
偵測 64 位元可移植性問題。 | |
忽略標準 Include 目錄。 | |
忽略目前組建中所有其他先行編譯標頭編譯器選項。 | |
建立先行編譯標頭檔。 | |
將完整的偵錯資訊置於所有目的檔中。 | |
在建立偵錯程式庫時插入一個 PCH 參考 | |
在建置時使用先行編譯標頭檔。 | |
產生 C 7.0 相容的偵錯資訊。 | |
停用語言擴充功能。 | |
指定 /Ze 下的標準行為。/Za、/Ze (停用語言擴充功能) | |
啟用語言擴充功能。 | |
產生函式原型。 | |
將偵錯資訊包括在與「編輯後繼續」相容的程式資料庫中。 | |
產生完整偵錯資訊。 | |
從 .obj 檔案移除預設程式庫名稱 (僅適用於 x86)。 | |
指定先行編譯標頭的記憶體配置上限。 | |
封裝結構成員。 | |
僅檢查語法。 | |
產生可偵錯最佳化程式碼,只有 IPF 跨平台編譯器或 IPF 原生編譯器才有提供 |
Reference
星期日, 5月 17, 2009
Intel EFI Specs資訊
怕自己忘記去哪下載!
所以就留下筆記記錄一下!
這些都是Intel 所提供的相關文件,有興趣的可以去Intel網站抓。
ftp://download.intel.com/technology/framework/docs
ftp://download.intel.com/technology/framework/docsReference
www.intel.com
星期三, 5月 13, 2009
AfterG3 bit
狀態1 : S0/S1/S3 電源有問題,重新上電
1=保持S5
0=啟動
狀態2 : S4 電源有問題,重新上電
1=保持S4
0=啟動
狀態3 : S5 電源有問題,重新上電
1=保持S5
0=啟動
星期二, 4月 21, 2009
C/C++ Compiler Intrinsics
EX:
__debugbreak();
__enable();
__disable();
http://msdn.microsoft.com/zh-tw/library/26td21ds.aspx
星期三, 1月 21, 2009
老程式也有它的好處
剛好前陣子公司同事也有分享這個用法,所以就順便把他在做個簡單的介紹。
老程式Debug.com 有支援輸入/輸出導向,也就是以前DOS下的 ">" 跟"<" 符號所做的事情, 而他的用法很簡單,你只要在一個文字檔中先寫好你要做的事情,然後導入到Debug.com中 就可以了,而Debug.com就會依照你的文字檔的動作去做事情! 例如原本你使用debug.com時你做了下面的動作 -d
-q
那麼你就可以寫成一個Test.txt,然後裡面的內容是:
d
q
接著進入DOS Cmd prompt ,導入這個文字檔給debug.com 例如:
C:\> debug < test.txt
這樣子debug就會自動幫你執行d指令,還有q 離開debug.com.
而下面是一個Dump PIRQ的批次檔,我會自己去F Segment內找到'$PIR' 的位址,然後透過D指令去Dump 這個記憶體,接著把Dump的內容寫到一個檔案中:
@ECHO OFF
REM ============= Find PIRQ ===================
ECHO. s f000:0 ffff '$PIR' > FindPIRQ.txt
ECHO. q >> FindPIRQ.txt
debug <> PIRQAddr.txt
REM ============= Set variable ===================
FOR /F %%A in ('FINDSTR /C:"F000" PIRQAddr.txt') do SET FSEG=%%A
REM ============= Dump PIRQ ===================
ECHO. d %FSEG% > DumpPIRQ.txt
ECHO. d >> DumpPIRQ.txt
ECHO. d >> DumpPIRQ.txt
ECHO. d >> DumpPIRQ.txt
ECHO. d >> DumpPIRQ.txt
ECHO. q >> DumpPIRQ.txt
debug <> Pirq.txt
ECHO.
ECHO. Output: PIRQ.txt
ECHO.
DEL FindPIRQ.txt
DEL PIRQAddr.txt
DEL DumpPIRQ.txt
pause
底下是我產生的文字檔內的內容:
- d F000:DE80
F000:DE80 24 50 49 52 00 01 60 01-FF FF 00 00 86 80 2E 12 $PIR..`.........
F000:DE90 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
F000:DEA0 00 00 00 F8 DE 00 F8 DE-00 F8 DE 00 F8 DE 00 00 ................
F000:DEB0 00 38 60 E0 1C 00 F8 DE-00 F8 DE 00 F8 DE 00 00 .8`.............
F000:DEC0 00 08 60 E0 1C 00 F8 DE-00 F8 DE 00 F8 DE 00 00 ..`.............
星期日, 1月 18, 2009
人生無常
去年,2008.11.18 我敬愛的叔叔走了,當時很難過;一個我從小當成典範的長輩一個疼愛我的長輩離開了我,但想到他能夠自癌病中解脫,能夠到達另一個世界去未嘗不是一種新的祝福!
但人生就是如此無常,二個月後的昨天2009.01.18,我自小照顧我的奶奶因為心肌梗塞突然送進加護病房急救,在我回到苗栗時奶奶就已經走了! 最後一面沒有見到,心好痛! 在陪伴著、看著她安詳的躺在那時,淚水一直停不下來!
『人生無常』,希望大家能夠好好珍惜身邊的親友與你最愛的人! 平凡的幸福才是真正的幸福,一早起來你的親友和你愛的人能夠笑著跟你打聲招呼,這種平凡的幸福在此刻的我真的難以擁有啊!
星期日, 1月 11, 2009
EFI 的新體驗~
像是最近研究EFI code的過程中發現了一個好玩的東西,原來C也有類似 Strong/Weak 的寫法!
以前一直笨笨的想說C要怎麼去做這部份的東西,還一直以為做不到! 原來這些東西都已經有參考範例在EFI code之中了! 只是以前壓根子都沒想過原來C可以這樣玩~在慢慢消化EFI code的過程中還真的是驚奇不斷咧!
從最近學習EFI code的過程之中,真的讓我對C語言有了更深一層的了解;在此時回頭去想想以前自己在學校中老是以為我已經對C有一定層度的認知~現在才發現 "原來我只是個井底之蛙啊"....