EDK2最近 release 穩定的版本為UDK2014 和 UDK2015
首先, 到sourceforges下載TianoCore code: https://sourceforge.net/p/tianocore/edk2/ci/UDK2015/tree/
我是下載UDK20014
如果是下載UDK2015, 請先將資料夾放到對應的位置
1. Unzip UDK2015.MyWorkSpace.zip & BaseTools(Windows).zip
2. Put BaseTools, Conf, edkstup.bat to MyWorkSpace
如果是使用Linux則可以直接透過git 取得,
bash$: sudo apt-get install git
bash$: git clone http://github.com/tianocore/edk2
bloggerads
2015年4月10日 星期五
2015年4月7日 星期二
What do BIOS engineer do?
Bios工作內容以Q&A的方式來說明,提供有志於x86韌體發展的朋友了解
1. Bios RD工作是寫x86組合語言嗎?
A: 是C語言。 現在IC高度競爭的年代,也是Time to Market的年代。大家求的就是快、跟易於維護的程式。 所以晶片廠商提供 C 的Compiler環境是必要的, 如果連C都不支援,相信這樣的晶片應該沒人會用。因此在2002年Intel release EFI這個以C為架構的Open source系統後,現在幾乎所有的個人電腦或手機(Iphone)的firmware interface都已經是UEFI (Unified Extensible Firmware Interface)了。下圖是傳統Bios和UEFI Bios比較,UEFI他有現代作業系統的架構,所有控制硬體的方法都是透過呼叫protocol(driver), 而非透過軟體中斷
2. 既然是UEFI 那為什麼舊有的裝置(PCI 卡)還可以使用,連DOS這個作業系統都還能用?
A: 為了要相容過去舊有的架構,UEFI 有CSM這個模組。基本上就是靠它來模擬 Legacy Bios的行為。
3. Bios只是個OS的boot loader嗎? boot loader為什麼需要這麼多工程師
A: Bios主要是OS的boot loader沒錯, 但是x86是個非雜龐大的系統,硬體管理/初始化/設定中斷向量表以及和OS溝通跟硬體錯誤處理都是大學問。再加上x86是採用PCI架構所以有相當彈性的硬體擴充能力,因此有大量的外部裝置,內部也相當複雜,需要很多人來維護這個系統和debug。
4. 當Bios工程師需要從哪裡入門?
A: Bios RD要讀的spec相當多,入門課就是PCI spec, 再來就是搭配UEFI code來看UEFI架構Spec,以及Intel Architectures
Software Developer’s Manual,這些大致上看過後,可以依照自己的興趣去study 南橋晶片上的控制器如 AHCI / XHCI/ LAN...等等,最後還有一份spec比較進階的就是 ACPI spec,用來定義OS和Hardware之間的介面。這些Spec需要反覆的熟讀,我自己也是只了解一部分。
Software Developer’s Manual,這些大致上看過後,可以依照自己的興趣去study 南橋晶片上的控制器如 AHCI / XHCI/ LAN...等等,最後還有一份spec比較進階的就是 ACPI spec,用來定義OS和Hardware之間的介面。這些Spec需要反覆的熟讀,我自己也是只了解一部分。
2015年3月16日 星期一
UEFI : Shell Command & Information
EFI Shell "不" Support exFat / NTFS, 做成此類File System的碟機,只會看到有安裝BlkIo Protocol但看不到增加File system節點, 以下在shell底下研究map指令的輸出結果
從實驗的結果來看,幾個blockio handle的數量會等於partition的數量加上device的數量
幾個可被Uefi recognize的FileSystem(ex: fat32) 就會產生幾個 fs節點
USB Uefi Boot disk
Device mapping table
fs0 :Removable HardDisk - Alias hd16b0c0b blk0
PciRoot(0x0)/Pci(0x1a,0x0)/USB(0x1,0x0)/USB(0x2,0x0)/HD(1,MBR,0x59d5afd7,0x3f,0xead5ff)
blk0 :Removable HardDisk - Alias hd16b0c0b fs0
PciRoot(0x0)/Pci(0x1a,0x0)/USB(0x1,0x0)/USB(0x2,0x0)/HD(1,MBR,0x59d5afd7,0x3f,0xead5ff)
blk1 :Removable BlockDevice - Alias (null)
PciRoot(0x0)/Pci(0x1a,0x0)/USB(0x1,0x0)/USB(0x2,0x0)
hd16b0c0b :Removable HardDisk - Alias fs0 blk0
PciRoot(0x0)/Pci(0x1a,0x0)/USB(0x1,0x0)/USB(0x2,0x0)/HD(1,MBR,0x59d5afd7,0x3f,0xead5ff)
<note>
HD(PartX,SigY)
Partition X on a disk with signature Y
Pci(1|0)
device/slot number 1
function number 0
從實驗的結果來看,幾個blockio handle的數量會等於partition的數量加上device的數量
幾個可被Uefi recognize的FileSystem(ex: fat32) 就會產生幾個 fs節點
USB Uefi Boot disk
Device mapping table
fs0 :Removable HardDisk - Alias hd16b0c0b blk0
PciRoot(0x0)/Pci(0x1a,0x0)/USB(0x1,0x0)/USB(0x2,0x0)/HD(1,MBR,0x59d5afd7,0x3f,0xead5ff)
blk0 :Removable HardDisk - Alias hd16b0c0b fs0
PciRoot(0x0)/Pci(0x1a,0x0)/USB(0x1,0x0)/USB(0x2,0x0)/HD(1,MBR,0x59d5afd7,0x3f,0xead5ff)
blk1 :Removable BlockDevice - Alias (null)
PciRoot(0x0)/Pci(0x1a,0x0)/USB(0x1,0x0)/USB(0x2,0x0)
hd16b0c0b :Removable HardDisk - Alias fs0 blk0
PciRoot(0x0)/Pci(0x1a,0x0)/USB(0x1,0x0)/USB(0x2,0x0)/HD(1,MBR,0x59d5afd7,0x3f,0xead5ff)
<note>
HD(PartX,SigY)
Partition X on a disk with signature Y
Pci(1|0)
device/slot number 1
function number 0
2015年2月13日 星期五
UEFI : Build Nt32 (UEFI 模擬器)
執行步驟:
1. 開啟 cmd
2. 切到UEFI source code 的根目錄
3. edksetup --nt32
4. build -p Nt32Pkg\Nt32Pkg.dsc -a IA32
5. build run
1. 開啟 cmd
2. 切到UEFI source code 的根目錄
3. edksetup --nt32
4. build -p Nt32Pkg\Nt32Pkg.dsc -a IA32
5. build run
2014年12月30日 星期二
C# : virtual + override or (virtual) + new
關鍵字是用來決定哪些成員要使用子類別中的定義
// A a = new B(); //virtuall - new example
//
// A -------------> print (Call A)
// |
// -------------> B print (Call B)
//
namespace virtual_new
{
public class A
{
public virtual void print() { Console.WriteLine("Call A"); } // virtual here is not necessary!
}
public class B : A
{
public new void print() { Console.WriteLine("Call B"); }
}
public class Program
{
public static void Main(string[] args)
{
A a = new B();
a.print(); // Output: Call A
}
}
}
// A a = new B(); //virtuall - new example
//
// A -------------> print (Call A)
// |
// -------------> B print (Call B)
//
namespace virtual_new
{
public class A
{
public virtual void print() { Console.WriteLine("Call A"); } // virtual here is not necessary!
}
public class B : A
{
public new void print() { Console.WriteLine("Call B"); }
}
public class Program
{
public static void Main(string[] args)
{
A a = new B();
a.print(); // Output: Call A
}
}
}
2014年12月10日 星期三
C++ Compiler : g++ 指令介紹
以下提供一些g++指令參數解釋,基本上就是用來生成執行檔/dll檔/obj檔
# Generate file.o
g++ -c file.cpp
# Generate Assembly : file.s
g++ -S file.cpp
# Convert file.o to file_dll.dll (需要先把cpp檔做成obj檔再來轉成dll檔)
g++ -shared file.o -o file_dll.dll
# Generate file.exe
g++ file.cpp -o file
# Generate file.exe from object and cpp files
g++ file.cpp obj.o -o file
# Generate main.exe from dll and cpp files
g++ file_dll.dll main.cpp -o main
# Alternative solution to generate main.exe from file_dll.dll and main.cpp , -L. means current dir
g++ -L. -lfile_dll main.cpp -o main
# Show all the warning
gcc -Wall -o main main.c
# Warning as error
gcc -Wall -Werror -o main main.c
# Generate file.o
g++ -c file.cpp
# Generate Assembly : file.s
g++ -S file.cpp
# Convert file.o to file_dll.dll (需要先把cpp檔做成obj檔再來轉成dll檔)
g++ -shared file.o -o file_dll.dll
# Generate file.exe
g++ file.cpp -o file
# Generate file.exe from object and cpp files
g++ file.cpp obj.o -o file
# Generate main.exe from dll and cpp files
g++ file_dll.dll main.cpp -o main
# Alternative solution to generate main.exe from file_dll.dll and main.cpp , -L. means current dir
g++ -L. -lfile_dll main.cpp -o main
# Show all the warning
gcc -Wall -o main main.c
# Warning as error
gcc -Wall -Werror -o main main.c
2014年11月7日 星期五
ATA: Security Erase flow
ATA 清理硬碟的command有兩種:
下法就是透過Set feature command (EFh), feature=0x90 and count=0x06,來disable software setting preservation
- Trim command: 06h
- Security Erase command: F4h
這邊介紹security erase command flow, 往往市面上的軟體都需要熱插拔碟機,但這邊提供的方法不需要,因此可以適用在PCIe AHCI SSD上
步驟如下:
1. 用ATA Set feature command通知碟機將Comreset 轉成Hardware reset (因為開機Bios會對你的碟機下Security freeze lock讓碟機變成state machine:frozen state。如果不這樣做就得先熱插拔碟機才能讓碟機回到state machine:not frozen, 才可以下security erase)
下法就是透過Set feature command (EFh), feature=0x90 and count=0x06,來disable software setting preservation
這樣之後我們下的Comreset才會被轉成 hardware reset, 讓碟機回到not frozen state
2. 接著透過 port reset 或 HBA reset 發出 COMRESET
3. 下security erase command之前要先設定密碼 (也就是提升權限才能下這個command,最後security erase也會一併erase掉這個密碼)
就是以下這三步驟:
- SECURITY SET PASSWORD: F1h
- SECURITY_ERASE_PREPARE: F3h
- SECURITY_ERASE_UNIT: F4h
訂閱:
文章 (Atom)



