天天看點

03 作業系統基礎

僅為個人學習備忘,友善日後查閱

一、程式的執行過程

  計算機本身就是一堆硬體,其中最核心的就是 CPU 和記憶體。為了實作計算機獲得資料,資料的輸入輸出,需要輸入裝置和輸出裝置。在計算機體系内部,一般來講,輸入輸出裝置是通過南橋接入目前系統的。

  對于一個簡單的PC機而言,在某一個時刻隻能運作一個程式。但是計算機的計算能力很強,一個程式運作程式内容所占用的 CPU 的時間不是特别多。為了能夠盡可能地利用計算機的計算能力,需要将計算機同時運作多個程式,是以每個程式運作起來以後需要一個協調器,這個協調程式我們把它稱為叫作業系統。作業系統還包含許多其它程式,此處稱為核心 kernel 更合理一點。核心本身就負責管理硬體資源,并且将硬體資源虛拟成其他樣子,提供給上層所需要的應用程式。

  如果一個程式可以直接運作在硬體上,這個程式本身就可以控制硬體的各種屬性。其他程式要想運作在硬體上,這些程式之間可能會産生幹擾,一個惡意的應用程式可能會導緻其他應用程式通通退出。是以需要一個統一的資源管理者,任何應用程式要想使用硬體,必須通過核心來完成。

  核心也不會允許程式直接通路硬體,它是将硬體所提供的運算能力,通過一個一個地系統調用來實作的。

  系統調用是非常底層的應用,程式員要想根據系統調用來程式設計會非常麻煩,非常煩瑣,而且許多程式之間的功能是相同的。比如word需要列印,excel也需要列印,如果都自己開發,計算機上大量的功能是重複的,這種重複勢必會額外地占用空間。從資源的組織角度來講也不合理。是以作業系統除了提供核心以外,還将核心所提供的一些系統調用輸出出來,這種輸出是通過高層一點的調用接口來實作,這種接口我們把它稱為庫。

  庫本身也是應用程式,隻不過這個應用程式沒有程式的執行入口,它是不能自我獨立運作的。隻能被其他程式調用的時候執行。

  程式員不使用庫,直接在核心上程式設計也可以,隻不過比較麻煩而已。是以調用除了系統調用以外,還有庫調用(library call)。庫對于一個作業系統,或核心而言,稱為應用程式設計接口,API。

  在庫的上層就是應用程式,這個應用程式很可能直接運作在系統調用上,核心上,也有可能是通過庫調用來完成。隻不過使用庫調用程式設計起來可能會更簡單,但使用核心調用,它的執行效率可能會更高,因為至少不用使用庫來完成了,而且它獲得的操作權限也可能會更大。

  無論有多少個應用程式,這些程式在操縱系統啟動的時候,這個程式未必會運作起來,隻不過說操縱系統啟動以後,這些程式隻是具備了運作條件,或者說已經有了運作環境,但它并沒有運作。

  通常啟動一個程式的方式有多種。比如說,作業系統一啟動,這個程式就自動啟動起來。比如裝完一個幹淨的作業系統,點開程序管理器,裡面也有很多程序。這些程序是随系統的啟動而啟動的。這些程序有些可以稱為服務,或背景服務。作業系統為了自身的運作,或完整的能力,啟動一些程式才能讓作業系統提供一個基本的功能。

  有些是按需啟動,比如需要編輯一個word文檔的時候,才需要啟動 word 。不然開機windows ,自動啟動word,沒有任何意義。這種程式需要手動啟動,稱為互動式程式。

03 作業系統基礎

  敲了一下鍵盤之後,資訊一定是由 CPU 先接收的,通過中斷先到達CPU。CPU并不知道敲鍵盤這個資訊意味着什麼。能夠跟硬體互動的隻有核心,CPU在拿到這個資訊以後,先通知核心來處理,核心會知道這個指令是由哪個程序發起來的。整個系統資源的監控,包括上層所運作的應用的監控都是由核心來完成的。核心會知道到底哪個程序處于目前焦點程序,而負責接收這樣一個快捷鍵,或鍵的組合,由核心再轉交給應用程式來完成。

