阿旺的 Linux 開竅手冊







基礎篇
進階篇
補腦篇
版權所有,引用請註明出處

 基礎篇

Chatper 1 : 認識 Linux

1.0 誰適合閱讀?
1.1 話說UNIX/Linux~皇圖霸業談笑間
       UNIX
       GNU
       Linux
1.2 了解〝作業系統〞~生而不有,為而不持
       應用軟體(Appplication)
       核心(Kernel)
       驅動程式(Device Driver)
1.3 學習Linux的態度~一沙一世界的恆河沙
1.4 Linux已飛入尋常百姓家
1.5 閱讀前的準備~聊八卦談是非
       位元(bit)
       位元組(byte)
       二進制(binary)
           二進制轉十進制
           二進制轉十六進制
           十進制轉二進制
           十進制轉十六進制
       ASCII code
           EASCII code
       機械碼(Machine Code)
       原始碼(Source Code)
1.6 認識 PC腦常用的單位~K/Ki,M/Mi,G/Gi





















認識 Linux

1.0 誰適合閱讀?

基礎篇的內容基準,是假設想學習 Linux 的讀者平常只用 Windows, 但也因 Windows 目前是〝顯學〞,容易有先入為主的成見。且坊間許多介紹 Linux 的書籍,有一半以上的篇幅在講解〝圖形操作界面〞( Graphical User Interface ,GUI),用 GUI 學習 Linux 往往會見樹不見林,只在此山中卻雲深不知處,沒學習到 Linux/Unix 的設計哲學和精神。(很多用 Linux/Unix 所架設的 Server 根本不安裝 GUI 界面哦)

基礎篇的文章會盡量注重在原理介紹而不要去背指令,忘記某指令再去查就好,硬要去記反而會失去興趣。也嘗試加些〝人文〞,讓科技不要那麼冰冷 ,也盡量多些範例;一例解千文。

學習完基礎篇的內容,對 Linux 的基本的操作〝應該〞就沒問題,而進階篇比較偏重在系統管理。

Linux 的精髓是在〝文字操作界面〞(Command Line Interface,CLI),故本站是以文字操作界面為主,圖形操作界面為輔(圖形操作界面只有在安裝 Linux 提到);當然不可否認,第一次接觸文字操作界面的人會有某種程度的文化衝擊(尤其是沒玩過 DOS 平常只接觸 Windows),但當學會 Linux 的文字操作界面才會驚覺文字操作界面核分裂般的強大威力。

對於想〝速成〞學習 Linux 的讀者,可能要另請高明;如都沒基礎不可能如中<混沌開竅>的寓言般日鑿一竅的速成。如真的可速成就沒什麼價值。想速成學習 Linux 的讀者我引用美國甘迺迪(John F. Kennedy)總統的「登月演說」下註解「不是因為他們很簡單,而是因為他們很艱難...因為我們願意接受這項挑戰」。只要有心也不會太難啦,但也不會太簡單。

^ back on top ^




1.1 話說UNIX/Linux~皇圖霸業談笑間

很多人可能都不會想到現今的電腦科技基礎,從硬體的電晶體(Transistor),雷射(Laser)到軟體的 C/C++ 語言到 UNIX 作業系統都由和電腦沒直接關系的美國電信業者 AT&T 發明的。什麼是 UNIX 和 Linux 有什麼關係呢?始於為了爭奪武林絕學而引起的一埸江湖腥風血雨。

UNIX
「天下風雲出我輩,一入江湖歲月催,皇圖霸業談笑間,不勝人生一場醉」這是金庸<笑傲江湖>中東方不敗的自嘲,東方不敗自宮練成絕學〝葵花寶典〞仍還在自問「誰能笑傲江湖」?

誰能笑傲江湖?不是東方不敗而是自二戰到網路泡沫其間的西方不敗~〝AT&T〞。 AT&T ,美國電信霸主,內有一煉丹習武秘密基地〝貝爾實驗室〞(Bell Laboratories)。 煉丹習武聖地的貝爾實驗室在其間煉成電晶體神丹,打造見血封喉暗器-雷射死光,並修成如入幻境的 C/C++ 和 UNIX 等神功,每項絕學都獨步武林,也唯有貝爾實驗室可在電腦,半導體和電信等許多領域稱霸和笑傲江湖。

後來美國朝廷深怕貝爾實驗室再練神功會威脅朝廷,對 AT&T 斷其龍脈進行反托拉斯法 (Antitrust) 拆分。AT&T 龍脈被破後貝爾實驗室也被斷六脈廢武功和遇網路泡沫而日薄西山,「天下風雲出我輩,一入江湖歲月催」真是貝爾實驗室的最佳寫照。

