搜尋此網誌

2013年12月16日 星期一

在AHCI上,什麼是BIST與Index-Data Pair?

[AHCI 1.3 -> 10.13] BIST 
BIST是進入,當軟體建立一個BIST FIS在命令列中與設定CTBAz[B]。一但BIST命令被放到列表裡,SW將不允許去建立任何命令直到它清除PxCMD.ST。HBA如何運作的細節在測試模式中,此是章節將不在此說明範圍內。一個晶片商的連續特殊的試驗,可能被執行經由晶片商的特殊定義的戰存器(如同那些在HBA的PCI配置空間)。此BIST的細節不被定義在AHCI中,去允許晶片商自由的建構不是很詳盡的或不是很明顯測試架構。
此測試模式被退出時,是系統軟體清除PxCMD.ST與寫入一個0x01的值到PxSCTL.DET。清除PxCMD.ST放置DMA控制器進入到空閒,與寫PxSCTL.DET去重置此介面。

[AHCI 1.3 -> 10.14] Index-Data Pair
Index-Data  Pair  (IDP)提供主機軟體一個途徑,藉由執行memory mapped I/O space (> 1MB)去讀寫AHCI的暫存器。在PC平台上,主機軟體 (BIOS, Option ROMs, OSs)寫入運作在真實模式(‘real-mode’ (8086 mode))不能存取在配置在PCI上的記憶體位址,如果此位址空間是(1)記憶體映射與(2)映射大於1MB。 AHCI被致能後必須面對的問題:

  • AHCI並不支援BIOS IDE存取方式。 
  • AHCI實現支援BIOS存取途徑,也支援4個裝置以上(一般或經由擴充器(Port Multiplier))

IDP的途徑允許主機軟體去存取所有AHCI的MMIO暫存器間接I/O位址,在間接記憶體映射位址的地方存取經由AHCI基本位址暫存器(ABAR)。


當去設計一個驅動程式時,IDP與AHCI’s MMIO registers誰先搶到GHC.AE,並將它設為"1" ,另一端將放棄其控制權,要不然將會有衝突。




[Qemu-devel] [PATCH] ahci: add port I/O index-data pair
http://lists.gnu.org/archive/html/qemu-devel/2011-08/msg03327.html

2013年12月13日 星期五

如何在Linux上,如何呼叫一個Shell Scripts後,把它的環境參數留下

程式1 test_s
#!/bin/bash
echo "test_s"
value0=2
value1=9220
value2=10
value3=0x80000


程式2 run_t

#!/bin/bash
parmfile=test_s
file_context=$(cut -f1 "$parmfile")
for set_parm in $file_context
do
    if [ $set_parm != "#!/bin/bash" ]; then
        echo "[$set_parm]"
        export "$set_parm"
    fi
done
echo "value0=$value0"
echo "value1=$value1"
echo "value2=$value2"



echo "value3=$value3"

執行此程式
desktop:~$ /bin/baush run_t

[echo "test_s"]
[value0=2]
[value1=9220]
[value2=10]
[value3=0x80000]
value0=2
value1=9220
value2=10
value3=0x80000

在Ubuntu 13版上,如何開啟command line(terminal)視窗

新版的Ubuntu怎麼找不到Terminal程式呢?
執行下面步驟就可以找出並開啟Terminal程式:
1. 登入Ubuntu。

2. 選擇"Search your computer and online sources"。
3. 在搜尋列中,輸入"terminal";也可使用滑鼠去點選圖示中的Terminal。
4. 選擇後,開始可以輸入Shell指令。









2013年12月12日 星期四

如何在Linux寫一個簡單的Shell Scripts

1. 開啟編輯器(such as: vi, vim...)去建立一個檔案叫test其內容如下:
#!/bin/bash
filename="123.txt"
echo "filename="$filename

/bin/bash test1 $filename

echo "Okay..."

2. 開啟編輯器去建立另一個檔案叫test1其內容如下:
#!/bin/bash
echo "filename=[$1]"
value0=2
value1=9220
value2=10
value3=0x80000
echo "value3="$
value3

3. 執行此程式
desktop:~$ /bin/baush test    //此程式將會呼叫另一個test1,並將filename傳到test1成為參數1。
filename=123.txt
filename=[123.txt]
value3=0x80000


