bloggerads

2015年12月31日 星期四

C# : algorithm "List" sample code

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();
        }
    }
}


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, 整個系統) :
  • G0 = Working state (C0~C3)
  • G1 = Sleeping state (S2~S4)
  • G2 = Soft off (S5)正常關機,電源還插著因此主機板還有standby power,可被外部如LAN喚醒開機
  • G3 = 拔電源(Mechanical off)
2. Dx (Device state, 周邊設備) :
  • D0 = 正常運作
  • 耗電 D1 > D2
  • D3 = 斷電

2015年12月24日 星期四

x86 spec / Bios 常見術語

[ CPUID ] 
CPUID 是 80486 CPU 新增的一個指令,它的用途在於鑑別 CPU 種類或提供 CPU 特性,讀取方式如下:

void cpuid (DWORD  idx) // idxindex, 不同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

2015年12月22日 星期二

pscp (putty) : Transfer data between Windows / Linux

Step 1: Install putty, I use pscp command in putty in Windows side (client)


Step 2: Install openssh-server openssh-client in Linux side (server)

sudo apt-get install openssh-server openssh-client

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


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

2015年12月5日 星期六

UEFI : programming notes


UEFI是Intel為了取代傳統的Bios而定義的一個架構並將其open source,而Bios vendor基於Intel release的UEFI原始碼下去增加功能以及維護。晶片廠/系統廠的target則是使用Bios vendor提供微調過的版本來撰寫自己特定功能的DXE driver以及PEI階段晶片的Internal setting, 還有安裝一些特定的SMI handle來處理板子相關的硬體問題。

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)

MSI (Message Signaled Interrupts) :

MSI的優點是透過軟體的方式來產生中斷而非透過HW Interrupt pin,在線路上比較簡單。透過給定MSI Control Register可以依device的能力(bit3:1)決定要使用1,2,4,...,32個中斷(設定6:4),並在所指定的Message Address寫入含有中斷向量資訊的Message就可以完成。



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) 
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有提到但是沒試過)

# Interrupt Pin (0x3D)
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。

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 MSRsError-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.

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

2015年8月20日 星期四

SATA : PMP (Port Multiplier)

這份spec常常被人遺忘,但她又確確實實定義在AHCI和SATA裡,先不論市場的接受度如何,相信做碟機相關技術的朋友都很好奇這個是什麼。

首先先看看spec所給的架構圖:


2015年8月12日 星期三

DRAM overview

每周部門meeting都會討論各function owner的issue,然後幾乎都是一堆DRAM的issue。
我自己也不是很懂,不過我把比較常聽到同事講的東西加上自己的理解寫一篇來分享

1. DRAM Data的寬度是 8 bytes (64bits)/ 含有ECC的則是72bits

2. Channel/Rank/記憶體顆粒的解釋:
  1. 1個channel可以有很多Dimm, 但每個channel有支援Rank的數量限制 (如H61/H81單一Channel只能接受2個Rank)
  2. 1條Dimm可以有很多Rank. (一條記憶體目前最多是有4個Rank)
  3. 1個Rank資料寬度是64bit, 由許多記憶體顆粒組成這個資料寬度, 1個記憶體顆粒資料寬度可能是8bit, 16bit,.同一個Rank上的記憶體顆粒他們的CS都是接在一起。
  4. 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
4. Bios會透過SMBUS讀取每根Dimm上的SPD來知道他的大小、資料寬度、速度以及電壓

5. Bank Interleaving技術: 原理是將奇數位址和偶數位址分在不同bank,減少讀寫當前字元而影響下一個字元的時間

6. CPU 至 DRAM 顆粒層級由大至小為 channel>DIMM>rank>chip>bank>row/column

2015年8月1日 星期六

UEFI : ROM 格式

相關設定請參考 .fdf (Flash Description Files)檔案

UEFI對於ROM的格式,可以分為下面幾項:(由大集合到小集合)

 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日 星期日

C# 呼叫 VC++ 的dll 檔

fallowing example been tested ok in VC 2010

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 instancehandle. 上層若要控制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 ServiceLoadImage(), 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 ServiceStartImage()來啟動driverdriver會在Image Handle上安裝其它的Protocol,如果是EFI Driver Modeldriver,那麼會安裝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 ServiceConnectController()調用(invoked)去連接到某個Controller。這時在System Memory中已經Load了很多的Driver都在等待被connect到Controller,這時ConnectController()會以Polling的方式去調用每個Driver Handle中的EFI_DRIVER_BINDING_PROTOCOL.Supported(),如果回EFI_SUCCESS,那麼該driver就會被connectcontroller上。之後會透過EFI_DRIVER_BINDING_PROTOCOL.Start()來初始化以及安裝特定的Protocol到此Controller。

2015年6月19日 星期五

UEFI : PEI Phase Code Trace

$ PEI (Pre Efi Initialization)的概述:

● 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尚未初始化,所以剛開始是組合語言寫的,最主要就是做以下這幾件事:
  1. 切32位元(或64位元)flat mode
  2. Cache As Ram (在Flat32.asm中jump到CacheAsRam函數的位址)
  3. 找BFV(Boot Firmware Volume), BFV指的是存放PEI Foundation/PEIMs的FV
  4. 找到以C寫的SEC phase entry point
  5. 跳到以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軟體

使用Windows系統需先安裝Git這個軟體才能Access Git server,安裝好後在任意資料夾內點右鍵會看到這個Git的相關功能








2. 設定Git server

點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
// PEI Phase
  • 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
  1. 名詞解釋:
  • PEIM: PEI Module
  • PEI Service: PEI Core提供PEIM使用的的一些函式
  • PEI Core: 提供PEIM一些service和負責執行PEIM
  • PPI: PEI和PEI的介面, 讓其他PEIM透過locate PPI使用已安裝好的服務(簡單的說就是提供函式讓其他PEIM使用)
// DXE phase
  • 在RAM上執行Code,已可正常使用memory resource
  1. 名詞解釋:
  • 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

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需要反覆的熟讀,我自己也是只了解一部分。

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

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