1970 年代當時貝爾實驗室的 Dennis Ritchie 和 Ken Thompson 等人用迪吉多 (Digital Equipment Corporation) 的16 bit 迷你電腦〝PDP-11〞 開發出 UNIX。因當時 AT&T 在美國雇用超過一百萬人,幾乎比美國政府的公務員還多,可說是美國的地下政府,喊水會結凍富可敵國,對 UNIX 的版權不放在眼裡。另一方面也怕美國朝廷以反托拉斯法將 AT&T 拆散,故將 UNIX 和其原始碼(source code)開放給美國許多大學或半賣半送授權給企業使用,但 UNIX 的〝多人多功〞的深厚內力,立刻驚動萬教,轟動武林。

後來一代宗師的西方不敗~AT&T 後悔了想回收版權,但已外傳的絕學衍生出許多派別如 BSD、System V、Solaris、AIX、SCO、IRIX,HP/UX、Xenix、,NextStep...等錯綜複雜,比愛因斯坦的<相對論>還難懂 。

至今 UNIX 到底那些是合法的受權那些是開放其間合法的改版,到最後是授權給誰是爛帳一本沒人弄的懂,。到現在還時常有廠商跳出來宣稱擁有 UNIX 最終合法的授權而告另一廠商山寨侵權。一代武林絕學到最後竟淪為法律大戰,AT&T 也沒能從 UNIX 得到應得的利潤,江湖不講倫理道義只講法律「天下負我,卻說我負天下人」,文成武德的西方教主不免也感嘆「皇圖霸業談笑間,不勝人生一場醉」。

(一些從 AT&T UNIX 衍生出的徒子徒孫版本或自行開發和 UNIX 相容的版本,為了有別於正宗 AT&T 的 UNIX 統稱〝UNIX-like〞。)

GNU
眼見各大門派為了一統江湖掌握 UNIX 陷入法律大戰,偷練 UNIX 神功就會被 AT&T 和自稱有版權的門派發出武林追殺令,你死我活江湖道德早已淪喪。

此時江湖清流 Richard Stallman 於 1983 年發起 GNU 宣言,成立〝自由軟體基金會〞(Free Software Foundation,FSF),號召各路好漢放棄己見開發相容 UNIX 的自由作業系統。雖有志加入 GNU 的高手如雲,其間也完成了 C compiler GCC、文字編輯器 Emacs 和 UNIX 的程式函式庫(Library)等,但火候不夠,一直無法煉成 UNIX 所需最重要的核心(Kernel)[註1.1]。

Linux
1987 年,仙風道骨高人 Andrew S.Tanenbaum 教授,在沒參考 AT&T 的 source code 下,自行打通任督二脈,獨立開發出相容 UNIX 的〝Minix〞,但 Andrew 志在杏壇和出書立作,兩袖清風對紅塵俗事一點興趣也沒有。

1991 年,骨骼精奇,萬中無一的少年奇才芬蘭 Linus Torvalds 知道 Andrew 的 Minix 志不在江湖,於是讀完 Andrew 教授相關的武林秘笈後吸收其精華,閉關修練自己相容 UNIX 的核心〝Linux〞。幾個月後出關,一時金光閃閃,瑞氣千條已練成 Linux 大法。在網路上發英雄帖說道:「Hello everybody out there using minix- I'm doing a (free) operation system」。一時之間震動武林,奔相走告。

GNU 有 compiler GCC 和 UNIX 程式函式庫,獨缺 Kernel。西域芬蘭奇才 Tovalds 則有 Kernel~〝Linux〞,兩大門派結合就是一套完整可獨步武林一統江湖的作業系統,這雙壁合一就叫〝GNU/Linux〞。但這二大門派也志不在〝皇圖霸業〞而在〝道濟天下之溺〞故採 GNU 精神:〝自由地使用、複製、修改和發布〞以救蒼生。因是兩大門派結合,嚴格來說目前所說的 Linux 應叫〝GNU/Linux〞,但多數人仍叫 Linux。

^ back on top ^




1.2 了解〝作業系統〞~生而不有,為而不持

或許你知道〝Linux〞和熟悉的〝Windows〞都是〝作業系統〞(Operating System,簡稱OS),作業系統也是一種軟體(Software),作業系統是〝軟體中的軟體〞,但什麼是作業系統卻不容易說清楚,而要了解 Linux,最好對作業系統有個概念。

我認為最容易理解的解釋是「作業系統就是軟體的〝自律神經系統〞 (Autonomic Nervous System, ANS) 」,自律神經系統又可分: 自律神經系統控制的器官大部分我們是〝無感〞的,當〝有感〞時如要借助呼吸器維生或出門要準備尿袋等那就是有器官生病了。同樣的作業系統和自律神經系統一樣,有些應用軟體可偵測部分作業系統的動作,有些應用軟體可半控制作業系統的某個功能,但大部分的情形是應用軟體完全查覺不到作業系統的存在。

