namespace List { class Program { static void Main(string[] args) { List<int> list = new List<int>(new int[] { 19, 23, 29 }); int index = list.IndexOf(23); // Check if 23 Exists. Console.WriteLine(index); index = list.IndexOf(10); // Does not exist. Console.WriteLine(index); list.Add(35); list.Insert(1, 40); list.Remove(23); // RemoveAt(index) method, or the Remove(obj) list.RemoveAt(0); // RemoveAt(index) method, or the Remove(obj) foreach (int x in list) { Console.WriteLine(x); } Console.ReadLine(); } } }
bloggerads
2015年12月31日 星期四
C# : algorithm "List" sample code
C# : algorithm "Dictionary" sample code
The following sample code was searched from internet, It's a good example to show how C++ map work on C# as Dictionary
// Algorithm map namespace Map { class Program { static void Main(string[] args) { // Use Dictionary as a map. var map = new Dictionary<string, string>(); // ... Add some keys and values. map.Add("cat", "orange"); map.Add("dog", "brown"); // ... Loop over the map. foreach (var pair in map) { string key = pair.Key; string value = pair.Value; Console.WriteLine(key + "/" + value); } // ... Get value at a known key. string result = map["cat"]; Console.WriteLine(result); // ... Use TryGetValue to safely look up a value in the map. string mapValue; if (map.TryGetValue("dog", out mapValue)) { Console.WriteLine(mapValue); } } } }
2015年12月30日 星期三
C# : The difference between C# and C in initializing a struct array
The difference between C# and C in initializing a struct array
// C# struct st { public int x; public int y; } public static void Main(string[] args) { st [] o = new st [] { new st { x=2, y=3 }, new st { x=3, y=4 } }; } // C/C++ struct st { int x; int y; }; int main() { st o[] = { {.x=2, .y=3}, {.x=3, .y=4} }; }
2015年12月29日 星期二
ACPI: Power Management
ACPI: Advanced Configuration & Power Interface
ACPI分別對系統(Gx), 周邊裝置(Dx), 睡覺層級(Sx), CPU(Cx) 定義電源層級, 如下
1. Gx (Global state, 整個系統) :
ACPI分別對系統(Gx), 周邊裝置(Dx), 睡覺層級(Sx), CPU(Cx) 定義電源層級, 如下
1. Gx (Global state, 整個系統) :
- G0 = Working state (C0~C3)
- G1 = Sleeping state (S2~S4)
- G2 = Soft off (S5)正常關機,電源還插著因此主機板還有standby power,可被外部如LAN喚醒開機
- G3 = 拔電源(Mechanical off)
- D0 = 正常運作
- 耗電 D1 > D2
- D3 = 斷電
2015年12月24日 星期四
x86 spec / Bios 常見術語
[ CPUID ]
CPUID 是 80486 CPU 新增的一個指令,它的用途在於鑑別 CPU 種類或提供 CPU 特性,讀取方式如下:
void cpuid (DWORD idx) // idx是index, 不同index得到不同資料
{
_asm
{
mov eax, idx
cpuid
}
// eax, edx, ecx,...值為CPU相關的資訊
}
|
Check fingerprint of SSH public key (Linux command)
//
// Check SSH public key fingerprint
//
[root@martin Desktop]# ls /etc/ssh/*key*
/etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ed25519_key.pub
/etc/ssh/ssh_host_ecdsa_key.pub /etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_ed25519_key /etc/ssh/ssh_host_rsa_key.pub
[root@martin Desktop]# ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
2048 99:d1:36:00:44:0a:cb:70:83:c8:21:76:c5:2a:d7:d9 (RSA) // fingerprint
// Check SSH public key fingerprint
//
[root@martin Desktop]# ls /etc/ssh/*key*
/etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ed25519_key.pub
/etc/ssh/ssh_host_ecdsa_key.pub /etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_ed25519_key /etc/ssh/ssh_host_rsa_key.pub
[root@martin Desktop]# ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
2048 99:d1:36:00:44:0a:cb:70:83:c8:21:76:c5:2a:d7:d9 (RSA) // fingerprint
2015年12月22日 星期二
pscp (putty) : Transfer data between Windows / Linux
Step 1: Install putty, I use pscp command in putty in Windows side (client)
sudo apt-get install openssh-server openssh-client
My Linux configure ---> IP: 111.111.111.111,
Step 2: Install openssh-server openssh-client in Linux side (server)
Step 3: Demonstrate a example (The default path in Linux is Home)
# I am in windows (client), trying to copy file e:\MyFile.xxx from / to Linux(server)
My Linux configure ---> IP: 111.111.111.111,
Admin_Name/Password: MartinLee/8888,
file at Home/Documents/MyFile.xxx
file at Home/Documents/MyFile.xxx
2015年12月7日 星期一
ACPI: APEI (ACPI Platform Error Interfaces)
ACPI: OS和Bios溝通的介面,APCI定義有3個Runtime元件(ACPI Registers/ACPI Bios/ACPI Tables)
OSPM: 支援ACPI規範的OS
ACPI Bios: 支援ACPI規範的Bios
OSPM: 支援ACPI規範的OS
ACPI Bios: 支援ACPI規範的Bios
2015年12月5日 星期六
UEFI : programming notes
UEFI一共分成SEC->PEI->DXE->BDS->TSL->RT->AL這幾種階段。
我們會將晶片的一些driving 值寫在PEI stage。DXE階段大部分Bios Vendor都有提供相對應的driver。目前只有碰到為了寫Option Rom或做實驗才針對這個device去寫DXE driver。
焦點回到PEI->DXE這兩個關鍵的階段並列出一些重要的觀念:
1. 在boot時,PEI的階段基本上會有兩條路,一條是正常開機呼叫到的function,另一種則是S3 resume呼叫到的function,而Bios 在S3不做DXE init。因此如果是為了加code來patch 問題,必須知道patch的點
2. PEI 裡面的程式都是叫做module, PEIM, 這些module有些是有相依性的。PEI和PEI互相溝通的橋梁就是PPI,透過這個interface, (*PeiServices)->LocatePpi(), 可以去呼叫已被安裝的service以及去讀取外部的參數
3. 在PEI到DXE時,會透過HOB, (*PeiServices)->GetHobList去得到由PEI階段pass過來的資料
4. 在x86架構就是使用PCI架構及其定義的三種空間, (CFG space / MMIO / IO space),基本上掌握住這三種空間的access方式,加code就不會太難。在早期legacy Bios + DOS的年代要access就是: MMIO 透過指標,IO及CFG space透過IN/OUT指令就可以完成了。UEFI的架構則最好是透過PEI service/ DXE protocol來做。DXE的部分就是使用 EFI PCI IO PROTOCOL 這個protocol
2015年12月3日 星期四
MSI Capability (0x05) 和 MSIX Capability (0x11)
2015年12月1日 星期二
SMBus (System Management Bus)
X86架構下要access SMBus device,可以透過 SMBus Controller (D31:F3)的IO Base address ,Intel定義這個IO位置在PCI configuration space的0x20~0x23
從0x20~0x23得到SMBus IO Base address後,主要是操作下列0~7 offset IO registers就可以完成Byte/Word/Block command的R/W
2015年11月28日 星期六
PIC IRQ in PCI
先介紹PCI configuration的兩個欄位Interrupt Line (0x3C) / Interrupt Pin (0x3D)
# Interrupt Line (0x3C)
# Interrupt Line (0x3C)
a. 這個configuration space register欄位的值是看Bios IRQ routing到哪個 IRQ number後Bios填進去的,系統或device driver可能會使用到, 只是現在的系統很少在用PIC了。(PCI device因為只有定義四個interrupt pin, 因此通常會IRQ sharing)
b. 另外一種方法是透過int 1A, GET_IRQ_ROUTING_EXPANSIONS, 來得到routing的位置 (PCI firmware spec有提到但是沒試過)
a. 出廠就固定了
2015年11月13日 星期五
X86 Reset
X86 Reset
- Soft reset ( Warm boot / Ctrl+Alt+Del) (Software Reset, Assert CPU Init#):
- IoWrite8 (0xCF9, 0x04); or
- IoWrite8 ( 0x92, 0x01); or
- IoWrite8 ( 0x66, 0xFE); // KB Controller assert KBRST#(SIO) -> RCIN#(SB)
- Hard reset (Cold boot):
- IoWrite8(0xCF9, 0x06) , HW Assert PLTRST# 16 cycles
- IoWrite8(0xCF9, 0x0E) , HW Assert PLTRST# 16 cycles
2015年10月22日 星期四
APIC (Advanced Programmable Interrupt Controller)
APIC (Advanced Programmable Interrupt Controller)有分Local / IO APIC這兩種,這兩種都會同時存在系統上,一個管外部一個管內部。Local APIC是每個CPU核心都有的,而IO APIC(Intel 82093)是外部接收中斷的中斷控制器,可以決定要以什麼型態以及發給哪個核心。
Local APIC可以處理以下的中斷:
1. CPU Core相連的I/O設備。比如直接連在LINT0,LINT1 pin上的設備。
2. 外部的I/O設備。這些設備産生的中斷先經過I/O APIC,然後再通過LOCAL APIC到達處理器。
3. Inter-processor interrupts (IPIs), CPU核心之間的中斷。當一個核心想中斷另外一個就可以用IPI。
Local APIC可以處理以下的中斷:
1. CPU Core相連的I/O設備。比如直接連在LINT0,LINT1 pin上的設備。
2. 外部的I/O設備。這些設備産生的中斷先經過I/O APIC,然後再通過LOCAL APIC到達處理器。
3. Inter-processor interrupts (IPIs), CPU核心之間的中斷。當一個核心想中斷另外一個就可以用IPI。
2015年10月21日 星期三
MCA (Machine Check Architecture)
MCA 最初的設計是用來report hardware error,如 system bus errors, ECC errors, parity errors,
cache errors, TLB errors等等。
register主要分成兩部分 Global Control MSRs與 Error-Reporting Bank Registers
2015年10月16日 星期五
UBUNTU 下的硬碟對拷方法
使用"dd"這個指令,將硬碟a完全複製到硬碟b
(Please prepare a ubuntu system to boot and use buit-in app "dd" to clone disk a, b, c,... to disk a, b, c,...)
1. find your disk by calling built-in app "Disks" and find which disk is source and which one is destination
for example, my source disk is sdc, destination disk is sda
2. sudo dd if=/dev/sdc of=/dev/sda bs=200M
bs is very critical, although I type 200M, but actually average speed is around 100MB, if you dont give this parameter, the clone process might take very long time
3. wait then done.
<Note>
if you want to see the progress, open a new terminal and type:
watch -n 5 killall -USR1 dd
Then the dd will start to show the progress every 5 seconds.
(Please prepare a ubuntu system to boot and use buit-in app "dd" to clone disk a, b, c,... to disk a, b, c,...)
1. find your disk by calling built-in app "Disks" and find which disk is source and which one is destination
for example, my source disk is sdc, destination disk is sda
2. sudo dd if=/dev/sdc of=/dev/sda bs=200M
bs is very critical, although I type 200M, but actually average speed is around 100MB, if you dont give this parameter, the clone process might take very long time
3. wait then done.
<Note>
if you want to see the progress, open a new terminal and type:
watch -n 5 killall -USR1 dd
Then the dd will start to show the progress every 5 seconds.
2015年9月14日 星期一
DOS boot menu problem (autoexec.bat + exe file )
在dos下想要做選單連結一些執行檔,但是將執行檔路徑寫在autoexec.bat 常常會碰到顏色花掉以及執行完執行檔卻回不了DOS的問題。
原因是因為在執行autoexec.bat時DOS initial還沒完成(還必須設定VGA mode跟執行int 21h回到Dos),因此autoexec.bat內不能直接執行用C寫的程式,要先寫執行一個組合語言寫的程式切video mode 以及呼叫DOS中斷來回到DOS,才會完整跑完DOS initial的流程。
在autoexec.bat最前面先放以下這隻程式,之後再跑其他的C語言寫的執行檔都能順正常執行,執行完後也能順利回到DOS
原因是因為在執行autoexec.bat時DOS initial還沒完成(還必須設定VGA mode跟執行int 21h回到Dos),因此autoexec.bat內不能直接執行用C寫的程式,要先寫執行一個組合語言寫的程式切video mode 以及呼叫DOS中斷來回到DOS,才會完整跑完DOS initial的流程。
在autoexec.bat最前面先放以下這隻程式,之後再跑其他的C語言寫的執行檔都能順正常執行,執行完後也能順利回到DOS
2015年8月20日 星期四
2015年8月12日 星期三
DRAM overview
每周部門meeting都會討論各function owner的issue,然後幾乎都是一堆DRAM的issue。
我自己也不是很懂,不過我把比較常聽到同事講的東西加上自己的理解寫一篇來分享
1. DRAM Data的寬度是 8 bytes (64bits)/ 含有ECC的則是72bits
2. Channel/Rank/記憶體顆粒的解釋:
- 1個channel可以有很多Dimm, 但每個channel有支援Rank的數量限制 (如H61/H81單一Channel只能接受2個Rank)
- 1條Dimm可以有很多Rank. (一條記憶體目前最多是有4個Rank)
- 1個Rank資料寬度是64bit, 由許多記憶體顆粒組成這個資料寬度, 1個記憶體顆粒資料寬度可能是8bit, 16bit,.同一個Rank上的記憶體顆粒他們的CS都是接在一起。
- bank則是cell 組成的二維陣列(Row & Column), 使用控制訊號為BA0, BA1,.
3. DRAM 頻率的算法
- IO clock (或稱Bus clk, 外頻) = Memory clock (或稱Internal clk, 內頻)* 1或2或4或8 (要看是DDR或DDR2或DDR3或DDR4)
- Data rate (數據速率) = Memory clock * 2或4或8或16 (要看是DDR或DDR2或DDR3或DDR4)
- ex: 模組名稱: PC3-6400 (DDR3-800): IO clock=400MHz(因為是double date rate), 記憶體clock=100MHz, 數據速率=800MT/s
5. Bank Interleaving技術: 原理是將奇數位址和偶數位址分在不同bank,減少讀寫當前字元而影響下一個字元的時間
6. CPU 至 DRAM 顆粒層級由大至小為 channel>DIMM>rank>chip>bank>row/column
6. CPU 至 DRAM 顆粒層級由大至小為 channel>DIMM>rank>chip>bank>row/column
2015年8月1日 星期六
UEFI : ROM 格式
相關設定請參考 .fdf (Flash Description Files)檔案
UEFI對於ROM的格式,可以分為下面幾項:(由大集合到小集合)
● Firmware Device (FD):
● Firmware Device (FD):
Bios Rom即是一個 FD, 一個FD可以由多個FV組成● Firmware Volume (FV):
每個FV通常是由一個 header+N個Firmware Files所組成, 一般說的Boot Firmware Volume/ Recovery Firmware Volume/ Main Firmware Volume就是以這個為單位, FV的細部定義如下:
2015年7月26日 星期日
UEFI 各階段資料的傳遞方式
將bios 選單變數(ex: SetupData.my_var)傳遞到PEI及DXE的方法
// // PEI 接收資料 // Status = (*PeiServices)->LocatePpi ( PeiServices, &gEfiPeiReadOnlyVariablePpiGuid, 0, NULL, &ReadOnlyVariable ); ASSERT_PEI_ERROR (PeiServices, Status); VariableSize = sizeof (SETUP_DATA); Status = ReadOnlyVariable->GetVariable ( PeiServices, L"Setup", &gEfiSetupGuid, NULL, &VariableSize, &SetupData ); if (EFI_ERROR (Status)) return;
SMBios (System Management Bios)
使用者可以透過SMBios知道這台電腦的詳細規格,RW everything / RW這些tool都有提供SMBios data查詢。
SMBios是一份軟體的spec, 他定義了兩個table, 即EPS ( Entry Point structure) 和 Structure Table
EPS位於記憶體1MB以下64K之間,也就是0xF0000 ~ 0xFFFFF之間。透過程式搜尋搜尋_SM_和_DMI_這兩個Keyword可以找到這個table。
以下是 SMBIOS 2.1 (32-bit) Entry Point structure,這邊列出比較重要的部分
Offset
|
Name
|
Length
|
Description
|
00h
|
Anchor String
|
4 BYTEs
|
_SM_, specified as
four ASCII characters (5F 53 4D 5F).
|
10h
|
Intermediate Anchor
String
|
5 BYTEs
|
_DMI_, specified as
five ASCII characters (5F 44 4D 49 5F)
|
16h
|
Structure Table
Length
|
WORD
|
Total length of
SMBIOS Structure Table, pointed to by the Structure Table Address, in bytes
|
18h
|
Structure Table
Address
|
DWORD
|
32-bit physical
starting address of the read-only SMBIOS Structure
|
1Ch
|
Number of SMBIOS
Structures
|
WORD
|
Handle的數量
|
2015年7月6日 星期一
UEFI : DXE Driver
● 何謂Protocol:
typedef的結構。在UEFI下會綁定GUID,並且透過Driver來安裝Protocol instance到handle上. 上層若要控制device,必須透過呼叫Protocol instance來達成。
● Bus Driver Vs. Device Driver:
Bus Driver會Create Child handle 但Device Driver不會。如果Bus Driver Create的 Child handle是Physical device, Bus Driver 必須安裝Device Path Protocol instance到Child handle
● Driver Initialization:
Driver Image會從儲存裝置(Rom, flash,...)中載入,也就是說,一旦在儲存裝置中找到Driver Image, 就會使用Boot Service的LoadImage(), 將Driver Image載入到System Memory. 同時該driver會生成自己的Handle,並且在該Handle下安裝EFI_LOADED_IMAGE_PROTOCOL。
typedef
EFI_STATUS
LoadImage (
IN
BOOLEAN BootPolicy,
IN
EFI_HANDLE ParentImageHandle,
IN
EFI_DEVICE_PATH_PROTOCOL *DevicePath, // The DeviceHandle specific file path
from which the image is loaded.
IN
VOID *SourceBuffer OPTIONAL,
IN
UINTN SourceSize,
OUT
EFI_HANDLE *ImageHandle // Pointer to the returned image handle that is created
when the image is successfully loaded.
);
裝了EFI_LOADED_IMAGE_PROTOCOL 的Handle稱之為Image Handle。
接著,透過Boot Service的StartImage()來啟動driver,driver會在Image Handle上安裝其它的Protocol,如果是EFI Driver Model的driver,那麼會安裝EFI_DRIVER_BINDING_PROTOCOL, 如下,這時Driver Image才真正被當作Driver來處理
//
// Interface structure for the
ControllerHandle Driver Protocol
//
typedef struct _EFI_DRIVER_BINDING_PROTOCOL
{
EFI_DRIVER_BINDING_SUPPORTED
Supported;
EFI_DRIVER_BINDING_START
Start;
EFI_DRIVER_BINDING_STOP
Stop;
UINT32 Version;
EFI_HANDLE
ImageHandle;
EFI_HANDLE
DriverBindingHandle;
} EFI_DRIVER_BINDING_PROTOCOL;
LoadImage()和StartImage()做完之後,driver會等待被Boot Service的ConnectController()調用(invoked)去連接到某個Controller。這時在System Memory中已經Load了很多的Driver都在等待被connect到Controller,這時ConnectController()會以Polling的方式去調用每個Driver Handle中的EFI_DRIVER_BINDING_PROTOCOL.Supported(),如果回EFI_SUCCESS,那麼該driver就會被connect到controller上。之後會透過EFI_DRIVER_BINDING_PROTOCOL.Start()來初始化以及安裝特定的Protocol到此Controller。
2015年6月19日 星期五
UEFI : PEI Phase Code Trace
$ PEI (Pre Efi Initialization)的概述:
● Small, tight startup code
● Publishes own protocol and call-abstraction with PPI
● Small, tight startup code
• Startup with transitory memory store for call-stack (I.e., cache)
• XIP from ROM● Core locates, validates, and dispatches PEIMs
● Publishes own protocol and call-abstraction with PPI
• Silicon/platform abstractions● Primary goals
• Discover boot mode
• Launch modules that initialize main memory
• Discovery & launch DXE core- Convey platform info into DXE
2015年6月16日 星期二
UEFI : SEC Phase Code Trace
UEFI 架構只有SEC這個phase因為是machine dependent而且cache/memory尚未初始化,所以剛開始是組合語言寫的,最主要就是做以下這幾件事:
從上電的reset vector, trace Code如下:
進入點為 UefiCpuPkg\ResetVector\Vtf0\Ia16\ResetVectorVtf0.asm
- 切32位元(或64位元)flat mode
- Cache As Ram (在Flat32.asm中jump到CacheAsRam函數的位址)
- 找BFV(Boot Firmware Volume), BFV指的是存放PEI Foundation/PEIMs的FV
- 找到以C寫的SEC phase entry point
- 跳到以C code寫的SEC point (SecStartup),最後Transfer the control to the PEI core
VOID
EFIAPI
SecStartup (
IN UINT32 SizeOfRam,
IN UINT32 TempRamBase,
IN VOID *BootFirmwareVolume
){
...
}
從上電的reset vector, trace Code如下:
進入點為 UefiCpuPkg\ResetVector\Vtf0\Ia16\ResetVectorVtf0.asm
;; Reset Vector
; ; This is where the processor will begin execution ; nop nop jmp short EarlyBspInitReal16 |
2015年5月8日 星期五
Git client 安裝和指令教學
1. 安裝Git軟體
這兩個檔案一個是public key (.pub), 一個是private key,到Git server下載code時會用這兩個檔案來檢查使用者的身分。
點Git Bash後會看到一個類似命令字元的視窗,key入ssh-keygen, 會生成兩個檔 (這兩個是一對的),將其放入c:\users\$username\.ssh\
這兩個檔案一個是public key (.pub), 一個是private key,到Git server下載code時會用這兩個檔案來檢查使用者的身分。
2015年5月1日 星期五
UEFI : Overview
// SEC Phase
- Made by Assembly code (before CAR,Cache As Ram), C code (After CAR)
- 進入protect mode
- CPU Microcode patch
- Made by C code
- 在ROM上執行沒有壓縮的Code
- Initialize chipset & Memory
- S3 resume
- Bios recovery (ex: Bios更新失敗的救援)
- Disable Cache As Ram And Enable L1 L2 Cache
- 使用一小部分的memory,這個memory之後可能會被reallocate
- 啟動DXE Initial Program Loader; DxeIPL
- 名詞解釋:
- PEIM: PEI Module
- PEI Service: PEI Core提供PEIM使用的的一些函式
- PEI Core: 提供PEIM一些service和負責執行PEIM
- PPI: PEI和PEI的介面, 讓其他PEIM透過locate PPI使用已安裝好的服務(簡單的說就是提供函式讓其他PEIM使用)
- 在RAM上執行Code,已可正常使用memory resource
- 名詞解釋:
- Protocol: 如同PEI的PPI只是換地方換個名稱
- Driver: 在DXE叫做driver, 如同PEI module code
2015年4月10日 星期五
UEFI : Build EDK2 module (UDK2014 / UDK2015) and a Demo code
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
首先, 到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
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
訂閱:
文章 (Atom)