bloggerads

2014年3月23日 星期日

Bios Boot Spec

以下的內容僅適用在Legacy Bios, 早期的Bios (Legacy Bios)都是在軟體中斷下作文章。在UEFI的架構下很多都已不適用了。但因為CSM模組一直都還在,也就是還有人在使用所以是值得學習和了解的。

IPL:
  •  IPL 指的是可以啟動載入並執行作業系統的裝置。他包含了像是 Floppy, Hard drives, CD-ROM, PCMCIA conrtollers/cards, PnP Cards, Legacy cards 甚至像是 Network, Serial port, Parallel port 等等可開機的實體或虛擬裝置。
  •  所有的 IPL 可以被歸類成下列三種
  •  1. BAID
  •  2. PnP Card (可再細分為 BCV 和 BEV 兩種裝置)
  •  3. Legacy IPL Device
int 19h: 選擇用哪種裝置開機 (如光碟機, 硬碟, 網卡等等)
  •  是 80x86 的 BIOS 中斷之一(又稱冷開機中斷),  
  •  This vector is taken after the POST in order to attempt to load and
  •  execute any bootstrap code on diskette or hard disk.
  • 在呼叫之後,它會根據 IPL Priority 中的裝置,呼叫其 Boot handler
BAIDs:
  •  A BIOS Aware IPL Device is any device that can boot an O/S, but requires the BIOS to have specific code to support it.
  •  (No Option ROM, 通常啟動的程式碼內建於 INT 19h (BIOS Bootstrap loader) 的服務之中)
BEV:
  •  A Bootstrap Entry Vector is a pointer that points to code inside an option ROM that will directly load an O/S. The BEV resides in a PnP option ROM Expansion Header. (for LAN )
BCV:
  •  A Boot Connection Vector is a pointer that points to code inside the option ROM that will perform device initialization, detect if a peripheral (such as a SCSI hard drive) is attached, and optionally hook INT 13h. 
IPL table (boot type): (int 19h)
  •  Floppy
  •  HDD → BCV table inside
  •  CD-ROM
  •  BEV #1
  •  BEV #2
BCV table (enumerate storage): (int 13h)
  •  SATA/PATA 
  •  Cards/EMMC
  •  USB
  •  BCV #1
  •  BCV #2

2014年3月22日 星期六

UEFI : Shell Command

首先要準備一個USB隨身碟,將Shell.efi, Bootx64.efi, ShellX64.efi 放到EFI\BOOT這個資料夾

先進到 Bios 選單關掉 secure boot. (若Bios本身就不支援secure boot則這步可省略)

開機Bios自己會到EFI\BOOT\目錄下執行shell, 接著會看到像是下面這個Device mapping table:

fs0: // file system 0
blk0:
blk1:

# 進入隨身碟
Shell>fs0:

# 檢查目錄裡的檔案(-b代表一頁一頁顯示)
fs0:\>ls -b

fs0:\>cd -b

# 查詢指令
fs0:\? -b


*** 好用的 EFI tool ***

UDK2014內含有許多APP可以直接在EFI shell下使用,如
EdkShellBinPkg\ 的 HexEdit.efi, Edit.efi,...等等

2014年3月19日 星期三

ASCII table

因為常在DOS下寫測是程式,總是會加上一些ASCII做的文字方塊,每次都是寫code再一邊查ASCII。
乾脆把表放上來,方便參考

這張圖片取自網站(This photo is originally from the website as follow):
https://commons.wikimedia.org/wiki/File:Ascii-codes-table.png
http://www.theasciicode.com.ar/ascii-printable-characters/lowercase-letter-h-minuscule-ascii-code-104.html

2014年3月6日 星期四

Assembly : 設定 register的 bit為0 or 1

1. 將 eax 的 bit 3 清為 0  

+         test   eax,  1  shl  3
+         jz      @f
+         xor    eax,  1  shl  3
+  @@:                             ;; eax bit 3 is 0 now

2. 將 eax 的 bit 3 設為 1       

+    or     eax,  1  shl  3


2014年3月5日 星期三

SATA Spec

1. 介紹SATA的四個Layer:


•Application Layer:  
  • Overall  ATA  command  execution

•Transport Layer:  
  • Placing control information and data to be transferred between the host and device in a packet/frame (FIS)

•Link Layer:  
  • Taking data from the constructed  frames, encoding  or  decoding each byte using 8b/10b, and inserting control characters such that the 10-bit stream of data may be decoded correctly

•Physical Layer: 
  • Transmitting and receiving the encoded information as a serial data stream on the wire
2. Primitive
    用來控制和提供串列線路的狀態,由4個Byte所組成

3. BURST:  
  • OOB signaling is a pattern of ALIGNP primitives or Dwords composed of D24.3 characters and idle time and is used to initialize the Serial ATA interface (由特定的Primitive或4個D24.3所組成)
4. OOB信號:
  • COMRESET (Originate from Host)/ COMINIT (Originate from Device)
  • COMWAKE (for both host & device)
  • Consists of 6 bursts with different time gap

5. Speed negotiation:



6. SATA FIS:





UEFI C coding stytle

最近接觸UEFI的code, 她是C語言架構所組成並使用VC++或DDK來compiler,coding上跟C幾乎是一樣。但是Intel工程把C的指標發揮到淋漓盡致, coding style很漂亮,所以我寫這篇文章: UEFI C Coding style,用來練習這種coding方式

UEFI Bios 定義許的protocol夾雜許多callback function的prototype。目的是固定函數的輸入輸出型態使其成為spec的一部分,然後將protocol 傳給所需要的driver使用

我也來學學UEFI的方式寫個C程式來試試

#include <cstdio>

int add( int x, int y ) {
   return x+y;
}
int add2( int x ) {
   return x+2;
}

typedef int (*ADD_CALLBACK)(int, int);
typedef int (*ADD2_CALLBACK)(int);

//
// Protocol type of Service
//
typedef struct
{
    unsigned char rev;
    ADD_CALLBACK AddCallBack;
    ADD2_CALLBACK Add2CallBack;    
}SERVICES;

int 
main ()
{
    SERVICES gPS = {0, add, add2};
    //(&gPS)->AddCallBack=add;
    //(&gPS)->Add2CallBack=add2;
    printf("%d\n", (&gPS)->AddCallBack(1,2));
    printf("%d\n", (&gPS)->Add2CallBack(3));

   return 0;
}