歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

linux bible 第二章 軟件基礎

  第二章 軟件基礎 程序是執行某個特定任務的計算機指令集合。程序可以用多種程序語言來編寫:從 低級計算機語言-匯編語言到高級的、與機器本身無關的語言入C程序語言。操作系 統是一個允許用戶運行如電子表格或者字處理軟件等應用程序的特殊程序。本章將 介紹程序設計的基本原則,同時給出操作系統設計目標與功能的概述。 2.1 計算機編程語言 2.1.1 匯編語言 那些CPU從主存讀取出來執行的指令對人類來說是根本不可理解的。它們是告訴計算 機如何准確動作的機器代碼。在Intel 80486指令中16進制數0x89E5表示將ESP寄存 器的內容拷入EBP寄存器。為最早的計算機設計的工具之一就是匯編器,它可以將人 們可以理解的源文件匯編成機器代碼。匯編語言需要顯式的操作寄存器和數據,並 且與特定處理器相關。比如說Intel X86微處理器的匯編語言與Alpha AXP微處理器 的匯編語言決然不同。以下是一段Alpha AXP匯編指令程序: ldr r16, (r15) ; Line 1 ldr r17, 4(r15) ; Line 2 beq r16,r17,100 ; Line 3 str r17, (r15) ; Line 4 100: ; Line 5 第一行語句將寄存器15所指示的地址中的值加載到寄存器16中。接下來將鄰接單元內 容加載到寄存器17中。第三行語句比較寄存器16和寄存器17中的值,如果相等則跳轉 到標號100處,否則繼續執行第四行語句:將寄存器17的內容存入內存中。如果寄存器 中值相等則無須保存。匯編級程序一般冗長並且很難編寫,同時還容易出錯。Linux核 心中只有很少一部分是用匯編語言編寫,並且這些都是為了提高效率或者是需要兼容 不同的CPU。 2.1.2 C編程語言和編譯器 用匯編語言編寫程序是一件困難且耗時的工作。同時還容易出錯並且程序不可移植: 只能在某一特定處理器家族上運行。而用C語言這樣的與具體機器無關的語言就要好得 多。C程序語言允許用它所提供的邏輯算法來描敘程序同時它提供編譯器工具將C程序 轉換成匯編語言並最終產生機器相關代碼。好的編譯器能產生和匯編語言程序相接近 的效率。Linux內核中大部分用C語言來編寫,以下是一段C語言片段: if (x != y) x = y ; 它所執行的任務和匯編語言代碼示例中相同。如果變量X的值和變量Y的不相同則將Y 的內容賦予X。C代碼被組織成子程序,單獨執行某一任務。子程序可以返回由C支持 的任何數據類型的值。較龐大的程序如Linux核心由許多單獨的C源代碼模塊組成,每 個模塊有其自身的子程序與數據結構。這些C源代碼模塊將相關函數組合起來完成如 文件處理等功能。C支持許多類型的變量,變量是一個通過符號名稱引用的內存位置。 在以上的例子中,X和Y都是內存中的位置。程序員並不關心變量放在什麼地方,這些 工作由連接程序來完成。有些變量包含不同類型的數據,整數和浮點數,以及指針。 指針是那些包含其他數據內存位置或者地址的變量。假設有變量X,位於內存地址 0x80010000處。你可以使用指針變量px來指向X,則px的值為0x80010000。C語言允 許相關變量組合起來形成數據結構,例如: strUCt { int i ; char b ; } my_struct ; 這是一個叫做my_struct的結構,它包含兩個元素,一個是32位的整數i,另外一個是 8位的字符b。 2.1.3 連接程序 連接程序是一個將幾個目標模塊和庫過程連接起來形成單一程序的應用。目標模塊是 從匯編器或者編譯器中產生的機器代碼,它包含可執行代碼和數據,模塊結合在一起 形成程序。例如一個模塊可能包含程序中所有的數據庫函數而另一個主要處理命令行 參數。連接程序修改目標模塊之間的引用關系,使得在某一模塊中引用的數據或者子