在Linux 32bits與64bits中的int與long為何bytes的length不同?

在Linux 64bits中的long為8 bytes,但在32bits中的long則為4 bytes。
x86的int則為2bytes,但Arm的架構則為4bytes。
如何解決這些資料結構問題呢?
請使用下面的函式庫stdint.h。
#include
它的內容如下:
typedef signed char int8_t
typedef unsigned char uint8_t
typedef signed int int16_t
typedef unsigned int uint16_t
typedef signed long int int32_t
typedef unsigned long int uint32_t
typedef signed long long int int64_t
typedef unsigned long long int uint64_t
.........

把它轉成自己的macros.
#define i8 int8_t
#define u8 uint8_t
#define i16 int16_t
#define u16 uint16_t
#define i32 int32_t
#define u32 uint32_t
#define i64 int64_t
#define u64 uint64_t

使用 uintX_t or intX_t 這些結構宣告的變數可以確保它的資料長度是固定的,在32bits、64bits或不CPU架構的編譯器的切換。

使用自己的macros下次轉換其他結構會比較方便。

在Linux kernel中,什麼macro可以用來辨識32位元或64位元

 /*此__i386__為 32bit macro的判斷,另一個__x86_64__ or __amd64__則為64bit的判斷。*/
#if defined(__i386__)

    使用32位元程式碼...

#else

    使用64位元程式碼...

#endif

2013年12月5日 星期四

在Linux上,如何搜尋SCSI或ATA裝置(or USB)?

$ lsscsi  顯示所有連接裝置
[0:0:8:0]    disk    FUJITSU  MAM3184MP        0105  /dev/sda

$ lsscsi -s 顯示裝置,並顯示容量。
[0:0:0:0]    cd/dvd  PIONEER  DVD-RW  DVR-212D 1.22  /dev/sr0        - 
[1:0:0:0]    disk    ATA      ST3320620AS      3.AA  /dev/sda    320GB 

$ lsscsi -c 顯示類似 'cat /proc/scsi/scsi'
Attached devices:

Host: scsi0 Channel: 00 Id: 08 Lun: 00
  Vendor: FUJITSU  Model: MAM3184MP        Rev: 0105
  Type:   Direct-Access                    ANSI SCSI revision: 03


$ lsscsi -d 顯示裝置節點的主要與次要的數值
[0:0:1:0]    disk    FUJITSU  MAM3184MP        0105  /dev/sda[8:0]


$ lsscsi -H 顯示邏輯單位(LUN:logical units)
[0]    scsi_debug
[1]    aha152x


$ lsscsi -t 顯示傳輸資訊
[0:0:0:0]    disk    sata:                           /dev/sda
[3:0:0:0]    cd/dvd  ata:                            /dev/scd0
[5:0:0:0]    disk    usb: 7-1:1.0                    /dev/sdb


$ lsscsi -Ht 顯示邏輯單位的傳輸資訊
[0]    ahci          sata:
[1]    ahci          sata:
[3]    ata_piix      ata:


Refer to: http://sg.danny.cz/scsi/lsscsi.html

2013年11月21日 星期四

在Linux中,如何使用程式直接讀取記憶體中的資料。

這兩個鏈結中,提供Sample Code,關於如何存取記憶體,在Linux中。


將Physical Address轉成Virtual Address。
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
歸還Virtual Address。
int munmap(void *addr, size_t length);

devmem.c [Link1]

devmem2 [Link2]


[“Bus error” system error] 匯流排錯誤--系統錯誤

Bus Error通常是由應用程式試圖去存取記憶體空間,硬體不能實際定址。這原因可能是一個沒有對齊的存取,像是存取不存在的地址,或者是沒有足夠的權限來存取或更改記憶體。這很難說這到底是什麼問題你所遇到,不知道你改了什麼程式碼;甚至超過 - 使用不同的編譯器或編譯器的設置也可能會導致此行為。
from: http://stackoverflow.com/questions/5870353/bus-error-system-error

Unhandled fault: External abort on non-linefetch (0x18) at 0xb6f4d000
Bus error

可能的錯誤原因:

此錯誤的產生,當程式試圖去讀取RX FIFO Port時,但它的FIFO沒有任何資料。當/dev/mem讀取有正確回應時,表示那邊有東西被讀取到。
http://forums.xilinx.com/t5/Embedded-Linux/ZC702-Devmem-failure-accessing-AXI-port/td-p/284746

2013年11月20日 星期三

在Mac Pro上,如何安裝rEFIt Shell環境?

===================================================================
How to Install rEFIt Shell Environment in Mac?
===================================================================
rEFIt是一個開機選單,還有它也式EFI-based機器的維護工具,像是Intel Mac Pro 。它提供了一個簡單的方法來進入和探索的EFI預先開機環境。

1. 在Mac OSX中,連上此連結http://refit.sourceforge.net/ ,使用你所熟悉的瀏覽器。

2. 下載rEFIt 0.13(版本可能會有所不同) (Mac的磁碟影像). (如果你遭遇任何問題,請參閱線上文件檔案。) 在下載成功後,系統將自動安裝的磁碟影像。

3. 在Finder中,雙擊“rEFIt.mpkg”來安裝rEFIt。

4. 關閉系統電源(建議),等過幾秒後再開啟系統電源,此時按住[option] 按鍵直到rEFIt圖示出現。

5. 點擊rEFIt圖示與使用鍵盤去選擇[Start EFI Shell]。現在你已經在rEFIt環境中。

6. 輸入"drivers"指令來測試,此指令會列出所有EFI當前的驅動程式。試試看吧!!

2013年11月19日 星期二

在Linux上,如何搜尋PCI裝置?

lspci -mk

or

lspci -x

-m: Dump PCI device data in a backward-compatible machine readable form. See below for details
-k: Show kernel drivers handling each device and also kernel modules capable of handling it. Turned on by default when -v is given in the normal mode of output. (Currently works only on Linux with kernel 2.6 or newer.)
-x: Show hexadecimal dump of the standard part of the configuration space (the first 64 bytes or 128 bytes for CardBus bridges).

From: http://linux.die.net/man/8/lspci

在Ubuntu Linux裡,如何使用Cross Compiler?

1. 首先取得[linux-3.0.y.tgz] kernel source與[linux-nptl.tgz] tool chain。
2. 建立一個目錄,並解開這兩個檔案。
$ cd arm_tool/
arm_tool$ tar zxf linux-3.0.y.tgz
arm_tool$ tar zxf linux-nptl.tgz

切換路徑。
arm_tool$ cd linux-nptl/
rm_tool/linux-nptl$ cd arm-t34-linux/
arm_tool/linux-nptl/arm-t34-linux$ cd bin

查看檔案名稱。
arm_tool/linux-nptl/arm-t34-linux/bin$ ls
arm-t34-linux-uclibcgnueabi-addr2line
arm-t34-linux-uclibcgnueabi-ar
arm-t34-linux-uclibcgnueabi-as
arm-t34-linux-uclibcgnueabi-c++
arm-t34-linux-uclibcgnueabi-c++filt
arm-t34-linux-uclibcgnueabi-cpp
arm-t34-linux-uclibcgnueabi-g++
arm-t34-linux-uclibcgnueabi-gcc
arm-t34-linux-uclibcgnueabi-gcc-4.4.1
arm-t34-linux-uclibcgnueabi-gccbug
arm-t34-linux-uclibcgnueabi-gcov
arm-t34-linux-uclibcgnueabi-gprof
arm-t34-linux-uclibcgnueabi-ld
arm-t34-linux-uclibcgnueabi-nm
arm-t34-linux-uclibcgnueabi-objcopy
arm-t34-linux-uclibcgnueabi-objdump
arm-t34-linux-uclibcgnueabi-ranlib
arm-t34-linux-uclibcgnueabi-readelf
arm-t34-linux-uclibcgnueabi-size
arm-t34-linux-uclibcgnueabi-strings
arm-t34-linux-uclibcgnueabi-strip

