##軟件程序運作
鳥哥在上課時常常會開玩笑的問:『我們知道沒有插電的計算機是一堆廢鐵,那么插了電的計算機是什么?』 答案是:『一堆會電人的廢鐵』!這是因為沒有軟件的運作,計算機的功能就無從發揮之故。 就好像沒有了靈魂的軀體也不過就是行尸走肉,重點在於軟件/靈魂羅!所以底下咱們就得要了解一下『軟件』是什么。
一般來說,目前的計算機系統將軟件分為兩大類,一個是系統軟件,一個是應用程序。但鳥哥認為我們還是得要了解一下什么是程序, 尤其是機器程序,了解了之后再來探討一下為什么現今的計算機系統需要『操作系統』這玩意兒呢!
****
###機器程序與編譯程序
我們前面談到計算機只認識0與1而已,而且計算機最重要的運算與邏輯判斷是在CPU內部, 而CPU其實是具有微指令集的。因此,我們需要CPU幫忙工作時,就得要參考微指令集的內容, 然后撰寫讓CPU讀的懂得指令碼給CPU執行,這樣就能夠讓CPU運作了。
不過這樣的流程有幾個很麻煩的地方,包括:
- 需要了解機器語言:機器只認識0與1,因此你必須要學習直接寫給機器看的語言! 這個地方相當的難呢!
- 需要了解所有硬件的相關功能函數:因為你的程序必須要寫給機器看, 當然你就得要參考機器本身的功能,然后針對該功能去撰寫程序碼。例如,你要讓DVD影片能夠放映, 那就得要參考DVD光驅的硬件信息才行。萬一你的系統有比較冷門的硬件,光是參考技術手冊可能會昏倒~
- 程序不具有可攜性:每個CPU都有獨特的微指令集,同樣的,每個硬件都有其功能函數。 因此,你為A計算機寫的程序,理論上是沒有辦法在B計算機上面運作的!而且程序碼的修改非常困難! 因為是機器碼,并不是人類看的懂得程序語言啊!
- 程序具有專一性:因為這樣的程序必須要針對硬件功能函數來撰寫, 如果已經開發了一支瀏覽器程序,想要再開發檔案管理程序時,還是得從頭再參考硬件的功能函數來繼續撰寫, 每天都在和『硬件』挑戰!可能需要天天喝蠻牛了!@_@
那怎么解決啊?為了解決這個問題,計算機科學家設計出一種讓人類看的懂得程序語言, 然后創造一種『編譯器』來將這些人類能夠寫的程序語言轉譯成為機器能看懂得機器碼, 如此一來我們修改與撰寫程序就變的容易多了!目前常見的編譯器有C, C++, Java, Fortran等等。 機器語言與高階程序語言的差別如下所示:
<center>