二、隔離機制

 作業系統本身也是一個程式,它也需要運作,就需要有指令和資料,而指令和資料是放在記憶體中的。那就意味着在記憶體當中既有核心,還有其他的應用程式。如果一個惡意的應用程式,能夠直接通路核心,能夠修改核心中的某些資料的話,意味着系統的穩定性将無從得到保證。是以必須有一種機制,能夠将應用程式和核心隔離開來。

  通常情況下,比如像intel這類的平台上,會提供所謂的保護機制,或保護模式。一般CPU有四個級别,是同心圓的四個環。最内層,稱為0級别,或第0環,也稱為特權級别。隻有核心才能運作在特權模式下。而其他應用程式隻能運作在最外層級别。中間兩層沒用。是以任何時候,應用程式是不能通路記憶體當中處于0級别的記憶體區域的。

  CPU跟記憶體彼此之間是緊密結合的。CPU的0級别,會映射到記憶體中處于保護的某一段當中。

03 作業系統基礎

  記憶體分為三段。

  最底層的一段為BIOS的映射程式,POST加電自檢之後,BIOS就自動映射到記憶體的開端之處。

  然後載入作業系統核心。kernel space

  再後面的空間被多個應用程式所共享。

03 作業系統基礎

  但是,這樣去劃分記憶體,非常容易産生記憶體碎片。

三、shell

shell 是整個作業系統的外殼,是能夠實作接收使用者指令,了解使用者的指令,并且将它傳輸給核心,由核心指揮某個應用程式啟動的這麼一個界面。

GUI: Graphical User Interface 圖形界面的 shell 

CLI: command-line interface 指令行接口

無論是 GUI 還是 CLI 也是應用程式,是以在不同的作業系統上,它們可能有提供的不同的替換版本。

linux 常見的有三種圖形界面,gnome,kde,xface

windows 上隻有一種,而且是無法替換的。 windows 2008之前 shell 是直接做進核心的,無法替換。windows 2008 提供了 power shell 這樣的接口,也可以不用使用圖形界面了。

而對CLI而講,DOS 本身就是指令行,而linux 的 shell 就有很多。

GUI 和 CLI 也是應用程式,而且在這個接口下所啟動的任何應用程式,如果把GUI 或 CLI 關閉,那在這個接口下所啟動的應用程式也會關閉。比如将 windows 桌面登出了,那啟動的 word 也會退出。

四、核心的功能

程序管理

記憶體管理

檔案系統

網絡功能

硬體驅動

安全機制

五、作業系統曆史

  1. 批處理系統

  是現代作業系統的前身。當時沒有作業系統的前提下,我們的每一個程式都是直接在硬體上運作的,表現為一個一個的作業。

作業一執行完了,它會自動地載入第二個作業,彼此之間使用分隔符分開。

   jobs1$$$$$$$$$$$jobs2$$$$$$$$$$$$

第一個程式執行完了,再執行第二個程式。這是遠遠無法發揮出我們硬體的功能的。

2. Multics

  這時有是三個組織,GE (通用電氣),美國的電報電話公司(AT & T)的 Bell 實驗室,以及麻省理工大學 MIT 的人工智能實驗室,聯合起來研發比批處理進階的 多任務、多使用者的系統。使用彙編語言來開發出來适用于大型機 MainFrame ,能夠支援多任務和多使用者的系統,稱為 Multics.

  這時它們已經完成了基本的功能,GE 首先退出,然後 Bell 退出,留下 MIT 研發。

3. Unix 

  Bell 大概 1970 年退出,當時為了研發招收的科學家就空閑起來了。 其中就包括 ken 。

Ken Thompson:  

  Space Travel  使用 VGA 圖形卡。當時隻能運作在 Multics 上。由于 Bell 退出,Ken 無法再免費使用 Multics 

70年代,主要生産計算機的公司除了 IBM 還有 DEC.

DEC:

  PDP  系列 ,當時最新是 PDP-11

  VAX  系列 -- vms

  Space Travel 是應用程式。應用程式要運作起來,必須依賴核心。Ken 利用 PDP-7 憑借它對 Multic的了解,開發出一個簡單的核心來運作他的 Space Travel ,後來成功了。他在 Bell 實驗室到處推銷他的遊戲。但是大家對他的遊戲不感興趣,倒是對他的系統感興趣。

  應用程式是用彙編開發的,彙編是跟硬體平台緊密結合的。PDP-7 上開發的應用程式想運作在其他系統上不可以。是以Ken 重新移植到其他主機系列上。成功後,它的系統風靡 Bell 實驗室。後來他的同僚戲谑地稱他的系統為 Unics 。因為系統功能非常簡單,相對于 Multi 是以叫 Uni 。後來改為 Unix 。