相同的作業系統提供各種服務給應用軟體是〝無為而治〞的,應用軟體大多〝無感〞作業系統做了什麼,無知無累自自然然。當應用軟體常〝感覺〞作業系統的存在時就表示作業系統還不成熟,如 DOS 下的應用軟體如使用 RAM 超過 640K 或要〝多工〞(Muti-Task) 才〝感覺〞作業系統的限制。

舉例來說 user 可能會用 PC 打開瀏覽器 (Web browser)上網,一邊聽 MP3,同時還用 Office 打資料,作業系統會自動分配各應用軟體所需的 RAM 和分派各應用軟體利用 CPU 時間。基本上作業系統和人的自律神經系統一樣默默在背景提供應用軟體的需求,但應用軟體不一定知道作業系統提供了那些服務或做了什麼事。

例如應用軟體提出 RAM 需求,但 RAM 不夠時,有些作業系統會把硬碟(Hard- Disk)的空間拿來當 RAM(所謂的虛擬記憶體 Virtual Memory)而應用軟體不一定知道此時的 RAM 空間其實是硬碟空間,反正有 RAM 可用就好,一樣跑的好好的「成功遂事,百姓皆曰我自然」[註1.2]不會想到作業系統在背景提供的支援。

作業系統也可從〝哲學〞的觀點來看, 作業系統提供各種資源給應用程式要〝無住相布施〞,例如使用微軟的 Windows 來上網,Windows 不能只提供資源給自家的 IE 或 Edge 自家的瀏覽器,用Chrome/Firefox 等對手產品來上網也要提供資源。

<老子-五十一章>曰哲學的〝道〞是「生而不有,為而不恃,長而不宰」,而作業系統也是應用軟體的〝道〞作業系統為應用軟體提供平台卻不能霸佔應用軟體的資源(生而不有),相反的還要提供各應用軟體的資源(為而不恃),更不能隨便關掉某應用軟體(長而不宰)。

對作業系統有點概念後再看下面應用軟體和作業系統之間的關係圖就會比較容易了解。


<圖1.2>
應用軟體 (Application software)

如<圖1.2>中所示最上層為應用軟體,一般 user 日常操作和接觸的軟體如瀏覽網頁、玩 PC game、用 Office 打資料等.這些軟體都是應用軟體。正常情況下一般 user 接觸的到只有應用軟體,不用或有限度的去操控作業系統,古早古早之前(1960之前)的電腦甚至只有應用軟體而沒作業系統,但基於下列三個理由,應用軟體需作業系統: 作業系統依操作的方式可分如下: 核心(Kernel)
〝kernel〞核心是指作業系統中去掉程式函式庫(Library),工具軟體和設定檔等所需的最基本的系統檔案。

如<圖1.2>中間部分的 Kernel 圖示,一般通用型的作業系統(如 Windows/Linux/Mac OS),因沒有限定其用途,故大都會有檔案系統(File system)、行程管理(Processing management)、記憶空間管理(Memory management)、網路通訊(Networking)、安全機制(Security)等功能。但不是一定都要有,如微軟剛闖蕩江湖時的 DOS 就只有陽春的檔案系統和自宮的記憶空間管理(不能超過 640K)。工業控制常用的嵌入式(Embedded)[註1.2B] 作業系統 μC/OS-II 也只有行程管理和記憶空間管理。

Kernel〝幾乎〞就是一個作業系統,但光有 Kernel 很多應用軟體還是不能執行,因軟體執行時可能需輔助性檔案如程式函式庫(Library).所以一般定義一個完整的作業系統是:Kernel+程式函式庫+工具軟體和設定檔;這樣的好處是可各別升級,如某個 Library 有 bug 時只要更新有 bug 的 Library 即可[註1.2C]。 而通用型的 Kernel 一般會有如下功能:
驅動程式(Device Driver)
許多人買了新的周邊硬體,高高興興回家時常會遇到需安裝驅動程式的困擾,什麼是驅動程式呢? 驅動程式是一種軟體,主要用來溝通硬體和 Kernel,因甲廠商開發的硬體〝理論上〞只有甲廠商知道如何控制,故廠商提供溝通硬體和 Kernel,且獨立於 Kernel 的軟體就叫驅動程式。

當然理論和實際往往不一樣,Kernel 為了安裝方便或是必需,會把許多驅動程式包含在 Kernel 內。例如 Kernel 一般會包含 PS2/USB,硬碟控制等驅動程式,不然 Mouse/Keyboard 或光碟/硬碟都無法控制就無法再安裝下去。且許多廠商只提供 Windows 下的驅動程式,但沒提供 Linux 下的驅動程式,於是就有許多功力深厚的高手幫忙寫 Linux 下的驅動程式。所以目前 Linux 下的驅動程式部分已內建在 Kernel 內,且許多的驅動程式並非由周邊開發原廠提供。

^ back on top ^