圖4.1.1、編譯器的角色
</center>
從上面的圖示我們可以看到高階程序語言的程序碼是很容易察看的!鳥哥已經將程序碼(英文)寫成中文說~ 這樣比較好理解啦!所以這樣已經將程序的修改問題處理完畢了。 問題是,在這樣的環境底下我們還是得要考量整體的硬件系統來設計程序喔!
舉例來說,當你需要將運作的數據寫入內存中,你就得要自行分配一個內存區塊出來讓自己的數據能夠填上去, 所以你還得要了解到內存的位址是如何定位的,啊!眼淚還是不知不覺的流了下來... 怎么寫程序這么麻煩啊!
為了要克服硬件方面老是需要重復撰寫控制碼的問題,所以就有操作系統(Operating System, OS)的出現了! 什么是操作系統呢?底下就來談一談先!
###操作系統
***
如同前面提到的,在早期想要讓計算機執行程序就得要參考一堆硬件功能函數,并且學習機器語言才能夠撰寫程序。 同時每次寫程序時都必須要重新改寫,因為硬件與軟件功能不見得都一致之故。那如果我能夠將所有的硬件都驅動, 并且提供一個發展軟件的參考介面來給工程師開發軟件的話,那發展軟件不就變的非常的簡單了?那就是操作系統啦!
***
- **操作系統核心(Kernel)**
>操作系統(Operating System, OS)其實也是一組程序, 這組程序的重點在於管理計算機的所有活動以及驅動系統中的所有硬件。 我們剛剛談到計算機沒有軟件只是一堆廢鐵,那么操作系統的功能就是讓CPU可以開始判斷邏輯與運算數值、 讓主內存可以開始載入/讀出數據與程序碼、讓硬盤可以開始被存取、讓網絡卡可以開始傳輸數據、 讓所有周邊可以開始運轉等等。總之,硬件的所有動作都必須要透過這個操作系統來達成就是了。
>上述的功能就是操作系統的核心(Kernel)了!你的計算機能不能做到某些事情,都與核心有關! 只有核心有提供的功能,你的計算機系統才能幫你完成!舉例來說,你的核心并不支持TCP/IP的網絡協定, 那么無論你購買了什么樣的網卡,這個核心都無法提供網絡能力的!
>但是單有核心我們使用者也不知道能作啥事的~因為核心主要在管控硬件與提供相關的能力(例如網絡功能), 這些管理的動作是非常的重要的,如果使用者能夠直接使用到核心的話,萬一使用者不小心將核心程序停止或破壞, 將會導致整個系統的崩潰!因此核心程序所放置到內存當中的區塊是受保護的! 并且開機后就一直常駐在內存當中。
<center class="m-tips">
**Tips:**所以整部系統只有核心的話,我們就只能看著已經準備好運作(Ready)的計算機系統,但無法操作他! 好像有點望梅止渴的那種感覺啦!這個時候就需要軟件的幫忙了!
;
</center>
****
- **系統呼叫(System Call)**
>既然我的硬件都是由核心管理,那么如果我想要開發軟件的話,自然就得要去參考這個核心的相關功能! 唔!如此一來不是從原本的參考硬件函數變成參考核心功能,還是很麻煩啊!有沒有更簡單的方法啊!
>為了解決這個問題,操作系統通常會提供一整組的開發介面給工程師來開發軟件! 工程師只要遵守該開發介面那就很容易開發軟件了!舉例來說,我們學習C程序語言只要參考C程序語言的函式即可, 不需要再去考量其他核心的相關功能,因為核心的系統呼叫介面會主動的將C程序語言的相關語法轉成核心可以了解的任務函數, 那核心自然就能夠順利運作該程序了!
>如果我們將整個計算機系統的相關軟/硬件繪制成圖的話,他的關系有點像這樣:
<center>

</center>
計算機系統主要由硬件構成,然后核心程序主要在管理硬件,提供合理的計算機系統資源分配(包括CPU資源、內存使用資源等等), 因此只要硬件不同(如x86架構與RISC架構的CPU),核心就得要進行修改才行。 而由於核心只會進行計算機系統的資源分配,所以在上頭還需要有應用程序的提供,使用者才能夠操作系統的。
為了保護核心,并且讓程序設計師比較容易開發軟件,因此操作系統除了核心程序之外,通常還會提供一整組開發介面, 那就是系統呼叫層。軟件開發工程師只要遵循公認的系統呼叫參數來開發軟件,該軟件就能夠在該核心上頭運作。 所以你可以發現,軟件與核心有比較大的關系,與硬件關系則不大!硬件也與核心有比較大的關系! 至於與使用者有關的,那就是應用程序啦!
<center class="m-tip">
**Tips:**
在定義上,只要能夠讓計算機硬件正確無誤的運作,那就算是操作系統了。所以說, 操作系統其實就是核心與其提供的介面工具,不過就如同上面講的,因為最簡單的核心缺乏了與使用者溝通的親和介面, 所以在目前,一般我們提到的『操作系統』都會包含核心與相關的使用者應用軟件呢!