Dennis Ritchie:

  這時 Unix 都是使用彙編研發的,性能不錯,但移植困難。為了能夠扭轉這種劣勢,Dennis 希望使用進階語言重新開發 Unix 。這樣隻要使用不同的編譯器,在不同的平台版本上編譯,就能完成 Unix 的移植。因為進階語言對底層的硬體依賴程度是非常低的。

  Dennis 對 B 語言引入了變量、位址等,開發了 C 語言。在當時,進階語言的運作效率比低級語言至少要低 30% 。

  1974年,Dennis 和 Ken 在計算機通信雜志發表 Unix 論文。Bell 屬于 AT & T 。根據反壟斷法,AT & T 不能銷售除了電報電話以外的任何商品,不但不能出售,别人要還得給,無償提供。計算機年會,當别人索要Unix的時候,他們不得以,隻好無償提供。

Bill Jey:

 成立了 BSRG ,伯克利作業系統研究小組。

 1976年,Ken到美國加州大學伯克利分校任教。 此前,伯克利就獲得了 Unix 源代碼進行研究。

 TCP協定的擁塞控制等功能都誕生在 BSRG Unix 這個版本上。

BSD: Berkely System Distribution 伯克利系統發行版

 融合了各種功能,Bill Jey 将 Unix 對外釋出,并改名 BSD 。開始賣錢,牟利甚多,引起貝爾實驗室不滿。

System: 貝爾實驗室的 Unix 版本.

 後來貝爾實驗室被賣給了 Novell,從此不再受 AT & T不能銷售作業系統的限制。分拆出來以後,迫不及待賣錢,一個授權 4萬美元。到底誰是正統,誰該賣,誰不該賣,跟 BSD 打官司打了十年。

Microsoft: 81年,在美國西雅圖一個小公司,Microsoft 成立

  IBM 、康柏公司 開始生産 PC 機。

  任何計算機沒有作業系統沒法用。而 Unix 當時隻能運作在PDP系列上。Unix 始終沒有往 PC 相容機上移植。當時PDP用的是摩托羅拉公司的M68K CPU。而 PC 機用的都是 Intel 的 8086,8088 ,80286.

 當時Intel語言界面醜陋,性能很差,Unix 程式員不屑于把Unix運作在PC機上去 。

CP/M

  買一個PC大概2-3萬美元,買一個CP/M大概也要3萬美元。

  微軟三個人賣 Basic 編譯器,包裝發型 Unix ,起名 Xenix。

  Bob 朋友花4個星期,仿照 CP/M寫了一個作業系統。比爾蓋茨一手托兩家,5萬美元從小程式員買斷作業系統,轉手賣給 IBM 授權。買斷後,敲敲打打,改名 DOS 。

  DOS:Disk Operating System,單使用者,單任務。

  PC機賣出上百萬台,DOS獲得千萬美元利潤。

jobs:

 這種好的現狀,自從另外三個年輕人,創立了另外一家公司以後就破滅了。

 喬布斯非常崇拜計算機科學之父圖靈。圖靈吃了抹了×××的蘋果死去。是以喬布斯的公司命名蘋果。

 喬布斯在apple1上裝的是 Unix,界面比DOS好。cpu用的不是 x86,而是 Power. 

Xerox: 施樂公司,生産影印機。

   PARK實驗室:在 Unix基礎上,研究出了第一個滑鼠,第一個圖形操作界面。喬布斯溜進實驗室,發現這個研究成果。找到公司,買走拷貝。組織團隊研發,apple2 發型的時候,圖形界面已經出現。

   這對比爾蓋茨是當頭一棒,DOS還有誰要,于是接近喬布斯,從喬布斯這裡騙走一份拷貝。當喬布斯發現的時候,比爾蓋茨已經将他的系統重命名為 Windows 。(基于DOS開發)

  喬布斯系統是封閉的,不單賣,要買機器一塊買。Windows 隻賣許可證。