1.3 學習Linux的態度~一沙一世界的恆河沙

某天佛陀考弟子數學;<金剛經>記載這一有趣的沙等恆河〞數學題 :
<金剛經>曰:「須菩提!如恆河中所有沙數,如是沙等恆河,於意云何?是諸恆河沙寧為多不?」

翻為白話為「須菩提! 恆河中所有沙的數量,每顆沙粒又代表一條恆河,沙共有多少?沙多不多?」(〝沙等恆河〞意思為〝和沙同等數量的恆河〞)

翻為數學為「須菩提! 恆河沙的數量 x 恆河沙的數量 =多少顆沙? 多不多?」

佛陀的數學難題兩千年後另一神祇〝谷歌大神〞算出了答案,在 Google 輸入「恆河沙 * 恆河沙」google 竟算出答案為 「1.0 x 10104」。

Google 解了個問題帶來更多的問題,〝谷歌大神〞怎知恆河沙數=1052 而 不是 1040 或是 1020 ?反正也無從反證,對人來說 1020 已是無限, 1040 也是無限,1052 還是無限。

好比說如我欠了別人 1 億和欠別人 10 億或 100 億是一樣的,死豬不怕熱水燙反正我都還不起,只能雙手一攤擺爛。

回到佛陀的考題:「恆河沙數 x 恆河沙數」以數學來解為 ∞ x ∞ = ∞, 所以恆河沙數 x 恆河沙數=恆河沙數(無限 x 無限還是等於無限);故〝沙等恆河沙〞=〝恆河沙〞。

恆河沙又和 Linux 有什麼關係? 常有人說「源碼之前了無秘密」,Linux 雖號稱開源(Open Source)但卻滿是秘密,有開源=沒開源,因所釋出的原始碼=恆河沙數。

Torvalds 剛釋出 Kernel 只有約 10,000 行的原始碼,後經各路英雄共同努力,只能用日進千里來形容。以 2005 年釋出的 Kernel 版本 2.6.12 來說,有近七百萬行的原始碼,四年後的版本 2.6.30 更暴增到一千多萬行的原始碼。