加入目前位置到路徑中,並顯示。
arm_tool/linux-nptl/arm-t34-linux/bin$ export PATH=$PATH:`pwd`;echo $PATH
確定你打的是[`]個符號(跟~符號同一個按鍵),不是[']單引號。

arm_tool/linux-nptl/arm-t34-linux/bin$ cd ../../..

查看Makefile裡的Cross Compiler檔案路徑參數
arm_tool$ vi Makefile
...
CC        =  $(CROSS)gcc
CXX       =  $(CROSS)g++
LD        =  $(CROSS)ld
AR        =  $(CROSS)ar
...

設定Cross Compiler的檔案與路徑。
arm_tool$ export CROSS=arm-t34-linux-uclibcgnueabi-

測試編譯你的程式。
arm_tool/test$ make clean
arm_tool/test$ make all
or
arm_tool/test$ make

2013年11月11日 星期一

在Ubuntu Linux上,連接Windows的Share Folder

選擇"Connect to Server"選項。

在服務項目中選擇"Windows share"。


Server中填入[路徑資料、IP位址或網址]。
Folder中填入路徑中的[目錄名稱]。
Username中填入[使用者名稱]。
Add bookmark加入一個書籤,Bookmark name中填入書籤名稱。


輸入您的密碼。


現在您已經連上那服務平台的目錄。


P.S. In Search Bar of a Browser enter an instruction smb://
smb://10.20.158.66 


How to release utilities in Linux?

1. Remove -static at CFLAGS in Makefile.
2. run \>strip test
    delete symbol file and debugging messages.

How to remove this error("cannot find -lc") in suse linux?

gcc -static -Wall -Wstrict-prototypes -I. -g -DPRINT_OP -g -D__LINUX__   -o test main.o funs.o mmio.o pci.o
/usr/lib/gcc/i586-suse-linux/4.7/../../../../i586-suse-linux/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status
make: *** [mvf] Error 1


open Makefile by edit, and then remove

from:
#CFLAGS       := -static -Wall -Wstrict-prototypes $(INCLUDEDIR)

to:
#CFLAGS       := -Wall -Wstrict-prototypes $(INCLUDEDIR)

-static
On systems that support dynamic linking, this prevents linking with the shared libraries. On other systems, this option has no effect. 

2013年11月6日 星期三

Watcom C makefile example

###########################################################################
#makefile_test
###########################################################################
PROJECTNAME = test_project
OUTPUTNAME = run

#which memory model and processor to use by default
#PROCESSOR =     # for the 16-bit compilers
#PROCESSOR = 386 # for the 32-bit compilers
DEBUG = true
REPORT = true

# name the compiler
CC = wcc$(PROCESSOR)
FC = wfc$(PROCESSOR)
ASM = wasm

!ifeq PROCESSOR 386
MODEL = f       # flat
OS = dos4g
!else
MODEL = h       # large
OS = dos
!endif

CFLAGS = -m$(MODEL) -zq -3
CFLAGS+= -d_DOS_
#CFLAGS+= -wcd=135
#CFLAGS+= -wcd=135 -fpc
CFLAGS+= -fp3 #hardware float
#CFLAGS+= -zdp

LISTOPT = echo $^&
FFLAGS = -m$(MODEL) -noterm -quiet
AFLAGS =
LNKOPT = option quiet option stack=8192

# options to use
!ifeq DEBUG true
CFLAGS+= -od -d2 -db+
#CFLAGS+= -v
CFLAGS+= -wx
LNKOPT+= debug all
LNKOPT+= option map
#else
CFLAGS+= -s
!endif

!ifeq REPORT true
LISTOPT = wdis $^& -s -l=$^&.lst# -a
#LISTOPT+= -s=$^&.c
!endif

!ifeq OS dos
CFLAGS+= -bt=dos
!endif

.EXTENSIONS:
.EXTENSIONS: .exe .rex .lib .obj .wbj .asm .c .for

.BEFORE
        @set INCLUDE=.;$(%watcom)\h;$(%watcom)\h\win
        @set LIB=.;$(%watcom)\lib286;$(%watcom)\lib286\dos
        @set FINCLUDE=$(%watcom)\src\fortran;$(%watcom)\src\fortran\dos
        @set DOS4G=QUIET

S =
OBJS = main.obj
OBJS+= asmlib.obj
OBJS+= tool.obj
OBJS+= funs.obj
OBJS+= mmio.obj
OBJS+= test.obj

# explicit rules

all :   clean $(OUTPUTNAME).exe .SYMBOLIC
        #copy $(OUTPUTNAME).exe  t1.exe
        @%null

$(OUTPUTNAME).exe : .PRECIOUS $(OBJS)
                @echo file > (PROJECTNAME).lnk
                @for %i in ($(OBJS)) do @echo %i, >> (PROJECTNAME).lnk
        wlink $(LNKOPT) system $(OS) name $(OUTPUTNAME) @(PROJECTNAME).lnk
        @del (PROJECTNAME).lnk


run_all:    .SYMBOLIC
        %make run_mix

clean : .SYMBOLIC
        del *.obj /s
        del *.wbj /s
        del *.rex /s
        del *.exp /s
        del *.lst /s
       

# implicit rules

.c.obj :
        $(CC) $^& $(CFLAGS)
        $(LISTOPT)

.c.wbj :
        $(CC) $^& $(CFLAGS) -zw -fo=$^&.wbj

.for.obj :
        $(FC) $^& $(FFLAGS)

.asm.obj :
        $(ASM) $(AFLAGS) $^&
###########################################################################

Building command>> wmake -f makefile_test /a DEBUG=%DEBUG% PROCESSOR=%PROCESSOR%

2013年11月5日 星期二

在Ubuntu上,如何切換成root使用者?

How do I login as root user?

Open terminal and simply type the following command:

$ sudo bash

OR

$ sudo -s

Supply your password and you will become a root user.




from: http://www.cyberciti.biz/faq/ubuntu-linux-root-password-default-password/

2013年9月15日 星期日

How to use FlagTypeSingle/FlagTypeNeedVar/FlagTypeNeedSet/FlagTypeSkipUnknown for design a UEFI Shell program?

SHELL_VAR_CHECK_ITEM TestCheckList[] = {
  {
    L"+a",
    0x01,
    0x02,
    FlagTypeSingle /*example: +a(nothing is behind this parameter.)*/
  },
  {
    L"-a",
    0x02,
    0x01,
    FlagTypeSingle /*example: -a(nothing is behind this parameter.)*/
  },
  {
    L"-b",
    0x03,
    0,
    FlagTypeNeedVar /*example: -b 20(that has space between the two parameters.)*/
  },
  {
    L"-c",
    0x04,
    0,
    FlagTypeNeedSet /*example: -c20(that doesn't has any space between the two parameters.)*/
  },
  {
    L"-z",
    0x05,
    0,
    FlagTypeSkipUnknown /*This flag would cause system hang currently. -z */
  },
  {
    L"-?",
    0x02,
    0,
    FlagTypeSingle
  },
  {
    NULL,
    0,
    0,
    0 /*List End*/
  }
};

2013年9月11日 星期三

How to get HD capacity form int13h?

INT 13 48-- - IBM/MS INT 13 Extensions - GET DRIVE PARAMETERS
Inp.:
    AH = 48h
    DL = drive (80h-FFh)
    DS:SI -> buffer for drive parameters (see Table #00273)
Return: CF clear if successful
        AH = 00h
        DS:SI buffer filled
    CF set on error
        AH = error code (see #00234)
BUGS:  several different Compaq BIOSes incorrectly report high-numbered drives (such as 90h, B0h, D0h, and F0h) as present, giving them the same geometry as drive 80h; as a workaround, scan through disk numbers, stopping as soon as the number of valid drives encountered equals the value in 0040h:0075h 
Dell machines using PhoenixBIOS 4.0 Release 6.0 fail to correctly handle this function if the flag word at DS:[SI+2] is not 0000h on entry
  
[Table 00273]
Format of IBM/MS INT 13 Extensions drive parameters:

Offset        Size  Description     
00h   WORD     (call) size of buffer
          (001Ah for v1.x, 001Eh for v2.x, 42h for v3.0)
          (ret) size of returned data
02h   WORD     information flags (see #00274)
04h   DWORD   number of physical cylinders on drive
08h   DWORD   number of physical heads on drive
0Ch   DWORD   number of physical sectors per track
10h   QWORD  total number of sectors on drive ==> Max LBA
18h   WORD     bytes per sector
---v2.0+ ---
1Ah   DWORD   -> EDD configuration parameters (see #00278)

FFFFh:FFFFh if not available
---v3.0 ---
1Eh   WORD     signature BEDDh to indicate presence of Device Path info
20h   BYTE        length of Device Path information, including signature and this
            byte (24h for v3.0)
21h  3 BYTEs    reserved (0)
24h  4 BYTEs    ASCIZ name of host bus ("ISA" or "PCI")
28h  8 BYTEs    ASCIZ name of interface type
          "ATA"
          "ATAPI"
          "SCSI"
          "USB"
          "1394" IEEE 1394 (FireWire)
          "FIBRE" Fibre Channel
30h  8 BYTEs    Interface Path (see #00275)

38h  8 BYTEs    Device Path (see #00276)
40h   BYTE        reserved (0)
41h   BYTE        checksum of bytes 1Eh-40h (two's complement of sum, which makes
            the 8-bit sum of bytes 1Eh-41h equal 00h)
Note: if the size is less than 30 on call, the final DWORD will not be returned by a v2.x implementation; similarly for the Device Path info


[Table 00274]
Bitfields for IBM/MS INT 13 Extensions information flags:

Bit(s)  Description     
0       DMA boundary errors handled transparently
1       cylinder/head/sectors-per-track information is valid
2       removable drive
3       write with verify supported
4       drive has change-line support (required if drive >= 80h is removable)
5       drive can be locked (required if drive >= 80h is removable)
6       CHS information set to maximum supported values, not current media
15-7  reserved (0)


The HD size(bytes) =  (total number of sectors on drive(Offset = 10h, Size = QWORD)) x (bytes per sector(Offset = 18h, Size = WORD))

2013年8月27日 星期二

如何取得最新的EDK II程式碼?


UEFI開發工具2010詳細說明釋放#1 (UDK2010.SR1.UP1.P1) (所有軟體包的完整的zip檔與說明文件,它們被包裝解開到MyWorkSpace目錄)
目前最新的程式碼在下面鏈結中,請使用SVN軟體去下載:

下載 TortoiseSVN
輸入網址到SVN工具,你就可以瀏覽整個目錄。

如何編譯此程式碼,請參考: 安裝與編譯UEFI EDK2

支援的作業系統與編譯環境

安全啟動概述(Secure Boot Overview) --- UEFI

From: http://technet.microsoft.com/en-us/library/hh824987.aspx

適用作業系統: Windows 8, Windows 8.1, Windows Server 2012, Windows Server 2012 R2

安全開機(Secure Boot)是一個在個人電腦上,以UEFI為基礎的功能;它幫助增加個人電腦的安全,以防止未被授權軟體在開機啟動程序期間被執行在個人電腦上。它檢查每個軟體程式區段是否擁有一個有效的簽章,包括作業系統被載入時也須被檢查。

當安全開機(Secure Boot)在個人電腦上被啟動,它會檢查每個軟體程式區段,在韌體中包含Option ROMs、UEFI驅動程式、UEFI應用程式、還有作業系統,違反已知良好簽章的資料庫維持著。如果每個軟體程式區段都是有效,此韌體執行這軟體與這作業系統。

常被問的問題:
• 我是否需要安全開機的功能,才能夠升級到最新版本的Windows系統?
◦ 對於x86與x64方面的PC:安全開機(Secure Boot)不是必備的。它是一個可選擇的功能,它能夠經由OEM製造商去加入它,為了增強PC的安全性,還有你將可以發現它在所有的Windows 8.1 搶先版或者是Windows®8的徽標認證的個人電腦。
◦  對於ARM方面的PC:對於Windows RT 8.1搶先版與Windows RT 8.1零售電腦,這安全開機(Secure Boot)是必備的,不能夠被關閉。
•  如果我的新硬體裝置不被系統信任時,會發生什麼事?
你的個人電腦(PC)可能不能夠被開機,這裡有兩種問題會發生:
◦  此韌體不信任此作業系統、Option ROM,驅動程式、或是應用程式,因為它不是被信任經由安全啟動資料庫(Secure Boot database)。
◦  一些硬體要求核心模式驅動程式,它必須擁有簽章。注意:許多舊識的32位元(x86)驅動程式沒有簽章,因為核心模式驅動程式簽章是為了安全啟動最近才被規定的。關於更多資訊,請參閱"Secure boot feature signing requirements for kernel-mode drivers"。
關於更多資訊,請參閱"Windows 8 with Secure Boot enabled may no longer boot after installing new hardware"。
•  如何我才能夠加入硬體或執行軟體或作業系統,當它們不被系統信任時?
◦  你能夠檢查Microsoft或是PC製造商是否有更新軟體。
◦  你能夠聯絡你的製造商並要求新增的硬體或軟體到安全開機資料庫(Secure Boot database)。
◦  對於x86還是x64的PC,你可能必須關閉安全開機(Secure Boot)的功能。請聯絡你的製造商取得相關操作說明。
◦  在某些情況下,你可能需要去改變在系統任體中的相關設定,例如:開啟Compatibility Support Module (CSM)去支援原始BIOS系統。去使用CSM同時,你可能也需要去重新格式化你的硬碟,使用Master Boot Record (MBR)的格式。然後重新安裝Windows。關於更多資訊,請參閱Windows安裝設定:安裝使用MBR或GPT磁區樣式( Installing using the MBR or GPT partition style)。
•  如何我才能夠建立或編輯安全啟動資料庫(Secure Boot databases)?
消費者應該聯絡他們的製造商取得對於他們的個人電腦的操作說明。

製造的需求
安全開機(Secure Boot)要求一部電腦,它符合UEFI規格2.3.1版,Errata C或更高。
全開機(Secure Boot)被支援對於UEFI類別2與類別3的電腦。關於UEFI類別2的電腦,當它的安全開機(Secure Boot)被致能,這compatibility support module (CSM)必須被除能,所以電腦只能夠啟動經授權的UEFI基礎的作業系統。

安全開機(Secure Boot)不要求一個信任的平台模組(Trusted Platform Module (TPM))
啟動核心除錯模式,致能測試簽章(TESTSIGNING),或去除能NX,你必須關閉安全開機(Secure Boot)。關於更多資訊,請參閱"Windows 8 Secure Boot Key Creation and Management Guidance"。

它怎麼運作?
當安全開機(Secure Boot)在個人電腦上被啟動,它會檢查每個軟體程式區段,在韌體中也包含UEFI驅動程式(被稱為Option ROMs)還有作業系統,違反已知良好簽章的資料庫維持。如果每個軟體程式區段都是有效,此韌體執行這軟體與這作業系統。

簽章資料庫與密鑰(Signature Databases and Keys)
之前個人電腦才開始部署,OEM儲存安全啟動(Secure Boot)資料庫到PC上。此包含簽章的資料庫(signature database (db)),撤銷簽章的資料庫(revoked signature database (dbx)),還有密鑰登入密鑰資料庫( Key Enrollment Key database (KEK))到PC上。在製造時期,這些資料庫被儲存到韌體非揮發的記憶體中。

簽章的資料庫(signature database (db))與撤銷簽章的資料庫(revoked signature database (dbx))列出這些簽章者或影像檔UEFI應用程式、作業系統載入器(例如:微軟作業系統載入器、或開機管理程式),或是UEFI驅動程式,它們能夠在個人電腦上被載入,且撤銷影像檔相關條款,它們不再被信任,還有可能不會被載入。

密鑰登入密鑰資料庫( Key Enrollment Key database (KEK))是一個分割簽章密鑰的資料庫,它能夠被應用在更新數位簽章資料庫與撤銷簽章的資料庫。微軟要求一個具體指明的密鑰被加入在KEK資料庫中,以便在未來微軟可以加入新的作業系統到數位簽章資料庫或添加到已知的惡意影像檔到撤銷簽章的資料庫中。

這些資料庫已被增添之後,與最後的韌體查核與測試之後,OEM鎖住韌體的編輯。除了更新,它必須擁有簽章跟正確的密鑰,經由實際存在的使用者,他使用韌體選單,然後產生一個平台密鑰(platform key (PK))。這PK可以被用來簽署更新KEK或關閉安全啟動(Secure Boot)。

在建立這些資料庫,OEMs應該聯絡他們的製造商關於工具與援助。關於更多資訊,請參閱"Windows 8 Secure Boot Key Creation and Management Guidance"。

啟動順序(Boot Sequence)
  1. 在PC的電源被開啟後,簽章資料庫核對平台的密鑰(platform key: PK)。
  2. 如果韌體不備系統信任,UEFI韌體必須開始OEM的特定復原原來已被信任的韌體。
  3. 如果這裡有一個跟Windows開機管理程式(Windows Boot Manager)的問題,此認體將試圖去啟動一個Windows開機管理程式的備份。如果還是失敗,認體必須開始OEM特定的矯正。
  4. 在Windows開機管理程式已經開始運作,如果這裡有一個跟驅動程式或NTOS核心的問題,Windows恢復環境程式(Windows Recovery Environment (Windows RE))會被載入,以至於這些驅動程式或核心影像能夠被復原。
  5. Windows載入非惡意程式軟體。
  6. Windows載入其他核心程式與初始化使用者模式程序。


關於更多資訊,請參閱白皮書: Secured Boot and Measured Boot: Hardening Early Boot Components Against Malware。

也可以閱讀其他的資源:
UEFI Firmware
Secured Boot and Measured Boot: Hardening Early Boot Components Against Malware

2013年8月26日 星期一

RECEIVE DIAGNOSTIC RESULTS (1Ch)

RECEIVE DIAGNOSTIC RESULTS (1Ch) command
Bit
Byte
7
6
5
4
3
2
1
0
0
OPERATION CODE (1Ch)
1
Reserved
PCV
2
PAGE CODE
3
ALLOCATION LENGTH (15:8)
4
ALLOCATION LENGTH (7:0)
5
CONTROL

A page code valid (PCV) bit set to one specifies that the device server return the diagnostic page specified in the PAGE CODE field.

SEND DIAGNOSTIC (1Dh)

SEND DIAGNOSTIC (1Dh)
Bit
Byte
7
6
5
4
3
2
1
0
0
OPERATION CODE (1Dh)
1
SELF-TEST CODE
PF
Reserved
SELF TEST
DEVOFFL
UNIT OFFL
2
Reserved
3
PARAMETER LIST LENGTH (15:8)
4
PARAMETER LIST LENGTH (7:0)
5
CONTROL


2013年8月23日 星期五

PACKET - A0h, Data

PACKET - A0h, Data
Inputs:
Register
7
6
5
4
3
2
1
0
Features
na
na
na
na
na
na
OVL
DMA
Sector Count
Tag
na
LBA Low
na
Byte Count low
(LBA Mid)
Byte Count limit (7:0)
Byte Count high
(LBA High)
Byte Count limit (15:8)
Device
obs
na
obs
DEV
na
na
na
na
Command
A0h
Features register -
  • OVL - This bit is set to one to inform the device that the PACKET command is to be overlapped.
  • DMA - This bit is set to one to inform the device that the data transfer (not the command packet transfer) associated with this command is via Multiword DMA or Ultra DMA mode.

Sector Count register -
  • Tag - If the device supports command queuing, this field contains the command Tag for the command being delivered. A Tag may have any value between 0 and 31 regardless of the queue depth supported. If queuing is not supported, this field is not applicable.

Byte Count low and Byte Count high registers -
  • These registers are written by the host with the maximum byte count that is to be transferred in any single DRQ assertion for PIO transfers. The byte count does not apply to the command packet transfer. If the PACKET command does not transfer data, the byte count is ignored.

Normal Outputs:
Register
7
6
5
4
3
2
1
0
Error
na
Interrupt reason
(Sector Count)
na
REL
I/O
C/D
LBA Low
na
Byte Count low (LBA Mid)
Byte Count (7:0)
Byte Count high
(LBA High)
Byte Count (15:8)
Device
obs
na
obs
DEV
na
na
na
na
Status
BSY
na
DMRD
SERV
DRQ
na
na
CHK
Interrupt reason register -
  • Tag - If the device supports command queuing and overlap is enabled, this field contains the command Tag for the command. A Tag value may be any value between 0 and 31 regardless of the queue depth supported. If the device does not support command queuing or overlap is disabled, this field is not applicable.
  • REL - Shall be cleared to zero.
  • I/O - Shall be cleared to zero indicating transfer to the device.
  • C/D - Shall be set to one indicating the transfer of a command packet. 

Device register -
  • DEV shall indicate the selected device.


Status register -
  • BSY - Shall be cleared to zero.
  • DMRD (DMA ready) - Shall be cleared to zero.
  • SERV (Service) - Shall be set to one if another command is ready to be serviced. If overlap is not supported, this bit is command specific.
  • DRQ - Shall be set to one.
  • CHK - Shall be cleared to zero.