CentOS LS Color

預設 CentOS LS 上色時目錄是深藍色 (using putty)
背景若是黑色的,會造成上色反而完全看不到目錄 …
可以修改 /etc/DIR_COLORS.xterm
找到 DIR 00;34
將之修改為 DIR 01;34 即為亮色會較清楚
也可以加上 04 碼如: DIR 01;04;34 為目錄加上底線

上色相關設定在此檔案中有說明
# Below are the color init strings for the basic file types. A color init
# string consists of one or more of the following numeric codes:
# Attribute codes:
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white

此檔案中也有其他 ls 的顏色顯示設定,也可以依樣畫葫蘆進行修改
大部分只要將 00 修改為 01 應該就會改善很多了 ~

廣告

DELL u2711 開箱 + 裝箱

覬覦 27″ 螢幕許久,前些日子終於衝動的給他敗下去
看上的是 DELL u2711(Dell 官網連結)

IPS 面板 + 多種輸入 port 支援
可滿足我想同時接 電腦、筆電、電玩主機 的願望 XD
更不用提那 2560*1440 的高解析度!!

但 … 開心的將螢幕裝上後,卻看到 …

我的天啊 … 那條綠色的東西是什麼!!!
秉持著相信 DELL 品質的心,先懷疑是顯示卡的問題,
沒想到 … 更換成筆電後,問題依舊 (哭)

只好拿起電話傷心的跟 DELL 客服聯絡,
在聯絡之前先上網找找看,網路上有沒有跟 DELL 退貨 or 換貨的經驗談。
網路上有一些分享的相關文章,不過感覺都有些時日了。

所以還是決定拿起電話尋找客服!
Dell 技術支援電話號碼
咦?怎麼沒有看到「顯示器」的選項阿 …
只好寄信聯絡之前處理我訂單的業務,他給我的號碼是0080-1861-011這一支
打去是語音系統,根據指示一步一步的往下走,到達選擇產品類型這一步
囧!?「桌上型電腦請按1, 筆記型電腦請按2, 工作站請按3」 沒了!?
只好先掛掉電話,跟朋友討論了一下 … 桌上型電腦這個選項大概是最有可能的
就大膽的選了 1-3-1-1 (桌上型電腦家用)