下表為 Linux Kernel 版本和原始碼的行數 (資料來源 The Linux Foundation:http://www.linuxfoundation.org)

Kernel version source line of code
Kernel Version Files Lines Release Date
(YY/MM/DD)
2.6.12  17,360 6,777,860 2005/05/17
2.6.13 18,090 6,988,800 2005/08/28
2.6.14  18,434 7,143,233 2005/10/27
2.6.15 18,811 7,290,070 2006/01/02
2.6.16  19,251 7,480,062 2006/03/19
2.6.17 19,553 7,588,014 2006/06/17
2.6.18  20,208 7,752,846 2006/09/19
2.6.19 20,936 7,976,221 2006/11/29
2.6.20 21,280 8,102,533 2007/02/04
2.6.21  21,614 8,246,517 2007/04/25
2.6.22 22,411 8,499,410 2007/07/08
2.6.23  22,530 8,566,606 2007/10/09
2.6.24  23,062 8,859,683 2008/01/24
2.6.25 23,813 9,232,592 2008/04/16
2.6.26 24,273 9,411,841 2008/07/13
2.6.27 24,356 9,630,074 2008/10/09
2.6.28  25,276 10,118,757 2008/12/24
2.6.29 26,702 10,934,554 2009/03/23
2.6.30 27,911 11,560,971 2009/06/09

不管 Linux 的原始碼七百萬行或一千多萬行對一般人來說都是無限, Linux 恆河沙數的原始碼,代表擁有沙等恆河的能力和複雜度。

佛陀
故意問〝解空第一〞的弟子須菩提〝沙等恆河〞無限的數學題,應是測試須菩提可否把無窮〝解空〞,不要被無量的恆河沙數所〝著相〞。

<莊子-養生主>說「吾生(命)也有涯,而知(識)也無涯,以有涯隨無涯,殆已」(以有限的生命去追求無限的知識是不可能的.不要被無量無數無邊的知識所〝著相〞)也可以套用在 Linux,「吾生也有涯,而 Linux 也無涯,以有涯隨無涯,殆已」。

所以對於想要學習研究 Linux 的人,窮其一生也無法了解所有的功能。故學習沙等恆河能力和複雜度的 Linux 態度應把〝沙等恆河〞改〝沙等於恆河〞;好好研究一粒沙等於了解整個恆河,研究一粒沙就好,一粒沙就是一個世界。

所以 user 可以選一兩個自己比較感興趣的項目開始,可先用 Linux 取代 Windows 來完成日常工作,或了解 Linux 網路 或 Shell Script,或 Kernel[註1.3]某個原理等。〝弱水三千只取一瓢〞,太貪心〝著相〞全部都想學可會〝溺水三千〞。

^ back on top ^




1.4 Linux已飛入尋常百姓家

歐盟 2011年根據分析網路流量來統計 PC 所使用的作業系統,Linux 市佔約 0.9% 而 Windows 壓倒性的佔 90% 如下表
(資料來源 http://www.atinternet.com/Default.aspx)
PC OS Market Share 2011
OS Share
Windows 89.60%
Mac OS 8.70%
Linux 0.90%
Other 0.80%

Linux 在 PC 上的市佔比起 Windows 少的可憐,那學 Linux 好像沒什麼用?換個競技場, Linux 可就逆轉勝。

根據〝世界超級電腦 500 強〞的統計,2010年世上最快速的超級電腦,前 500 強使用 Linux 作為其作業系統佔 91.8%,且前 30 名都是 Linux,而 Windows 在超級電腦只剩 3.8%,這也反應出 Linux/UNIX 在執行關鍵任務和多人多工和多 CPU 的環境比 Windows 強太多了。

下表為世界超級電腦 500 強,作業系統的市佔(資料來源 http://www.top500.org)
TOP500 OS Market Share 2010
OS Share
Linux 91.8%
UNIX 3.8%
Winodws 3.2%
Other 0.2%

或許超級電腦離我們太遠,一般人用不到。其實 Linux 就在你身邊,目前智慧手機(smartphone)的出貨量已超過 PC,而智慧手機的作業系統,可說是 Linux/UNIX 的天下。

Apple 的 iPhone 作業系統為 iOS 其實是 UNIX-like,hTC/Samsung 等智慧手機的 Android,更是直接用 Linux 的 Kernel 2.6.x 來打造。在這領域 Microsoft 的 Windows Mobile 是少的可悲的 7%, Linux 不再躺在超級電腦裡,已飛入尋常百姓家。

下表為智慧手機作業系統的市佔
(資料來源www.nielsen.com )
Share of worldwide 2011 Q3 smartphone by OS
OS Share
Android 40%
Apple iPhone iOS 32%
RIM 11%
Windows Mobile 7%
Other 3%
Unknow 7%

Last updated at June 23 2015
Linux 發行版 Ubuntu 把 Microsoft 長期壟斷市佔列為天字第一號 Bug,因行動裝置的掘起,Linux 的市佔已超過 Windows,因此 2013 五月 Ubuntu 公告此天字一號 Bug 已修正無誤[註1.4]


^ back on top ^





1.5 閱讀前的準備~聊八卦談〝是〞,〝非〞

因基礎篇的內容基準,是假設想學習 Linux 的讀者不一定有電腦或資訊等相關科系的背景,故有些電腦常用的單位,名詞有必要說明一下,說明之前聊一下八卦是非。

位元 (bit)
什麼是位元(bit)?位元就是八卦的〝爻〞,而爻有兩種即〝- -〞(陰)和〝〞(陽)。故一個 bit 只有兩種狀態〝陰〞和〝陽〞,〝是〞與〝非〞。而電腦的電子訊號〝陰〞和〝陽〞習慣中用〝0〞和〝1〞表示,而 bit 就是電腦最小的儲存單位;可儲存〝0〞或〝1〞。

CPU 內部一個〝爻〞,即 bit 實作是一個半導體的邏輯閘(Logic gate),故越多 bit 的 CPU 製造的成本越高。

位元組 (byte)
〝爻〞或 bit 的單位太小,只能用來儲存或計算答案為〝0〞(非)或〝1〞(是)的是非題,如果要儲存或計算選擇題要如何做? 用兩個以上的 bit 來組合即可,沒錯八卦和電腦就是用同一方法,八卦用三個爻組成一個〝卦象〞一字排開 共八個(23=8),所以就可儲存或計算選項 8 以內的選擇題。

而電腦是用 8 個 bit 組成一個〝位元組〞(byte)。一個 byte 可表示 28 共 256種 (一個 byte 可能的組合有00000001,00000010,00000011,00000100...11111111共 256 種,超級無聊時,自行組合看看)。

Bit 一般用小寫的〝b〞表示, Byte 用大寫的〝B〞代表,例如 USB 2.0 規格是每秒最高可傳輸 60MB/S (是大寫的〝B〞代表 byte) ,但廠商常會〝美化〞規格故意用 bit 寫成 480Mb/S, 另外如不寫出〝b〞或〝B〞一般指的是 byte, 例如一檔案大小為 100k,是指 100kB(yte)。

另外 bit 數也是評估電腦運算能力的基準,通常以 CPU 內部通用〝暫存器〞(Register) 的寬度來代表其 CPU 的 bit 數,(暫存器可把想像為人的手指,用來計算或儲存資料,如手指愈多計算時越方便)以八卦來說三個爻組成一個卦,計算能力只能算到 23=8,超過 8 就會〝溢位〞。溢位時要用另一個爻或卦來代表〝進位〞(例如用十個手指算超過數字 10 時,就要用到腳指或別人的手指來代表進位),太常進位就會影響到運算的速度。所以電腦如用八卦的 3-bit 來設計 CPU 並不實用(因日常的應用,很容易超過 8)。最便宜且可用的 CPU 是 4-bit(可儲存或計算到 24=16),4-bit 的 CPU 常用於如電子錶,玩具,電視遙控器等簡易的控制。

一般來說 CPU 的 bit 數越多〝理論上〞計算時因較不會因溢位而浪費借位的時間故速度會較快。


二進制(binary)
許多 Linux 指令參數是用二進制(如權限的數字表示法,或指令 echo $((2#101010)) )故了解一下二進制是學電腦工程的基本馬步。

人有十個手指,故習慣用〝十進制〞(Decimal),但電腦可沒十指,電腦最小的儲存單位 bit 只有〝0〞或〝1〞兩種狀態,超過 2 就要進位,故稱〝二進制〞(Binary)。

電腦內部都是二進制在運算,但二進制對人來說是又臭又長,例如有一個 byte 的二進制數值 11100110 對人才講實在不易馬上理解其大小和換算,而電腦又看不懂十進制,故時常採折衷的〝十六進制〞(Hexadecimal)。而十六進制的目地是用〝對人類比較容易理解和換算的方式來表示二進制〞。

<表1.1> 為 0~255(一個 byte 的寬度)十進制/二進制/十六進制對照表。

十進制
(decimal)
二進制
(binary)
十六進制
(hexadecimal)
0 0000 0000 00
1 0000 0001 01
2 0000 0010 02
3 0000 0011 03
4 0000 0100 04
5 0000 0101 05
6 0000 0110 06
7 0000 0111 07
8 0000 1000 08
9 0000 1001 09
10 0000 1010 0A
11 0000 1011 0B
12 0000 1100 0C
13 0000 1101 0D
14 0000 1110 0E
15 0000 1111 0F
16 0001 0000 10
17 0001 0001 11
18 0001 0010 12
19 到 253 中間略
254 1111 1110 FE
255 1111 1111 FF
<表1.1>

至於之間如何轉換?說明之前先講解一下二進制/十進制/十六進制之間表示法的潛規則,計算機科學中常用〝下標+進制〞來表示目前是那種進制。

例如 230(DEC)=E6(HEX)=11100110(BIN)意思是十進制 230 = 十六進制的 E6 = 二進制的 11100110.而如果沒特別下標注明也是十進制。因是潛規則沒強制,故下例用法都有人用。

230=E6(HEX)=11100110(BIN)
230=E6(H)=11100110(B)
230(10)=E6(16)=11100110(2)
230=E6(HEX)=11100110(BIN)

另外二進制對人來說實在太長了,常會 4-bit 一組來書寫,如下例:
230=E6(H)=1110   0110(B) ASCII code
有一 byte = 65 是代表什麼意思呢?答案是「不一定」,byte 的內容要代表什麼完全看應用程式而定,如用來表示〝字元〞(Character)那麼 65 =〝A〞。當然你自己寫的應用也可以自行定義為 65 =〝Z〞但這樣一來就天下大亂。為了〝書同文,車同軌〞故都延用〝美國資訊交換標準碼〞ASCII(American Standard Code for Information Interchange),ASCII 是用一個 byte 來代表〝字元〞或〝輸出的控制〞;因一個 byte 只能儲存 0~255 的數值,明顯不夠用來儲存中文,故儲存中文不管是用 big5 或 UTF-8 或其他編碼就要用兩個 byte 以上來編碼。

linux 指令常會用到〝字元輸出〞,故了解 ASCII 有其必要,才不會不知所以然。ASCII 的編碼需要時再去查表即可,不用故意去記,其編碼原則大致如下:

ASCII 0~31,127:控制字元(輸出的控制),如換行,退格等控制,而控制字元一般並不會有任何字元輸出在螢幕,但可能影響下個字元輸出的位置。
ASCII 32~47,58~64,91~96,123~126:常用的符號,如 +、-、*、/ 等。
ASCII 48~57:數字 0~9。
ASCII 65~90:大寫英文字母 A~Z。
ASCII 97~122:小寫英文字母 a~z。

ASCII code 另一個意義為可約知道一個檔案有多少個字,因一個 byte 表示一個英文字元或符號字元,如一個純文字檔大小有 1KB,表示約有 1000 個字元或符號。

下表為 ASCII table (資料來源 http://www.asciitabl)
Dec Hex 縮寫 Linux 常用的表示方式 名稱/意義 Dec Hex 顯示字元 Dec Hex 顯示字元 Dec Hex 顯示字元
0 0 NUL   空字元(Null) 20 (空格) 65 41 A 98 62 b
1 1 SOH   標題開始 (start of heading) 33 21 ! 66 42 B 99 63 c
2 2 STX   本文開始 (star of text)   34 22 " 67 43 C 100 64 d
3 3 ETX   本文結束 (end of text) 35 23 #   68 44 D   101 65 e
4 4 EOT   傳輸結束 (end of transmission) 36 24 $ 69 45 E 102 66 f
5 5 ENQ   請求 (enquiry) 37 25 % 70 46 F 103 67 g
6 6 ACK   請求確認 (acknowledge) 38 26 & 71 47 G 104 68 h
7 7 BEL \a 響鈴 (bell) 39 27 ' 72 48 H 105 69 i
8 8 BS \b 退格 (backspace) 40 28 ( 73 49 I 106 6A j
9 9 TAB \t 水平定位 (horizontal tab) 41 29 ) 74 4A J 107 6B k
10 0A LF \n 換行 (line feed,new line) 42 2A * 75 4B K 108 6C l
11 0B VT \v 垂直定位 (vertical tab) 43 2B + 76 4C L 109 6D m
12 0C FF \f 換頁 (NP form feed, new page) 44 2C , 77 4D M 110 6E n
13 0D CR \r 回車 (carriage return) 45 2D - 78 4E N 111 6F o
14 0E SO   移出(Shift out) 46 2E . 79 4F O 112 70 p
15 0F SI   移入(Shift in) 47 2F / 80 50 P 113 71 q
16 10 DLE   跳出資料連結 (data link escape) 48 30 0 81 51 Q 114 72 r
17 11 DC1   設備控制一(device ctrl. 1)
(XON 啟用軟體速度控制)
49 31 1 82 52 R 115 73 s
18 12 DC2   設備控制二 (device ctrl. 2) 50 32 2 83 53 S 116 74 t
19 13 DC3   設備控制三 (device ctrl. 3)
(XOFF 停用軟體速度控制)
51 33 3 84 54 T 117 75 u
20 14 DC4   設備控制四 (device ctrl. 4) 52 34 4 85 55 U 118 76 v
21 15 NAK   失敗確認 (negative ack.) 53 35 5 86 56 V 119 77 w
22 16 SYN   暫停同步 (syn. idle) 54 36 6 87 57 W 120 78 x
23 17 ETB   結束區塊傳輸 (end of trans. block) 55 37 7 88 58 X 121 79 y
24 18 CAN   取消 (cancel) 56 38 8 89 59 Y 122 7A z
25 19 EM   媒介中斷 (end of medium) 57 39 9 90 5A Z 123 7B {
26 1A SUB   替換 (substitute) 58 3A : 91 5B [ 124 7C |
27 1B ESC   結束 (escape) 59 3B ; 92 5C \ 125 7D }
28 1C FS   檔案分割 (file separator) 60 3C < 93 5D ] 126 7E ~
29 1D GS   群組分隔 (group separator) 61 3D = 94 5E ^ 127 7F DEL
(不會顯示)
30 1E RS   記錄分隔 (record separator) 62 3E > 95 5F _
31 1F US   單元分隔 (unit separator) 63 3F ? 96 60 `
127 7F DEL   刪除 (delete)   64 40 @ 97 61 a

機械碼(Machine code)
ASCII中有講到「byte 的內容要代表什麼完全看應用程式而定」,如果此內容存放的是 CPU 的指令就是〝機械碼〞(Machine code),也叫〝二進制檔〞(Binary Code),或是叫〝執行檔〞(Executable)。以下為某程式的 Machine code片段:

01001000 01001001 01010011(BIN)
應可了解為什麼叫 Binary Code (都是零和壹)和 Machine code (真的只有機械才看的懂)。一般 Machine code 會寫成十六進制比較容易閱讀,如下 :
48 49 53(HEX)
因 Machine code 大部分是 CPU 的指令,代表什麼指令就要查 CPU 的手冊。例如 Intel 8086 CPU 上例( 48 49 53(HEX)) 機械碼的指令意義各為〝暫存器 AX-1〞、〝暫存器 CX-1〞和〝暫存器 BX 放進堆疊〞。

故由上例應可了解機械碼的特點: 原始碼 (Source Code)
機械碼幾乎是看不懂的天書,所以軟體開發人員會用人類比較易讀/寫的〝程式設計語言〞(Program Design Language,PDL)或叫〝高階語言〞(High-level programming language)來開發軟體。但高階語言本身卻不能執行,要再經〝編譯器〞(Compiler)把 PDL 編譯為電腦可執行的機械碼。

而用人類比較易讀/寫的〝程式設計語言〞所寫的軟體就是〝原始碼〞(Source Code)。通用的程式設計語言有 C、C++、Java等。

以下為某 C 語言程式 Source Code 片段:至少還有看的懂的英文單字,比只有 01 的 Machine code 親民多了。(這裡只是舉例,學 Linux 操作可不用看懂 C 語言)。
if (fp==NULL)
{
   printf ("The file %s can't be open",name);
   getch ();
   exit ();
}
和機械碼相反,原始碼的特點為:

^ back on top ^




1.6 認識 PC 常用的單位~K/Ki,M/Mi,G/Gi

複習一下小學的數學: 30x10=?, 30÷10=? 不經大腦肚臍想也知答案為 300 和 3,類似的小學數學給電腦去算,電腦也常用〝肚臍〞去想,但人和電腦殊途而造成結果會不一樣哦。

以上例 3x10 來說,最簡單不經大腦的算法是左移(rotate left)一位(下圖)

而如 x100 就左移二位, x1000 為左移三位依此類推。
而 ÷10 是右移(rotate right)一位, ÷100右移二位 ,÷1000 為右移三位依此類推。

因人的計算為十進制,故只有乘或除 10N 可以用左右移來算,且速度特別快又簡單,真的可以不經大腦用肚臍想。

而電腦為二進制,所以乘或除 2N 也可用左移右移來算哦。電腦剛發明時沒高階的程式設計語言 (C/C++/Java 等),而是直接輸入
機械碼或是比機械碼好不了多少的組合語言(Assembly language),但用這類低階程式語言來寫人類常用的乘或除 1000 可是要人命的。所以當時的軟體工程師也教電腦用〝不經大腦用肚臍〞的方法直接把要運算的數值位移。

原本也沒什麼不可,但問題是二進制的數值左/右移 10 次是乘/除 1024 不是 1000。 (自己左右位移算看看),此後人和電腦之間的單位就開始〝一國兩制,各自表述〞,我們的 1K=1000,電腦的 1K=1024。

但為了區別,其潛規則為電腦的 1K=1024 叫 Kilo binary(Kibi) 常用小寫〝Ki〞標示如下表:

<K v.s. Ki table>
K 103=1,000
M 106=1,000,000
G 109=1,000,000,000
T 1012=1,000,000,000,000
Kilo binarly (Ki)
Ki 210=1024
Mi 220=1024Ki=1,048,576
Gi 230=1024Mi=1,073,741,824
Ti 240=1024Gi=1,099,511,627,776

因是〝潛規則〞故 kilo binary 不一定會標示。例如你買了顆硬碟明明規格寫 500G,但電腦只顯示 480G(GiB) 左右,不要以為廠商規格灌水,而是人和電腦之間的單位是〝一國兩制,各自表述〞。


^ back on top ^











www.reliablecounter.com
digital mastering

[註 1.1]事實上 GNU 目前還在練自己的 Kernel 叫〝Hurd〞。

[註 1.2]出自老子十七章「 太上,下知有之;其次,親之豫之;其次,畏之侮之...成功事遂,百姓謂我自然。」
原意應是指由人民對執政者的感受分成四等;
〝下知有之〞如民主自由的國家,百姓只知有領導人的存在(下知有之),但不知其功能或做了什麼;
〝親而譽之〞如集權國家,人民要對領導人歌功頌德;
〝畏之、侮之〞怕或罵領導人就是暴政;
當執政者無為而治,順著自然作為,老百姓對於國君〝無感〞作渾然不覺,百姓安居樂業會說「我自己的功勞,我自然如此的」
一個成熟的作業系統,應也是要讓應用軟體〝無感〞,而「謂我自然。」

[註 1.2A]應用軟體如要求作業系統提供某功能時(如檔案存取等)主要透過〝系統呼叫 (System call) 和應用程式介面 (Application Programming Interface,API),而應用程式可不用管作業系統是如何達成的,例如應用程式要求記憶體的需求,作業系統就找記憶體給應用程式,而應用程式可不管如何生出來的。

[註 1.2B]嵌入式作業系統,一般指的是並不要求〝通用〞,而是強調〝量身定做〞,〝基於某一種特殊用途〞的作業系統,一般而言因可砍掉通用型作業系統因〝基於某一種特殊用途〞而用不到的功能,通常 Kernel 會小很多。

[註 1.2C]Library 不是獨立程式,而是提供應用軟體服務的。例如你寫的一個應用軟體需算數學的 log,但不用自己寫(可能也不會寫) log 的運算,只要呼叫數學相關的 Library 來用即可。

[註 1.3]至於對研究 Kernel 有興趣的讀者,不太建議由 Linux 開始。因太巨大了,由比較小的 Kernel 如 μC/OS-II (約只有 5,500 行的 source code) 或 Minux (1,0 版約有 1,2000 行的 source code),且這兩個 Kernel 的作者都各自有出書來講解 Kernel 運作的原理。

[註 1.4]資料來源〝Ubuntu Bug #1 Marked As Fixed By Mark Shuttleworth〞 http://www.webupd8.org/2013/05/ubuntu-bug-1-marked-as-fixed-by-mark.html