2018年6月10日 星期日

System Management BIOS(SMBIOS) 概述

SMBIOS是由DMTF(https://www.dmtf.org/)組織所制定及維護的業界規範,其目的在於讓主機 板及系統廠商有統一的標準格式,來描述產品相關的管理資訊,並供給作業系統使用。

本篇文章以SMBIOS 3.2.0 Specification 當作參考:
DSP0134_3.2.0

  • SMBIOS entry point

要得到SMBIOS的資訊,首先必須先找到SMBIOS 的Entry point,再透過SMBIOS entry point structure中的 "Structure Table Address",來找到SMBIOS table的記憶體位址。

SMBIOS Entry Point主要可以區分為較早期的版本SMBIOS 2.1及現在的SMBIOS 3.0版本,以32-bit和64-bit作為分別。


SMBIOS Entry Point structure的訪問方法


Legacy
在實體記憶體位址0x000F0000-0x000FFFFF之間,尋找"_SM_"(SMBIOS 2.1) 或者"_SM3_"(SMBIOS 3.0)字串,就可以訪問到其Entry Point structure。

UEFI
透過EFI Configuration Table和SMBIOS GUID來進行訪問。
SMBIOS 2.1為SMBIOS_TABLE_GUID{EB9D2D31-2D88-11D3-9A16-0090273FC14D}。
SMBIOS 3.0為SMBIOS3_TABLE_GUID{F2FD1544-9794-4A2C-992E-E5BBCF20E394}。


得到SMBIOS Entry Point 之後,就可以透過其"Structure Table Address"來訪問 SMBIOS structure。

EDK2中定義的 SMBIOS Entry Point結構
typedef struct {
  UINT8     AnchorString[5];
  UINT8     EntryPointStructureChecksum;
  UINT8     EntryPointLength;
  UINT8     MajorVersion;
  UINT8     MinorVersion;
  UINT8     DocRev;
  UINT8     EntryPointRevision;
  UINT8     Reserved;
  UINT32   TableMaximumSize;
  UINT64   TableAddress;
} SMBIOS_TABLE_3_0_ENTRY_POINT;

  • SMBIOS Structure

SMBIOS Structure可以分為formatted section和optional unformed section。
formmated section以長度4 byte的header起始,而接在header之後的資料格式根據Structure type有所不同。 optional unformed section則由文字字串組成。


SMBIOS Structure Header


Offset   Name   Length   Description  
00h   Type   BYTE   Structure的類型。Type 00h到 7Fh是預留給SMBIOS spec定義,而Type 80h到 FFh則讓系統廠可以自行 定義。 
01h   Length   BYTE   Structure formatted section的資料長度,從header的Type開始算起,不包含文字字串的 部分 
02h   Handle   WORD   用來識別不同structure實體的一組16 bit number,其值範圍是從 FF00h到 FFFFh。 

Text String


SMBIOS Structure的Text String區塊接在Structure的formatted section之後。而其是選擇性的, SMBIOS的Structure內並不一定要含有Text String。每個Text String的結尾都是null character(00h)。

在SMBIOS structure的formatted section中,需要使用Text String的時候,就需要填上一個非0 值。假設其填值為02h,就代表這個string field要去參考Text String區塊中的第二個Text String。若其 填為0,就代表此string field不使用Text String。

SPEC中的BIOS Infomation(Type 0)範例:

使用Text String的BIOS Infomation(Type 0)
BIOS_Info LABEL BYTE
db    0                 ; Indicates BIOS Structure Type
db    13h                ; Length of information in bytes
dw    ?                 ; Reserved for handle
db    01h                ; String 1 is the Vendor Name
db    02h                ; String 2 is the BIOS version
dw    0E800h               ; BIOS Starting Address
db    03h                ; String 3 is the BIOS Build Date
db    1                 ; Size of BIOS ROM is 128K (64K * (1 + 1))
dq    BIOS_Char             ; BIOS Characteristics
db    0                 ; BIOS Characteristics Extension Byte 1
db    'System BIOS Vendor Name',0      ;
db    '4.04',0               ;
db    '00/00/0000',0           ;
db    0                 ; End of strings

沒有使用Text String的BIOS Infomation(Type 0)
BIOS_Info LABEL BYTE
db    0                 ; Indicates BIOS Structure Type
db    13h                ; Length of information in bytes
dw    ?                 ; Reserved for handle
db    00h                ; No Vendor Name provided
db    00h                ; No BIOS version provided
dw    0E800h               ; BIOS Starting Address
db    00h                ; No BIOS Build Date provided
db    1                 ; Size of BIOS ROM is 128K (64K * (1 + 1))
dq    BIOS_Char             ; BIOS Characteristics
db    0                 ; BIOS Characteristics Extension Byte 1
dw    0000                ; Structure terminator

2018年6月8日 星期五

HTML escape characters

Symbol   Entity Name  
space    
en space    
em space    
&   &
<   &lt;
>   &gt;
"   &quot;

bcdedit - Windows 管理BCD存放區的工具

本篇文章參考網頁:
bcdedit-command-line-options

在Windows內建管理BCD(Boot Configuration Data) 存放區(store)的工具,可以用來修改開機順序,或其他與開機相關操作。

bcdedit /COMMAND [ARGUMENT1] [ARGUMENT2]

HELP


bcdedit /? [COMMAND] 輸出bcdedit 命令列表。若有COMMAND參數,則輸出COMMAND的詳細資訊。


操作存放區


export bcdedit /export <FILENAME> 匯出系統存放區的內容至檔案,這個檔案可以用import命令來還原系統存放區,此命令只對系統存放區有效。

import bcdedit /import <FILENAME> [/clean] 能將export的檔案匯入系統存放區,此命令只對系統存放區有效。

store bcdedit /store <FILENAME> 指定要操作的存放區。如果沒有指定,bcdedit將會以系統存放區(system store)進行操作。


修改entry的項目


set bcdedit /set [{<id>}] <datatype> <value> [/addfirst|/addlast|/remove] 設定entry項目的值。


輸出控制


enum bcdedit /enum [<type>|<id>] 列出存放區中的entries


控制開機管理程式的命令


displayorder bcdedit /displayorder <id> [...] [/addfirst|/addlast|/remove] 調整開機管理程式顯示的選項順序


Debugging


dbgsetting bcdedit /dbgsetting [ <debugtype> [TARGETNAME:<targetname>] ] 設定系統的全域Debugger,不加參數則顯示目前全域Debugger設定。

<debugtype> - 指定Debugger類型。可為SERIAL、USB和NET等。
<targetname> - 用於USB偵錯,指定用於偵錯的USB目標名稱。

debug bcdedit /debug [<id>] { ON | OFF } 開啟或關閉開機項目的Kernel Debugger。若id沒有指定,則開啟或關閉目前的開機選項的Kernel Debugger。


  • 使用bcdedit在Windows下調整boot order(使用USB Device開機)


1. 列出系統存放區所有firmware applications
bcdedit /enum firmware
2. 找到要使用於開機的USB Device的firmware application,並記錄其id(identifier)。

3. 將fwbootmgr entry的USB device選項用displayorder設到最前面。
bcdedit /set {fwbootmgr} displayorder <id> /addfirst
4. 重新開機,這時系統應該會boot進USB device的image中。

2018年6月7日 星期四

diskpart - Windows 管理硬碟與分割區的工具

diskpart是Windows下用以管理及操作磁碟與分割的CLI工具。

assign

指派一個磁碟機代號或掛接點到所選擇磁碟區。


clean

清除磁碟上所有資訊,可以用以清除磁碟上的分割區。


create

建立一個磁碟區、磁碟分割或虛擬磁碟。

partition - 建立一個磁碟分割。
efi - 建立一個EFI系統磁碟分割。
extended - 建立一個延伸磁碟分割。
logical - 建立邏輯磁碟區。
msr - 建立一個Mircrosoft保留的磁碟分割。
primary - 建立主要磁碟分割。

volume - 建立一個磁碟區。
vdisk - 建立虛擬磁碟檔案。


exit

離開diskpart。


format

格式化磁碟區或磁碟分割。

OPTIONS
fs=<FS> - 指定檔案系統的類型。ex: fs=ntfs。
label=<"LABEL"> - 指定磁碟區標籤。ex: label=D。
quick - 執行快速格式化。


list

列出物件的清單。

disk - 列出磁碟。
partition - 列出所選磁碟上的分割。
volume - 列出磁碟區。
vdisk - 列出虛擬磁碟。


select

將襙作移至所選物件。

disk - 將操作移至所選磁碟。
partition - 將操作移至所選分割。
volume - 將操作移至所選磁碟區。
vdisk - 將操作移至所選虛擬磁碟。


shrink

縮小所選磁碟區。

OPTIONS
desired=<N> - 指定要縮減的磁碟區空間大小(MB)。ex: desired=100000。
querymax - 回傳所選磁碟區可縮減的空間最大值(磁碟區上的可用空間),但如果
  應用程式正在存取磁碟區,此值可能會改變。



diskpart批次檔


diskpart也能寫成批次檔形式,可以參考:
diskpart-scripts-and-examples

執行diskpart script
diskpart /s example.txt

Batch script 筆記

參考網頁
windows-commands
https://ss64.com/nt/
https://en.wikibooks.org/wiki/Windows_Batch_Scripting

  • 參數

Batch的參數使用 %n (%0、%1、%2、%3 ...) 來代表第n個參數,%0 代表batch檔本身。

%n 還可以使用下列擴充語法,詳細內容可以使用 call /? 來參考:
%~1 - 展開 %1 並移除包圍的引號(")
%~f1 - 展開 %1 為一個完整合格路徑名稱
%~d1 - 只展開 %1 為磁碟機代號
%~p1 - 只展開 %1 為路徑
%~n1 - 只展開 %1 為檔名
%~x1 - 只展開 %1 為副檔名
%~z1 - 顯示 %1 的檔案大小

常見應用

%~dp0
batch檔所在的目錄,常與%CD%作為比較,%CD%代表的是當前的工作目錄。


  • 動態變數

cmd.exe下可使用的動態變數,不會出現在set 命令的環境變數列表中,在每次展開時
都會重新計算一次。


%CD%
展開當前工作目錄的字串。

%RANDOM%
展開一個範圍0到32767間的整數。

%ERRORLEVEL%
展開目前ERRORLEVEL的值。

參考範例
在Batch 中取出字元的ASCII Number


  • 輸出命令重新定向

COMMAND > FILENAME
清除原有內容後再寫入

COMMAND >> FILENAME
在原有內容後寫入

COMMAND < FILENAME
將FILENAME的內容傳入COMMAND

COMMAND_A | COMMAND_B
將COMMAND_A的output傳入COMMAND_B

常見應用

COMMAND > nul
不印出輸出命令結果


  • cd

切換目錄

/d
同時切換磁碟機


  • del

刪除一或多個檔案

/q
Quiet Mode。不會再次詢問是否刪除檔案。


  • endlocal

復原setlocal前的環境變數


  • exit

結束cmd.exe或目前的batch script。

/b
結束目前的batch script而不是cmd.exe。

/b [exitCode]
將ERRORLEVEL variable設為exitCode所設的數字。


  • findstr

搜尋檔案中的字串

/c:string
所要逐字搜尋的字串。若要搜尋多個字串,可用空白字元分隔。

/r /c:string
將string視為regular expression來使用。


  • for 迴圈


使用for 迴圈iterate 項目
for %%PARAMETER in (ITEM1 ITEM2 ITEM3 ...) do COMMAND

一次讀出字串並將其分成獨立的項目(tokens)
for /f ["OPTIONS"] %%PARAMETER in ("Text string to process") do COMMAND

一次讀出command的輸出並將其分成獨立的項目(tokens)
for /f ["OPTIONS"] %%PARAMETER in ('COMMAND_TO_PROCESS') do COMMAND

使用一段範圍的數字iterate
for /l %%PARAMETER in (start,step,end) do COMMAND
start - 起始數字
step - 迴圈數字所要增加的值,可為負數
end - 結束數字


OPTIONS
Key   Description  
delims=xxx   設定分隔字元(預設為空白字元),xxx表示可設定多個字元。  
token=x,y  
token=z*  
token=m-n  
用來決定要取出的item,並且放到parameter中。 
若token=x,就取出第x項item。  
token=x,y,若parameter設為%a,便取出第x與y項item分別置於%a和%b自動變數中。 
token=z*,若parameter設為%a,取出第z項置於%a中,並將第z項後的所有item置於%b中。 
若token=m-n,便取出第m至第n項。 


  • if 判斷式


判斷檔案存在與否
if [not] exist FILENAME COMMAND if [not] exist FILENAME (COMMAND) else (COMMAND)
判斷文字字串是否相符 if [not] STRING1==STRING2 COMMAND
使用數值進行判斷 if [not] ITEM1 compare-op ITEM2 COMMAND if [not] ITEM1 compare-op ITEM2 (COMMAND) else (COMMAND)
/i
忽略大小寫。

compare-op:
EQU - Equal
NEQ - Not Equal
LSS - Less Than
LEQ - Less Than or Equal
GTR - Greater Than
GEQ - Greater Than or Equal


  • set

顯示、設定或移除cmd.exe的環境變數。若不加任何參數,就會顯示所有環境變數。

將變數設為文字字串
set VARIABLE=STRING
將變數設為數學運算後的值
set /a "VARIABLE=expression"

常見應用

set VARIABLE=
VARIABLE初始化

set /a VARIABLE=HEX_NUMBER or OCT_NUMBER
可將十六進位數字(ex: 0x2F) 或八進位數字(ex: 057) 轉換成十進位數字。


  • setlocal

將環境變數帶入到Batch 的local變數中,在Batch執行完或endlocal時結束。

設定或取消延遲變數展開
setlocal {EnableDelayedExpansion | DisableDelayedExpansion}
EnableDelayedExpansion - 延遲變數展開
DisableDelayedExpansion - 取消延遲變數展開

補充說明
延遲變數展開 (EnableDelayedExpansion)


2018年6月5日 星期二

Docker 命令列介面筆記

本篇文章參考來源:
https://docs.docker.com/get-started/part2/
https://docs.docker.com/engine/reference/commandline/docker/

  • docker pull

從 registry取得 image

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

docker pull python


取得 python的image

docker pull python:3.8.16


取得 python版本為3.8.16的image

  • docker build

使用Dockerfile建立image

docker build [OPTIONS] PATH | URL | -
OPTIONS
Name, shorhand   Description  
--tag, -t   指定image的命名及tag,格式為name:tag,tag為optional  


  • docker image

管理操作image

docker image COMMAND

docker image ls


列出image

OPTIONS
Command   Description  
--all, -a   列出所有images  

docker image rm


刪除 image


  • docker run

在新的container中執行命令

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS
Name, shorhand   Description  
--detach, -d   讓container在背景執行  
--interactive, -i   保持 container中的 STDIN開啟  
--publish, -p   將container的port映射到host端  
--rm   在container exit後自動移除  
--tty, -t   分配一個 pseudo-TTY給 container  

docker run --rm -i -t python:3.8.16


python的交互模式在 container中執行


  • docker container

管理操作container

docker container COMMAND

docker container ls


列出container

OPTIONS
Command   Description  
--all, -a   列出所有container  

docker container stop


docker container stop [OPTIONS] CONTAINER [CONTAINER...]
終止執行中的container

2018年5月31日 星期四

Dockerfile 指令筆記

本篇文章參考來源:
https://docs.docker.com/get-started/part2/
https://docs.docker.com/engine/reference/builder/

使用者可以透過Dockerfile來定義Docker container的開發環境。

Dockerfile的基本格式:
# comment
INSTRUCTION arguments

引用官方範例如下:
# Use an official Python runtime as a parent image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]


FROM


FROM <image>[:<tag>]

引入container所需要的Base Image。


WORKDIR


WORKDIR /path/to/workdir

指定docker執行指令的工作目錄


ADD


ADD <src>... <dst>

將<src>的檔案及目錄複製到image的<dst>中


RUN


RUN <command>
RUN ['executable', 'param1, 'param2']

在當前的image上會再建立新的一層image,並在新的image執行RUN的command


EXPOSE


EXPOSE <port> [<port>/<protocol>...]

指定container對外部開放的port


ENV


ENV <key> <value>
ENV <key>=<value> ...

建立build stage時的environment variable


CMD


CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

image被啟動時所執行的command,在Dockerfile中只有最後一個CMD會被執行。


2018年5月28日 星期一

在 Ubuntu下安裝 Docker CE

本篇文章參考來源:https://docs.docker.com/install/linux/docker-ce/ubuntu

  • 移除舊版的 Docker

在Docker較新的版本中,將Docker區分為CE(Community Edition)與EE(Enterprise Edition)的版本, 所以在安裝前,最好先移除舊版的Docker。

$ sudo apt-get remove docker docker-engine docker-io

  • 透過 Docker的 repository來進行安裝


設定 Docker的 repository


1. 更新 apt的套件資訊

apt會使用 /etc/apt/sources.list來更新套件資訊,讓套件與相關 repository同步。

$ sudo apt-get update

2. 安裝相關套件讓 apt能透過 HTTPS使用 repository

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

3. 加入Docker的 GPG key

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
接下來,確認剛加入的key是否含有以下fingerprint
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88

搜尋fingerprint最後8個字元為0EBFCD88 $ sudo apt-get fingerprint 0EBFCD88 pub   4096R/0EBFCD88 2017-02-22
      Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-0222

4. 使用Docker Stable 的 repository

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"


安裝Docker CE


1. 再次更新 apt的套件資訊

$ sudo apt-get update

2. 安裝Docker CE

$ sudo apt-get install docker-ce

3. 運行 hello-world image來確認Docker是否安裝成功

$ sudo docker run hello-world

2018年5月14日 星期一

使用 Virtualenv 開發 Python



  • 安裝 Virtualenv

使用pip指令安裝Virtualenv

Windows:
> python -m pip install virtualenv


  • 使用 Virtualenv 建立虛擬環境

將路徑切換至Python需要建立虛擬環境的目錄下,並執行

Windows:
> python -m virtualenv [env_name]
env_name為所要建立虛擬環境的名稱,之後就會在目錄下產生名為[env_name]的資料夾


  • 運行虛擬環境

執行env_name/Scripts中的activate檔案

Windows:
> .\venv\Scripts\activate.bat

執行成功後,命令視窗就會出現目前正運行在虛擬環境中的提示字樣
(env_name)


  • 離開虛擬環境

執行env_name/Scripts中的deactivate檔案

Windows:
> .\venv\Scripts\deactivate.bat

若命令視窗中的提示字樣消失,就代表已經成功離開虛擬環境

2017年12月1日 星期五

Windows「執行」指令筆記

  • Windows執行指令快捷鍵 Win + R
  • 在C:\Windows的目錄下可加入應用程式的捷徑,便可以從「執行」啟動

常用程式
calc 小算盤
mspaint 小畫家
snippingtool 剪取工具
notepad 記事本
write WordPad
cmd 命令提示字元
powershell Windows PowerShell
explorer 檔案總管

系統目錄
shell:startup 系統啟動資料夾
shell:sendto 傳送到(send to)資料夾

系統資訊
msinfo32 系統資訊
msconfig 系統設定
regedit 登錄編輯程式
control 控制台
dcomcnfg 元件服務
winver 顯示windows版本

系統配置
tpm.msc TPM管理
devmgmt.msc 裝置管理員
diskmgmt.msc 磁碟管理
eventvwr.msc 事件檢視器
taskschd.msc 工作排程器