2018年6月28日 星期四

RAMDisk 軟體 - ImDisk


官方網址

https://sourceforge.net/projects/imdisk-toolkit

測試系統

Windows 10

使用版本

2.0.9

RamDiskUI.exe


Size: RAMDisk磁碟的大小
Allocate Memory Dynamically: 動態記憶體配置



Quick Format: 快速格式化



Load Content from Image File or Folder: 指定RAMDisk磁碟所要備份的參考路徑
Excluded Folders: 忽略所要備份的目錄
Synchronize now: 將RAMDisk磁碟同步到參考路經


config.exe


Request administrator rights in Explorer: 執行RAMDisk中的檔案時以Administrator權限執行


Windows Print Screen 按鍵功能


Print Screen為鍵盤上所提供相容於Windows系統的按鍵,通常縮寫為PrtSc。

PrtSc
將全螢幕的圖像存入隨機記憶體,使用Ctrl + V將圖像讀出。

Alt + PrtSc
將應用程式的圖像存入隨機記憶體,使用Ctrl + V將圖像讀出。


Win8/Win10

Win + PrtSc
將全螢幕的圖像存入PNG檔到圖片資料夾。

Win + Alt + PrtSc
將應用程式的圖像存入PNG檔到影片資料夾。

2018年6月20日 星期三

[Batch] 取得字元的ASCII Number

在寫Batch script的時候,有時候會需要用到某些字元的 ASCII Number 來做判斷(ex: 判斷 英文字母的排序),但是cmd.exe並沒有提供這樣的服務,這時候可以應用一個非官方文件 所記載的動態變數 %=ExitCodeAscii% 來達成目的。

%=ExitCodeAscii% 的值為最後一個額外的cmd.exe所回傳的ExitCode的ASCII character。

Example: 找出 "A" 的ASCII Number
@echo off
setlocal EnableDelayedExpansion

set char=A
for /l %%a in (32,1,126) do (
   cmd /c exit %%a
   if "!=exitcodeAscii!" EQU "%char%" echo %%a
)

Output:
65

延遲變數展開 (EnableDelayedExpansion)

在剛開始寫Batch的迴圈(for)的時候,都會遇到一個問題,就是在迴圈中,想要去改變(set) 某個變數的值,可是卻沒有作用。

Example:

set var=0
for %%a in (1 1 1 1 1) do (
   set /a var+=%%a
   echo %var%
)
echo %var%

Output:
0
0
0
0
0
5

上面範例原意是想讓 var在每次的迴圈中都 +1,最後的值會是 5。可是在迴圈中每次 echo出的值都是一開始的 var值 0。

原因是 var在 batch file被解析的時候就會提前展開,所以在迴圈中會 echo出一開始被展開的值。要得到預想的結果就要使用 setlocal EnableDelayedExpansion來延遲變數展開,使其在執行的階段才會被展開。

Example:

setlocal EnableDelayedExpansion
set var=0
for %%a in (1 1 1 1 1) do (
   set /a var+=%%a
   echo !var!
)
echo %var%

Output:
1
2
3
4
5
5

注意在取值時,要延遲展開的變數需使用 !var!才會有效果。

與 setlocal EnableDelayedExpansion對應的是 setlocal DisableDelayedExpansion,其作用為取消延遲變數展開。

2018年6月11日 星期一

記憶體(SDRAM) 的規格標示

以DDR4為例,目前在市面上常見的產品有:DDR4 2133、DDR4 2400、DDR4 2666及DDR4 3200 等。

用DDR4 2400來說,有時候也會看到PC4-19200等其他標示,這裡的DDR4 2400的"2400", 單位是MT/s (megatransfers per second),意義上代表每秒鐘可完成2400×106次傳輸操作。

而目前記憶體DIMM的Bus width為8 Bytes(64 Bits),表示DDR4 2400的資料傳輸速率為19200 MB/s (8 Byte × 2400 MT/s),所以PC4-19200的"19200"就代表記憶體傳輸速率的峰值(Peak Transfer Rate),單位為MB/s。


SMBIOS Type 17中的"Speed"欄位,在先前的SPEC (3.0.0 與之前的版本)中,是用時脈來表示記 憶體速度,單位是MHz。在之後的SPEC,"Speed"欄位則改用MT/s來表示。以DDR4 2400為例,"Speed"所 要填的值為0x0960(2400)(MT/s),而若是SMBIOS 3.0.0以前,就要填為0x4B0(1200)(MHz)。

記憶體的MHz和MT/s間轉換,就是將MHz的數值×2就能獲得MT/s,因為資料傳輸同時計入時脈 的正緣與負緣。

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