程序的確存在於其他模塊中。Linux核心是由許多目標模塊連接形成的龐大程序。 2.2 操作系統概念 如果沒有軟件,計算機只不過是一堆發熱的電子器件。如果將硬件比做計算機的心髒 則軟件就是它的靈魂。操作系統是一組系統程序的集合,它提供給用戶運行應用軟件 的功能。操作系統對系統硬件進行抽象,它提供給系統用戶一台虛擬的機器。大多數 PC可以運行一種或者多種操作系統,每個操作系統都有不同的外觀。Linux由許多獨 立的功能段組成。比如Linux內核,如果沒有庫函數和外殼程序,內核是沒有什麼用的。 為了理解操作系統到底是什麼,思考一下當你敲入一個簡單命令時,系統中發生了什麼: $ ls Mail c images perl docs tcl $ $符號是由用戶登錄外殼(這裡指Bash)提供的提示符。它表示正在等待用戶敲入一些命 令。敲入ls命令,首先鍵盤驅動程序識別出敲入的內容。然後鍵盤驅動將它們傳遞給 外殼程序,由外殼程序來負責查找同名的可執行程序(ls)。 如果在/bin/ls目錄中找到了ls,則調用核心服務將ls的可執行映象讀入虛擬內存並開 始執行。ls調用核心的文件子系統來尋找那些文件是可用的。文件系統使用緩沖過的 文件系統信息,或者調用磁盤設備驅動從磁盤上讀取信息。當然ls還可能引起網絡驅 動程序和遠程機器來交換信息以找出關於系統要訪問的遠程文件系統信息(文件系統可 以通過網絡文件系統或者NFS進行遠程安裝)。當得到這些信息後,ls將這些信息通過 調用視頻驅動寫到顯示器屏幕上。 以上這些聽起來十分復雜。這個非常簡單命令的處理過程告訴我們操作系統是一組協 同工作的函數的集合,它們給所有的用戶對系統有一致的印象。 2.2.1 內存管理 由於資源的有限,比如內存,操作系統處理事務的過程看起來十分冗長。操作系統的 一個基本功能就是使一個只有少量物理內存的系統工作起來象有多得多的內存一樣。 這個大內存叫為虛擬內存。其思想就是欺騙系統中運行的軟件,讓它們認為有大量內 存可用。系統將內存劃分成易於處理的頁面,在系統運行時將這些頁面交換到硬盤上 去。由於有另外一個技巧:多處理的存在,這些軟件更加感覺不到系統中真實內存的 大小。 2.2.2 進程 進程可以認為是處於執行狀態的程序,每個進程有一個特定的程序實體。觀察以下 Linux系統中的進程,你會發現有比你想象的要多得多的進程存在。比如,在我的系 統中敲入ps命令,將得到以下結果: $ ps PID TTY STAT TIME COMMAND 158 pRe 1 0:00 -bash 174 pRe 1 0:00 sh /usr/X11R6/bin/startx 175 pRe 1 0:00 xinit /usr/X11R6/lib/X11/xinit/xinitrc -- 178 pRe 1 N 0:00 bowman 182 pRe 1 N 0:01 rxvt -geometry 120x35 -fg white -bg black 184 pRe 1 < 0:00 xclock -bg grey -geometry -1500-1500 -padding 0 185 pRe 1 < 0:00 xload -bg grey -geometry -0-0 -label xload 187 pp6 1 9:26 /bin/bash 202 pRe 1 N 0:00 rxvt -geometry 120x35 -fg white -bg black 203 ppc 2 0:00 /bin/bash 1796 pRe 1 N 0:00 rxvt -geometry 120x35 -fg white -bg black 1797 v06 1 0:00 /bin/bash 3056 pp6 3 < 0:02 emacs intro/introduction.tex 3270 pp6 3 0:00 ps $ 如果系統有許多個CPU,則每個進程可以運行在不同的CPU上。不幸的是,大多數系 統中只有一個CPU。這樣操作系統將輪流運行幾個程序以產生它們在同時運行的假 象。這種方式叫時間片輪轉。同時這種方法還騙過了進程使它們都認為只有自己在 運行。進程之間被隔離開,以便某個進程崩潰或者誤操作不會影響到別的進程。操 作系統通過為每個進程提供分立的地址空間來作到這一點。 2.2.3 設備驅動 設備驅動組成了Linux核心的主要部分。象操作系統的其他部分一樣,它們運行在 高權限環境中且一旦出錯將引起災難性後果。設備驅動控制操作系統和硬件設備 之間的相互操作。例如當文件系統通過使用通用塊設備接口來對IDE磁盤寫入數據 塊。設備驅動負責處理所有設備相關細節。設備驅動與特定的控制器芯片有關, 如果系統中有一個NCR810 SCSI控制卡則需要有NCR810 SCSI的驅動程序。 2.2.4 文件系統 Linux和Unix一樣,系統中的獨立文件系統不是通過設備標志符來訪問,而是通過 表示文件系統的層次樹結構來訪問。當Linux添加一個新的文件系統到系統中時,

會將它mount到一個目錄下,比如說/mnt/cdrom。 Linux的一個重要特征就是支持多種文件系統。這使得它非常靈活並且可與其他操 作系統並存。Linux中最常用的文件系統是EXT2文件系統,它在大多數Linux分發版 本中都得到了支持。 文件系統提供給用戶一個關於系統的硬盤上文件和目錄的總體映象,而不管文件的 類型和底層物理設備的特性。 Linux透明地支持多種文件系統並將當前安裝的所有文件和文件系統集成到虛擬文 件系統中去。所以,用戶和進程一般都不知道某個文件位於哪種文件系統中,他們 只是使用它。 塊



作系統並存。Linux中最常用的文件系統是EXT2文件系統,它在大多數Linux分發版 本中都得到了支持。 文件系統提供給用戶一個關於系統的硬盤上文件和目錄的總體映象,而不管文件的 類型和底層物理設備的特性。 Linux透明地支持多種文件系統並將當前安裝的所有文件和文件系統集成到虛擬文 件系統中去。所以,用戶和進程一般都不知道某個文件位於哪種文件系統中,他們 只是使用它。 塊



Copyright © Linux教程網 All Rights Reserved