接通後是一位先生,第一步先說自己是台灣客戶!
由於大陸那邊好像沒有 14 天鑑賞期,所以表明自己是台灣客戶可以減少一些誤會 XD
接著簡單說明一下螢幕狀況,然後對方向我要螢幕序號
不知是否因為螢幕剛出貨還沒登入到系統中,客服那邊找不到此螢幕。
換成提供 Service Tag (裝螢幕的箱子上會有),這次找到了
不過客服卻說
「不好意思,您這螢幕在台灣是透過商用渠道出貨的,我幫您把電話轉接過去,請別掛斷」
咦?!這不是家用螢幕嗎 Orz 為什麼是商用渠道 (汗

轉接到商用頻道,這次是一位小姐。上一位先生有把螢幕資訊也一併轉過去。
不過客服小姐還是請我說明一下狀況,把想處理的問題講一講,提到想要辦理退貨 …
看之前網路上說如果是因為螢幕有瑕疵,要退 or 換好像比較不會被刁難。
客服小姐再次跟我確認螢幕序號 (CN 開頭的那一組) 後,
說明會幫我把資訊轉移到「客戶關懷部」,在一到兩個工作天內會主動聯絡我 ~

隔天果然就接到客戶關懷部的來電,
客服小姐簡單的說明一下從技術支援部得到的消息,了解我想辦理退、換貨的理由
由於我堅持是要退貨,所以客服小姐就替我簡單介紹一下 DELL 的退貨、退款方式
接著跟我留下聯絡資訊,說明是否能退貨必需透過再上一層的決定,會再跟我聯絡。

又隔一天收到客服小姐的來信,說已同意讓我退貨,並會在兩天後由 DHL 送相關文件給我
DHL 送來的是一份該如何跟 DHL 客服聯絡安排取件的相關事宜。
包含有 DELL 的說明、DHL 的物流運貨單、Invoice、DHL 服務使用方式
除了第一頁的說明,其他都是英文的 ~ 不過重點都在第一頁上面了 XD
所以不懂英文問題應該也不大

打去 DHL 客服跟他們「安排取件」,並照著 DELL 寄來的文件提供 DHL 資訊
接著就把螢幕裝箱等著 DHL 的人來把它收走囉~

— 心得 —
整個流程我總共只打了兩通電話,一通是給 DELL 技術支援部 一通是 DHL 客服
其他都是他們主動聯絡,不算太方便但也不是太麻煩
由於我早就知道退換貨要經由「客戶關懷部」才能處理,
但不知為何寄信問業務、網路上查詢 都只能得到技術支援部的電話
我想這大概是他們一定要跑的流程吧~
整個過程中也沒有被刁難,服務還算不錯 XD

還有整個流程跑完花上了我一週的時間,若遇到週末螢幕就會留的更久了
如果不是瑕疵螢幕的話,其實這樣還滿爽的 XD 就像是試用產品的感覺 = =||
接著就要來追退款有沒有回來囉 ~

PS. 剛剛去查 DELL 線上購物網站,螢幕價錢居然比我當初買貴了1千!太傷心了 …

Little Endian VS Big Endian

Endianness, 當一個資料要儲存到記憶體時

有兩種儲存方式,
如上圖其一為 Little Endian, 另一為 Big Endian
通常而言不需要考慮此排列方式的問題,
但是當要將資料傳遞到別的硬體平台上,或是網路上時
這問題就變得需要在意了,

在網路傳輸上使用的是 Big Endian,
Kernel 中也有提供 htonl, htons, ntohs, ntohl 等 function
幫助將資料在 Big Endian 及 機器的 Endian 之間作轉換 ~

目前也有平台是支援多種 Endianness 的
ex: ARM, PowerPC, MIPS …
透過硬體上的一個 Register 來設定要使用那種方式

當拿到一個新的硬體時,要如何得知此硬體目前使用的是哪一種 Endianness 呢?
1. 翻閱 Spec, 一般而言 CPU Spec 上都會標明是哪一種,不過在可以並存的硬體上
就需要別的方式來幫助判斷了。

2. 寫小程式來判別,在此提供兩種程式寫法
  2-1 先宣告 integer 0x12345678
  再使用一個 char pointer 檢查第一個 byte 存 0x12 or 0x78

#include <stdio.h>

int main() {
	int a = 0x12345678;
	char *ptr = (char *)&a;
	if (*ptr == 0x12)
		printf("Big Endian\n");
	else
		printf("Little Endian\n");
	return 0;
}

  2-2 使用 htonl 來幫忙
  剛剛有提到 htonl 會將資料轉成 Big Endian,若轉換前後一致那就是 Big endian 啦

#include <arpa/inet.h>

int main() {
	int a = 0x12345678;
	int b = htonl(a);
	if (b == a)
		printf("Big Endian\n");
	else
		printf("Little Endian\n");
	return 0;
}

— Reference —
Endianness (Wikipedia)

Cache

最近被問了些有關 Cache 的知識,趁這個機會來了解一下吧 XD
什麼是 L1, L2, L3?
什麼又是 VIVT, VIPIT, PIPT?
還有 Aliasing 的問題又是什麼東西呢?
另外常聽到 Write Through, Write Back 則是代表什麼呢?
Non-Cacheable 又是怎麼回事呢?

Multi-level Cache
L1, L2, L3。L 原來是 Level 的意思
在多層 Cache 的架構下,L1 是最靠近 CPU 的 Cache
當 L1 發生 Cache Miss 時,就會嘗試到 L2 中尋找,若不幸又發生 Cache Miss
那就再進到下一層找資料,最後都沒找到時才會到 Memory 去尋找!

這其實是一個 tradeoff,Cache Size 越大 hit rate 越高
但同時 latency 也越高,需要較多時間搜尋 …
所以就演變出這種多層的架構~ 以較大的 cache 當作小 cache 的 back up
L1 通常是最小且最快的,之後 L2, L3 每層會越來越大越來越慢
這時一定會好奇那為什麼要做這麼多層?!
因為 Memory 離 cpu 太遠了,通常都會有個 bus 在中間做溝通橋樑
所以相比之下 cache 還是比存取 memory 來的快。

PS. 在 ARM v7 架構下,最多可支援到 Level 7 喔!

Indexed & Tagged

要如何在 Cache 中找資料呢? 當然是使用 memory address 呀!
那 ... 是 virtual address 還是 physical address 啊?
嗚 ... 

這問題就要了解到 VIVT, VIPT, 及 PIPT 了 ~
index 跟 tag,分別是兩個拿來判斷資料是屬於誰的資訊
兩者要同時相符合,才會說是 cache hit, 並回傳資料

所謂的 VIVT 指的是 Virtual Indexed Virtual Tagged
同理 VIPT = Virtual Indexed Physical Tagged,
PIPT = Physical Indexed Physical Tagged

當 Cache 為 VIVT 時,皆只使用 Virtual Address 去作存取
速度較快 (因為程式執行時,傳遞的本來就是 virtual address)
但是卻會常常需要作 invalidate 的動作。
由於每個 Process 都會有 4G 的 virtual address,
雖然對應到的 Physical Address 不同,但是 VIVT cache 只使用 virtual address
造成 context switch 時就一定得進行 clean+invalidate(flush) 的動作
以防止存取到錯誤的資料。

與 VIVT 相對的極端 PIPT
只使用 physical address 作存取,不用擔心資料取錯
但是得進行 physical address 轉換, 如果不巧發生 TLB miss …
這轉換的工作就會是個漫長的旅途了 哈

在 VIPT 的情況下,
由於多了 Physical Tag,就能讓資料在 cache 存在的時間拉長
所謂的 physical tag 指的是當 virtual address 進來後得進行一次轉換
同時 virtual, physical address 都 match 才會取得資料
缺點就是在 physical address 轉換出來之前,都無法找到正確的資料
不過卻也比 PIPT 來的好很多,因為當 virtual address 在 cache 中流竄的同時
也能在 TLB 當中流竄進行 physical address 轉換

根據排列組合,應該還有個 PIVT 的存在才對啊!
這東西 … 沒用處,所以基本上大家都不討論。
This fourth theoretical type of cache, physically indexed, virtually tagged (PIVT), is basically useless and is not discussed further. ※from Linux Journal

Aliasing Problem
當兩個 Virtual Address 指到同一個 Physical Address 時,
雖然都是同樣的資料,但 VIVT, VIPT 皆會保存兩次 (因為 index 不同)。
此時就會稱之為 cache-line aliasing problem

舉例來講,Kernel 中有 copy_from_user, copy_to_user 使用此兩個 API 時
Kernel 會使用 kernel space virtual address 來 map physical address
但此 physical address 一定也有 user space virtual address 對應
這時就會發生兩個不同的 virtual adress 卻對應到同樣的 physical address 的情形

為解決此問題,有人提出了 page coloring 的作法。(在此不贅述 Orz)

Write Through & Write Back
這是兩種不同的 cache type,差別在於
Write Through – 每次將資料寫回 cache 時,同時也寫到 main memory
Write Back – 只有當 Cache Line 要被 Flush 時,才寫回 main memory
在 write-back cache 中,cache, memory 的資料通常是不同步的。
所以可能會多使用 dirty bit 來標示說 memory 的資料已經是舊的。
當 cache 要將資料清除時,得負責把資料寫回 memory ~

Non-Cacheable

咦? Cache 不是加速用的嗎?
那為什麼會有 non-cacheable 的需求?

一般而言 Memory 的存取,能 cache 一定是比較有幫助的!
但是若今天是 I/O device 時,每次去跟裝置要資料時應該都是不同的值
若被 cache 住,cache hit 就拿不到裝置上最新的資料了 …
所以像這種每次都有可能拿到不同值的,原則上都不應 cache
如此才能確保資料的 Reliability ~

— Reference —
CPU Cache (Wikipedia)
Understanding Caching | Linux Journal

About Virtualization

什麼是 Virtualization?隨著 Cloud Computing 興起,這成為最近很紅的一個字。

說到 Virtualization, 其實對於程式設計師應該至少聽過下面其中一個詞,
Java VM, Dalvik VM, Apple Rosetta, Transmeta Crusoe, VMWare ESXi,
VMWare Workstation, Xen, KVM, Parallels Desktop … etc

這些都是 VM, 差別在於某些部分是 Process VM 有些是 System VM!

Process VM ? System VM ?
Process VM: 只模擬一個 Process 的行為,可能是為了支援舊 Architecture 上的 Application ex: Apple Rosetta,也可能是為了可以在多個平台上執行 ex: Java

System VM: 模擬的是一個完整的 OS, 需要更複雜的處理 ex: VMWare, Xen, KVM

System VM
在 System VM 又分為,Hypervisor 及 Hosted VM 兩種形式。
前者是直接將 VMM(註1) 建立在硬體之上 ex: VMWare ESXi
後者則是將 VMM 建立在一個 OS 上,ex: VMWare Workstation, KVM

Popek and Goldberg Theorem
Gerald J. Popek 跟 Robert P. Goldberg 在 1974 年發表了一篇文章(註2),
說到 Virtualization 需要擁有三個特性
* Equivalence – 執行結果需與直接在機器上執行相同
* Resource control – 需要控管所有 VM 的 Resource
* Efficiency   – 要有效率, 盡量 Native Execution

Virtualizable
說到第三個 Property Efficiency, 要盡量讓程式碼在機器上 Native Execution,
可是又要做到 Resource Control, 這時會探討一個 Architecture 是否 Virtualizable
探討這個問題,我們將 Instruction 分類
* Privileged Instruction – 需要權限才能執行,若在 user mode 會發生 trap
* Sensitive Instruction – 會控制到硬體狀態的指令,ex: 更換硬體 mode
* Critical Instruction – Sensitive but non-privileged instruction

在這張圖中,最需要在意的是 粉紅色的 Critical Instructions,
倘若所有 Sensitive Instruction 皆為 Privileged Instruction
那 Virtualization 的問題會簡單很多,因為所有要控制硬體的指令皆會發生 Trap
此時我們就可稱呼這個 Architecture Virtualizable。
但不巧的是 X86, ARM 皆不是此種類型,所以 Critical Instruction handling
就成為做 Virtualization 時需要煩惱的問題。

在 Intel CPU 上,提出了 Intel-VT 的 Hardware Support 技術。
而 ARM 2012 推出的 Cortex A15 也將支援 Virtualization Hardware Support。
不難看出 Virtualization 的重要性越來越高!


註1:VMM = Virtual Machine Monitor, 負責管理 VM 的 Resource, VM 中要存取硬體上的資源時,理論上皆需經由 VMM 來控管,故有些 Security 的問題可以經由 VMM 來處理。
註2:Formal requirements for virtualizable third generation architectures, Published in: Communications of the ACM (Magazine) Volume 17 Issue 7, July 1974