</center>
簡單的說,上面的圖示可以帶給我們底下的概念:
- 操作系統的核心層直接參考硬件規格寫成, 所以同一個操作系統程序不能夠在不一樣的硬件架構下運作。舉例來說,個人計算機版的Windows XP不能直接在RISC架構的計算機下運作。 所以您知道為何Windows XP又分為32位及64位的版本了吧?因為32/64位的CPU指令集不太相同, 所以當然要設計不同的操作系統版本了。
- 操作系統只是在管理整個硬件資源,包括CPU、內存、輸入輸出裝置及檔案系統檔。 如果沒有其他的應用程序輔助,操作系統只能讓計算機主機準備妥當(Ready)而已!并無法運作其他功能。 所以你現在知道為何Windows XP上面要達成網頁影像的運作還需要類似PhotoImpact或Photoshop之類的軟件安裝了吧?
- 應用程序的開發都是參考操作系統提供的開發介面, 所以該應用程序只能在該操作系統上面運作而已,不可以在其他操作系統上面運作的。 現在您知道為何去購買線上游戲的光盤時,光盤上面會明明白白的寫著該軟件適合用於哪一種操作系統上了吧? 也該知道某些游戲為何不能夠在Linux上面安裝了吧?
****
- **核心功能**
- 既然核心主要是在負責整個計算機系統相關的資源分配與管理,那我們知道其實整部計算機系統最重要的就是CPU與主內存, 因此,核心至少也要有這些功能的:
- 系統呼叫介面(System call interface)
剛剛談過了,這是為了方便程序開發者可以輕易的透過與核心的溝通,將硬件的資源進一步的利用, 於是需要有這個簡易的介面來方便程序開發者。
- 程序管理(Process control)
總有聽過所謂的『多工環境』吧?一部計算機可能同時間有很多的工作跑到CPU等待運算處理, 核心這個時候必須要能夠控制這些工作,讓CPU的資源作有效的分配才行!另外, 良好的CPU排程機制(就是CPU先運作那個工作的排列順序)將會有效的加快整體系統效能呢!
- 內存管理(Memory management)
控制整個系統的內存管理,這個內存控制是非常重要的,因為系統所有的程序碼與數據都必須要先存放在內存當中。 通常核心會提供虛擬內存的功能,當內存不足時可以提供內存置換(swap)的功能哩。
- 檔案系統管理(Filesystem management)
檔案系統的管理,例如數據的輸入輸出(I/O)等等的工作啦!還有不同檔案格式的支持啦等等, 如果你的核心不認識某個檔案系統,那么您將無法使用該檔案格式的檔案羅!例如:Windows 98就不認識NTFS檔案格式的硬盤;
- 裝置的驅動(Device drivers)
就如同上面提到的,硬件的管理是核心的主要工作之一,當然羅,裝置的驅動程序就是核心需要做的事情啦! 好在目前都有所謂的『可載入模組』功能,可以將驅動程序編輯成模組,就不需要重新的編譯核心啦! 這個也會在后續的第二十章當中提到的!
<center>
**Tips:**
事實上,驅動程序的提供應該是硬件廠商的事情!硬件廠商要推出硬件時,應該要自行參考操作系統的驅動程序開發介面, 開發完畢后將該驅動程序連同硬件一同販賣給使用者才對!舉例來說,當你購買顯示卡時, 顯示卡包裝盒都會附上一片光盤,讓你可以在進入Windows之后進行驅動程序的安裝啊!

</center>
****
- **操作系統與驅動程序**
----
老實說,驅動程序可以說是操作系統里面相當重要的一環了!不過,硬件可是持續在進步當中的! 包括主機板、顯示卡、硬盤等等。那么比較晚推出的較新的硬件,例如顯示卡,我們的操作系統當然就不認識羅! 那操作系統該如何驅動這塊新的顯示卡?為了克服這個問題,操作系統通常會提供一個開發介面給硬件開發商, 讓他們可以根據這個介面設計可以驅動他們硬件的『驅動程序』,如此一來,只要使用者安裝驅動程序后, 自然就可以在他們的操作系統上面驅動這塊顯示卡了。
<center>