FreeBSD: 世界上第一個能運作在PC機上的正統 Unix 。

OpenBSD: 專注于安全

NetBSD: 專注于服務

  迄今為止,蘋果的Unix的核心都是 FreeBSD 的核心。

Sun Microsystem: Bill Jey 聯合另外兩個人成立。

  生産工作站,比小型機要輕量級,但性能不差,有自己獨立的作業系統。

  Sun OS --> 為了避免官司,由BSD 轉而使用貝爾實驗室的 Unix,改名 Solaris .正統 Unix 。隻能運作在Sun 自己的硬體 SPARK 上。

  Bill Jey 還引入了 CSH,相容 C語言風格的 shell 。

Windows 95,98本身基于DOS,DOS本身就是夢魇。

Windows NT: (new technology)DEC 生産的VAX使用 vms作業系統。比爾蓋茨引入vms,在vms基礎上開        發。核心不再是 DOS,而是 vms

六、Linux

Andrew: 

   當Unix開始賣錢之後,很多科研機構就不能再免費使用 Unix了。于是荷蘭的 Andrew 仿照 Unix 開發 Minix ,上課用。

   有一年到芬蘭赫爾辛基上課。Mixnix 是開發在教授自己的主機上的,很多地方是用彙編語言寫的。是以他的學生要學習 Minix,裝在自己的主機上,不得不自己開發驅動程式。

Linus: 自己寫了個系統,叫 Linux 。

80年代,Stallman, 倡導軟體自由。

GNU: GNU is Not Unix 。遞歸縮寫。

GPL: General Public License  自由

  Emacs: 文本編輯器

  gcc: GNU C Compiler ,轉成二進制

  bash

Linux: 隻是一個核心。它不是應用程式,它沒有庫,庫在 Linux叫 glibc .gcc 是編譯器。

ABI: Applicaiton Binary Interface

  編譯必須要兩個平台完全一樣,意味着編譯之後期望它能在 x86機器上運作,那就必須在 x86 上進行編譯。否則,編譯出來的程式隻能在目前CPU上運作,拿到其他主機上運作不了。

  交叉編譯:在A機器上編譯,拿到B機器上運作。盡管都是二進制,都是 Intel 的 CPU,在酷睿上編譯的程式,不一定能奔騰在上運作,因為 CPU 支援的二進制格式各不相同。

GNU/Linux: 完整的作業系統,GNU還提供很多外圍軟體。

  無論 GNU 的軟體,還是 Linux 的核心,都是源代碼,是 c 開發的程式。任何程式要運作,得編譯成二進制。編譯成 01代碼,計算機才能識别,計算機才能運作。

Linux 通過源代碼的方式向全球的使用者來釋出,誰來負責編譯呢?

第三方組織,負責編譯 Linux 核心,和各種外圍應用程式。并将它們做成打包發行成可安裝的便捷的這種方式的Linux,直接做成二進制向外打包釋出。

Linux 發行商:release

本身都不是Linux的擁有者,隻負責将源代碼格式的Linux,在通用平台上編譯成通用格式,使得其他人拿到以後可以在大多數硬體平台上安裝并使用。

SLS: 91年

Debian: 92年。唯一沒有商業公司支援。進階使用者中流行

Red Hat : 93 年成立于北卡羅來納州。北美、中國流行

SUSE:被 Novell (Netware)收購了。SUSE前身 SLS。歐洲流行

Ubuntu: 基于 Debian 的二次發行版。界面漂亮,主要基于PC機使用。

Mint: 基于 Ubuntu 二次發行,更漂亮

核心由Linus維護,軟體由GNU組織維護,發行商隻負責包裝發行,隻是在包裝發行過程中,加入了自己對于一個操縱系統的了解,加入了自己對于某些參數的調整,加入了自己公司的 LOGO,使得 Linux 看起來各不相同。事實上,核心一樣,軟體一樣,可能配置檔案不一樣而已。

包管理器:

Linux 有核心,GNU提供軟體,打包發行的時候不能把所有軟體都裝上去。早期軟體都是打包在一塊進行安裝的。這不便于軟體包的單個管理。

Debian: dpt

Red Hat: rpm

