第二章 軟件基礎(chǔ)
程序是執(zhí)行某個(gè)特定任務(wù)的計(jì)算機(jī)指令集合 。程序可以用多種程序語(yǔ)言來(lái)編寫(xiě):從低級(jí)計(jì)算機(jī)語(yǔ)言-匯編語(yǔ)言到高級(jí)的、與機(jī)器本身無(wú)關(guān)的語(yǔ)言入C程序語(yǔ)言 。操作系統(tǒng)是一個(gè)允許用戶運(yùn)行如電子表格或者字處理軟件等應(yīng)用程序的特殊程序 。本章將介紹程序設(shè)計(jì)的基本原則,同時(shí)給出操作系統(tǒng)設(shè)計(jì)目標(biāo)與功能的概述 。
2.1 計(jì)算機(jī)編程語(yǔ)言
2.1.1 匯編語(yǔ)言
那些CPU從主存讀取出來(lái)執(zhí)行的指令對(duì)人類來(lái)說(shuō)是根本不可理解的 。它們是告訴計(jì)算機(jī)如何準(zhǔn)確動(dòng)作的機(jī)器代碼 。在Intel 80486指令中16進(jìn)制數(shù)0x89E5表示將ESP寄存器的內(nèi)容拷入EBP寄存器 。為最早的計(jì)算機(jī)設(shè)計(jì)的工具之一就是匯編器,它可以將人們可以理解的源文件匯編成機(jī)器代碼 。匯編語(yǔ)言需要顯式的操作寄存器和數(shù)據(jù),并且與特定處理器相關(guān) 。比如說(shuō)Intel X86微處理器的匯編語(yǔ)言與Alpha AXP微處理器的匯編語(yǔ)言決然不同 。以下是一段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
第一行語(yǔ)句將寄存器15所指示的地址中的值加載到寄存器16中 。接下來(lái)將鄰接單元內(nèi)容加載到寄存器17中 。第三行語(yǔ)句比較寄存器16和寄存器17中的值,如果相等則跳轉(zhuǎn)到標(biāo)號(hào)100處,否則繼續(xù)執(zhí)行第四行語(yǔ)句:將 寄存器17的內(nèi)容存入內(nèi)存中 。如果寄存器中值相等則無(wú)須保存 。匯編級(jí)程序一般冗長(zhǎng)并且很難編寫(xiě),同時(shí)還容易出錯(cuò) 。Linux核心中只有很少一部分是用匯編語(yǔ)言編寫(xiě),并且這些都是為了提高效率或者是需要兼容不同的CPU 。
2.1.2 C編程語(yǔ)言和編譯器
用匯編語(yǔ)言編寫(xiě)程序是一件困難且耗時(shí)的工作 。同時(shí)還容易出錯(cuò)并且程序不可移植:只能在某一特定處理器 家族上運(yùn)行 。而用C語(yǔ)言這樣的與具體機(jī)器無(wú)關(guān)的語(yǔ)言就要好得多 。C程序語(yǔ)言允許用它所提供的邏輯算法來(lái) 描敘程序同時(shí)它提供編譯器工具將C程序轉(zhuǎn)換成匯編語(yǔ)言并最終產(chǎn)生機(jī)器相關(guān)代碼 。好的編譯器能產(chǎn)生和匯編語(yǔ)言程序相接近的效率 。Linux內(nèi)核中大部分用C語(yǔ)言來(lái)編寫(xiě),以下是一段C語(yǔ)言片段:
if (x != y)
x = y ;
它所執(zhí)行的任務(wù)和匯編語(yǔ)言代碼示例中相同 。如果變量X的值和變量Y的不相同則將Y的內(nèi)容賦予X 。C代碼被 組織成子程序,單獨(dú)執(zhí)行某一任務(wù) 。子程序可以返回由C支持的任何數(shù)據(jù)類型的值 。較龐大的程序如Linux 核心由許多單獨(dú)的C源代碼模塊組成,每個(gè)模塊有其自身的子程序與數(shù)據(jù)結(jié)構(gòu) 。這些C源代碼模塊將相關(guān)函數(shù)組合起來(lái)完成如文件處理等功能 。C支持許多類型的變量,變量是一個(gè)通過(guò)符號(hào)名稱引用的內(nèi)存位置 。在以上的例子中,X和Y都是內(nèi)存中的位置 。程序員并不關(guān)心變量放在什么地方,這些工作由連接程序來(lái)完成 。有些變量包含不同類型的數(shù)據(jù),整數(shù)和浮點(diǎn)數(shù),以及指針 。指針是那些包含其他數(shù)據(jù)內(nèi)存位置或者地址的變量 。假設(shè)有變量X,位于內(nèi)存地址0x80010000處 。你可以使用指針變量px來(lái)指向X,則px的值為0x80010000 。C語(yǔ)言允許相關(guān)變量組合起來(lái)形成數(shù)據(jù)結(jié)構(gòu),例如:
struct {
int i ;
char b ;
} my_struct ;
這是一個(gè)叫做my_struct的結(jié)構(gòu),它包含兩個(gè)元素,一個(gè)是32位的整數(shù)i,另外一個(gè)是8位的字符b 。
2.1.3 連接程序
連接程序是一個(gè)將幾個(gè)目標(biāo)模塊和庫(kù)過(guò)程連接起來(lái)形成單一程序的應(yīng)用 。目標(biāo)模塊是從匯編器或者編譯器中產(chǎn)生的機(jī)器代碼,它包含可執(zhí)行代碼和數(shù)據(jù),模塊結(jié)合在一起形成程序 。例如一個(gè)模塊可能包含程序中所有的數(shù)據(jù)庫(kù)函數(shù)而另一個(gè)主要處理命令行參數(shù) 。連接程序修改目標(biāo)模塊之間的引用關(guān)系,使得在某一模塊中引用的數(shù)據(jù)或者子程序的確存在于其他模塊中 。Linux核心是由許多目標(biāo)模塊連接形成的龐大程序 。
推薦閱讀
- 認(rèn)識(shí)Linux操作系統(tǒng)下三大便利開(kāi)源防火墻
- 如何在Linux中設(shè)置磁盤(pán)限額?
- Linux下的各種備份方法匯總
- Linux 內(nèi)核解讀入門(mén)
- linux使用經(jīng)驗(yàn)點(diǎn)滴
- 安裝 Linux 無(wú)盤(pán)工作站
- FONTS Linux中的字型設(shè)定
- 在Linux中限制用戶空間
- 深 入Linux 的LILO
- Linux中IP隧道的分析與建議