圖4.2.2、驅動程序與操作系統的關系
</center>
由上圖我們可以得到幾個小重點:
- 操作系統必須要能夠驅動硬件,如此應用程序才能夠使用該硬件功能;
- 一般來說,操作系統會提供開發介面,讓開發商制作他們的驅動程序;
- 要使用新硬件功能,必須要安裝廠商提供的驅動程序才行;
- 驅動程序是由廠商提供的,與操作系統開發者無關。
所以,如果你想要在某個操作系統上面安裝一張新的顯示卡,那么請要求該硬件廠商提供適當的驅動程序吧! ^_^! 為什么要強調『適當的驅動程序』呢? 因為驅動程序仍然是依據操作系統而開發的, 所以,給Windows用的驅動程序當然不能使用於Linux的環境下了。
----
##應用程序
應用程序是參考操作系統提供的開發介面所開發出來軟件,這些軟件可以讓使用者操作,以達到某些計算機的功能利用。 舉例來說,辦公室軟件(Office)主要是用來讓使用者辦公用的;影像處理軟件主要是讓使用者用來處理影音數據的; 瀏覽器軟件主要是讓使用者用來上網瀏覽用的等等。
需要注意的是,應用程序是與操作系統有關系的,如同上面的圖示當中的說明喔。因此,如果你想要購買新軟件, 請務必參考軟件上面的說明,看看該軟件是否能夠支持你的操作系統啊!舉例來說,如果你想要購買線上游戲光盤, 務必參考一下該光盤是否支持你的操作系統,例如是否支持Windows XP/Windows Vista/MAC/Linux等等。 不要購買了才發現該軟件無法安裝在你的操作系統上喔!
我們拿常見的微軟公司的產品來說明。你知道Windows XP, Office 2007之間的關系了嗎?
- Windows XP是一套操作系統,他必須先安裝到個人計算機上面,否則計算機無法開機運作;
- Windows 98與Windows XP是兩套不同的操作系統,所以能在Win 98上安裝的軟件不見得可在WinXP上安裝;
- Windows XP安裝好后,就只能擁有很少的功能,并沒有辦公室軟件;
- Office 2007是一套應用程序,要安裝前必須要了解他能在哪些操作系統上面運作。
- 第一部份 Linux 的規劃與安裝
- 第零章 計算機概論
- 1. 計算機:輔助人腦的好工具
- 2. 個人計算機架構與周邊設備
- 3. 數據表示方式
- 4. 軟件程序運作
- 5. 重點回顧、本章習題、參考數據與延伸閱讀
- 第一章 Linux是什么
- 1. Linux是什么
- 2. Torvalds的Linux發展
- 3. Linux的特色
- 4. 重點回顧、本章習題、參考數據與延伸閱讀
- 第二章 Linux如何學習
- 1. Linux當前的應用角色
- 2. 鳥哥的Linux苦難經驗全都錄
- 3. 有心朝Linux作業系統學習者的學習態度
- 4. 鳥哥的建議(重點在solution的學習)
- 5. 重點回顧、本章習題、參考數據與延伸閱讀
- 第三章 主機規劃與磁盤分區
- 1. Linux與硬件的搭配
- 2. 磁盤分區
- 3. 安裝Linux前的規劃
- 4. 重點回顧、本章習題、參考數據與延伸閱讀
- 第四章 安裝CentOS 5.x 與多重引導技巧
- 1. 本練習機的規劃--尤其是分割參數
- 2. 開始安裝CentOS 5
- 3. 安裝后的首次設定
- 4. 多重開機安裝流程與技巧
- 5. 關於大硬盤導致無法開機的問題
- 6. 重點回顧、本章習題、參考數據與延伸閱讀
- 第五章 首次登陸與 在線求助 man page
- 1. 首次登陸系統
- 2. 文本模式下命令的下達
- 3. Linux系統的在線求助man page與info page
- 4. 超簡單文書編輯器: nano
- 5. 正確的關機方法:sync,shutdown
- 6. 啟動過程的問題排解
- 7. 重點回顧、本章習題、參考數據與延伸閱讀
- 第二部分 Linux 文件、目錄與磁盤格式
- 第六章 Linux文件權限與 目錄配置
- 1. 使用者與群組
- 2. Linux文件權限概念
- 3. Linux目錄配置
- 4. 重點回顧、本章習題、參考數據與延伸閱讀
- 第七章 Linux文件與目錄管理
- 1. 目錄與路徑
- 2. 文件與目錄管理
- 3. 文件內容查閱
- 4. 文件與目錄的默認權限與隱藏權限
- 5. 命令與文件的搜尋:
- 6. 極重要!權限與命令間的關系:
- 7. 重點回顧、本章習題、參考數據與延伸閱讀
- 第八章 Linux 磁盤與 文件系統管理
- 1. 認識 EXT2 文件系統
- 2. 文件系統的簡單操作
- 3. 磁盤的分割、格式化、檢驗與掛載
- 4. 配置啟動掛載:
- 5. 內存置換空間(swap)之建置:
- 6. 文件系統的特殊觀察與操作
- 7. 重點回顧、本章習題、參考數據與延伸閱讀
- 第九章 文件的壓縮與打包
- 1. 壓縮文件的用途與技術
- 2. Linux 系統常見的壓縮命令
- 3. 打包命令:
- 4. 完整備份工具:dump
- 5. 光盤寫入工具
- 6. 其他常見的壓縮與備份工具
- 7. 重點回顧、本章習題、參考數據與延伸閱讀
- 第三部分:學習 Shell 與 Shell scripts
- 第十章 vim程序編輯器
- 1. 為何要學 vim
- 2. vi 的使用
- 3. vim 的額外功能
- 4. 其他 vim 使用注意事項
- 5. 重點回顧、本章習題、參考數據與延伸閱讀
- 第十一章 認識與學習 BASH
- 1. 認識 BASH 這個 Shell
- 2. Shell 的變量功能
- 3. 命令別名與歷史命令
- 4. Bash shell 的操作環境
- 5. 數據流重導向 (Redirection)
- 6. 管線命令 (pipe)
- 7. 重點回顧、本章習題、參考數據與延伸閱讀
- 第十二章 正規表示法與 文件格式化處理
- 1. 前言: 什么是正規表示法
- 2. 基礎正規表示法
- 3. 延伸正規表示法
- 4. 文件的格式化與相關處理
- 5. 重點回顧、本章習題、參考數據與延伸閱讀
- 第十三章 學習 shell scripts
- 1. 什么是 Shell Script
- 2. 簡單的 shell script 練習
- 3. 善用判斷式
- 4. 條件判斷式
- 5. 回圈 (loop)
- 6. shell script 的追蹤與 debug
- 7. 重點回顧、本章習題、參考數據與延伸閱讀
- 第四部分:Linux 使用者管理
- 第十四章 Linux 賬號管理與 ACL 權限控制
- 1. Linux 的賬號與群組
- 2. 賬號管理
- 3. 主機的細部權限規劃:ACL 的使用
- 4. 使用者身份切換
- 5. 使用者的特殊 shell 與 PAM 模塊
- 6. Linux 主機上的用戶信息傳遞
- 7. 手動新增使用者
- 8. 重點回顧、本章習題、參考數據與延伸閱讀
- 第十五章 磁盤配額(Quota)與 進階文件系統管理
- 1. 磁碟配額 (Quota) 的應用與實作
- 2. 軟件磁盤陣列 (Software RAID)
- 3. 邏輯卷軸管理員 (Logical Volume Manager)
- 4. 重點回顧、本章習題、參考數據與延伸閱讀
- 第十六章 例行性工作排程 (crontab)
- 1. 什么是例行性工作排程
- 2. 僅運行一次的工作排程
- 3. 循環運行的例行性工作排程
- 4. 可喚醒停機期間的工作任務
- 5. 重點回顧、本章習題、參考數據與延伸閱讀
- 第十七章 程序管理與 SELinux 初探
- 1. 什么是程序 (Process)
- 2. 工作管理 (job control)
- 3. 程序管理
- 4. 特殊文件與程序
- 5. SELinux 初探
- 6. 重點回顧、本章習題、參考數據與延伸閱讀
- 第五部分:Linux 系統管理員
- 第十八章 認識系統服務 (daemon)
- 1. 什么是 daemon 與服務 (service)
- 2. 解析 super daemon 的配置文件
- 3. 服務的防火墻管理 xinetd, TCP Wrappers
- 4. 系統開啟的服務
- 5. 重點回顧、本章習題、參考數據與延伸閱讀
- 第十九章 認識與分析登錄檔
- 1. 什么是登錄文件
- 2. syslogd :記錄登錄文件的服務
- 3. 登錄文件的輪替 (logrotate)
- 4. 分析登錄文件
- 5. 本章習題練習、針對本文的建議
- 第二十章 啟動流程、模塊管理 與 loader
- 1. Linux 的啟動流程分析
- 2. 核心與核心模塊
- 3. Boot loader: Grub
- 4. 啟動過程的問題解決
- 5. 重點回顧、本章習題、參考數據與延伸閱讀
- 第二十一章 系統配置工具(網絡與 打印機)與硬件偵測
- 1. CentOS 系統配置工具: setup
- 2. 利用 CUPS 配置 Linux 打印機
- 3. 硬件數據收集與驅動,及 lm_sensors
- 4. 重點回顧、本章習題、參考數據與延伸閱讀
- 第二十二章 軟件安裝: 原始碼與 Tarball
- 1. 開放源碼的軟件安裝與升級簡介
- 2. 使用傳統程序語言進行編譯的簡單范例
- 3. 用 make 進行巨集編譯
- 4. Tarball 的管理與建議
- 5. 函式庫管理
- 6. 檢驗軟件的正確性
- 7. 重點回顧、本章習題、參考數據與延伸閱讀
- 第二十三章 軟件安裝:RPM, SRPM 與 YUM 功能
- 1. 軟件管理員簡介
- 2. RPM 軟件管理程序: rpm
- 3. SRPM 的使用: rpmbuild
- 4. YUM 線上升級機制
- 5. 管理的抉擇:RPM 還是 Tarball
- 6. 重點回顧、本章習題、參考數據與延伸閱讀
- 第二十四章 X Window 配置介紹
- 1. 什么是 X Window System
- 2. X Server 配置檔解析與配置
- 3. 顯卡驅動程序安裝范例
- 4. 重點回顧、本章習題、參考數據與延伸閱讀
- 第二十五章 Linux 備份策略
- 1. 備份要點
- 2. 備份的種類、頻率與工具的選擇
- 3. VBird 的備份策略與 scripts
- 4. 災難復原的考量
- 5. 重點回顧、本章習題、參考數據與延伸閱讀
- 第二十六章 核心編譯
- 1. 編譯前的任務:認識核心與取得核心原始碼
- 2. 核心編譯的前處理與核心功能選擇
- 3. 核心的編譯與安裝
- 4. 額外(單一)核心模塊編譯
- 5. 重點回顧、本章習題、參考數據與延伸閱讀