這些系統它們本身都遵循 GPL,就算是紅帽把它做成了二進制格式,但它也要把它的軟體包的源碼格式公布出來,因為 GPL 有這種規定。

GPL: 任何人,當你擷取GPL組織的軟體程式以後,無論你怎麼改,改完以後必須要把你改的内容也一并    公布出來,不公布你就侵權。它們主要是為了保證軟體自由的。

   是以GPL就像病毒一樣,任何人都不敢沾它。假如軟體有20行,我借鑒了10行,後來又開發了一萬    行,那這一萬行必須得公開。

LGPL: Lesser GPL 

GPL v2

GPL v3

GPL 是非常嚴格的

其他開源協定:

BSD

Apache

BSD 和 Apache 要寬松得多。

開源:開放源代碼

自由:

  自由擷取,自由修改,自由學習

Linux 是GPL的,是以紅帽發行的時候,要釋出兩種版本,一種是包裝好的二進制格式,一種是釋出源代碼格式的。

Windows賣的是版權,Red Hat 賣的是服務。

CentOS: Community Enterprise Operating System

     紅帽隻要釋出源程式,CentOS,就把它做成二進制,而且跟紅帽一模一樣。

     紅帽是紅帽公司的注冊商标,是以改名叫 CentOS,圖表不一樣,LOGO不一樣,但是程式格式是      完全相容的。但是 CentOS 不提供服務保證。

     國内用的最多。

Fedora: 紅帽開始發行個人版,到9.0 ,在2003年終止,後來捐獻給 Fedora。

     Fedora 再測試穩定以後,會引入後續的紅帽企業版。

Mandriva: 桌面

Linux是核心,是核心就有版本,0.1, 1.0, 2.0,...

官方站點 https://www.kernel.org/  

RHEL: 3.0, 4.0, 5.0, 6.0 紅帽發行版的版本

七、Linux 基本原則 

  1. 由目的單一的小程式組成。Linux 是由小程式組成的,每一個程式都非常小。體積非常小,目的非常單一。組合小程式,完成複雜任務。
  2. 一切皆檔案。所有東西都儲存為檔案格式,甚至連裝置的通路入口都儲存為檔案。
  3. 盡量避免捕獲使用者接口。盡量少跟使用者進行互動。一般而言,使用者啟動一個程序之後,使用者不需要再輸入任何資訊。
  4. 配置檔案儲存為純文字格式。

GUI接口:輕按兩下

CLI接口:執行指令,給出執行檔案的路徑。

  指令提示符:(給你一個提示符,在這個符号後面可以輸入指令) prompt bash

    兩種不同的展現形式:

      # :root 管理者

      $ : 普通使用者

    Linux 跟 windows 不同,使用者類别非常簡單,就兩類,管理者,普通使用者。

  指令:shell本身就是指令行接口,當我們輸入指令以後,這個指令會被 shell 送給核心,由核心判       斷這個指令是否具有執行權限,還包括從什麼地方開始執行(任何程式要想執行必須得有執行       入口)。

  指令格式: 通常由三部分組成。

    指令 選項 參數

  選項:

    短選項: -

      多個選項可以組合: -a -b = -ab

    長選項: --

      長選項不能組合,必須要分開來寫。

  參數: 指令的作用對象

使用者的登入和切換:

 su: switch user

 exit: 退回原來的選項

# su [-l] 使用者名 : [] 内表示可省略的

修改密碼

# passwd

密碼複雜性規則:

  1. 數字,大寫字母,小寫字母,特殊字元,四種中選三種

  2. 至少7位

  3. 随機字元串

  4. 定期更換

  5. 循環周期要足夠大: 盡量不要使用最近使用過的密碼

Linux 哲學思想之一,能簡寫絕不全寫。

Linux 嚴格區分大小寫

虛拟終端(terminal):

      在 VMware 中,ctrl + alt + F2 切換到另一個使用者,ctrl + alt + F1 又回來了,

      ctrl + alt + F3 又是一個新的使用者。

startx & : 啟動圖形界面, ctrl + alt + F1 切換回去。

GUI:

  Gnome: c 開發

  KDE: C++

  XFace: 嵌入式

CLI:

  sh

  csh

  zsh

繼續閱讀