版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
操作系統(tǒng)硬件基礎(chǔ)目錄1.處理器計(jì)算2.存儲(chǔ)系統(tǒng)3.中斷和時(shí)鐘本章學(xué)習(xí)要點(diǎn)1)了解處理器的基本結(jié)構(gòu)和執(zhí)行指令過(guò)程2)存儲(chǔ)器結(jié)構(gòu)和種類,以及堆棧的作用3)磁盤的結(jié)構(gòu)和使用方式4)掌握中斷的處理過(guò)程以及時(shí)鐘在系統(tǒng)中的作用2.1處理器計(jì)算計(jì)算機(jī)系統(tǒng)中最主要的兩類資源是計(jì)算資源和存儲(chǔ)資源。本節(jié)主要介紹計(jì)算機(jī)系統(tǒng)中的計(jì)算資源,包括處理器指令,尋址方式和寄存器。也就是簡(jiǎn)單的介紹在計(jì)算機(jī)中執(zhí)行指令的過(guò)程。2.1.1處理器指令計(jì)算機(jī)的所有操作都是由機(jī)器指令/計(jì)算機(jī)指令所決定的。每條計(jì)算機(jī)指令必須包含處理器執(zhí)行所需的信息:操作碼、源操作數(shù)、目的操作數(shù)和下一條指令地址。圖2-1給出了指令執(zhí)行步驟。圖2-1指令執(zhí)行步驟每條計(jì)算機(jī)指令必須包含處理器執(zhí)行所需的信息:操作碼、源操作數(shù)、目的操作數(shù)和下一條指令地址。操作碼代表了指令要完成的具體操作。操作碼分成幾類:數(shù)據(jù)傳遞、算術(shù)運(yùn)算、邏輯運(yùn)算、轉(zhuǎn)換、輸入輸出、系統(tǒng)控制和控制傳遞。源操作數(shù)是指具體操作所需的輸入,可以是一個(gè)也可以是多個(gè)。源操作數(shù)一般來(lái)源于寄存器、內(nèi)存。目的操作數(shù)是指具體操作的結(jié)果,可在寄存器或者內(nèi)存中。下一條指令地址給出了當(dāng)前這條指令執(zhí)行完成后去哪里取下一條指令。圖2-2給出了一個(gè)簡(jiǎn)單的處理器指令格式,還有很多其他類型的指令格式。在指令的執(zhí)行過(guò)程中,根據(jù)指令計(jì)數(shù)器給出的地址從內(nèi)存讀取一條指令到處理器相應(yīng)的指令寄存器中,處理器通過(guò)分析這條指令所包含的各個(gè)字段獲取操作數(shù),并執(zhí)行操作碼所指定的操作,最后將操作結(jié)果存入目的操作數(shù)當(dāng)中。同時(shí),在讀入這條指令后,指令計(jì)數(shù)器根據(jù)當(dāng)前指令所占存儲(chǔ)空間,自動(dòng)的指向下一條指令的地址。圖2-2一種簡(jiǎn)單的處理器指令格式因?yàn)闄C(jī)器指令都是由二進(jìn)制表示的,可讀性差。為了增強(qiáng)可讀性,機(jī)器指令一般采用指令符號(hào)表示。以下給出幾個(gè)簡(jiǎn)單的例子:ADD 加法操作SUB 減法操作MPY 乘法操作DIV 除法操作LOAD 從存儲(chǔ)器取數(shù)據(jù)操作STOR 將數(shù)據(jù)存儲(chǔ)到存儲(chǔ)器操作不但操作碼可以用符號(hào)表示,源操作數(shù)和目的操作數(shù)都可以用符號(hào)來(lái)表示。下面給出一個(gè)簡(jiǎn)單的例子:ADD R,Y這條指令包含以下幾個(gè)含義:有兩個(gè)源操作數(shù),一個(gè)源操作數(shù)存儲(chǔ)在內(nèi)存中,地址是Y;另一個(gè)操作數(shù)存儲(chǔ)在R寄存器中;
兩個(gè)操作數(shù)要進(jìn)行ADD(加法操作),也即內(nèi)存中的一個(gè)數(shù)加上寄存器中的一個(gè)數(shù);并將結(jié)果存入到目的操作數(shù),也即寄存器R中[1]。2.1.2尋址方式尋址方式就是處理器根據(jù)指令中給出的地址信息來(lái)尋找物理地址的方式,是確定本條指令相關(guān)的數(shù)據(jù)地址以及下一條要執(zhí)行的指令地址的方法。根據(jù)查找數(shù)據(jù)地址還是指令地址,尋址方式分為兩類,即指令尋址方式和數(shù)據(jù)尋址方式,前者比較簡(jiǎn)單,后者比較復(fù)雜。但是指令尋址與數(shù)據(jù)尋址是交替進(jìn)行的,先進(jìn)行指令尋址,查找到指令后讀入處理器,在執(zhí)行這條指令的過(guò)程中需要進(jìn)行多次的數(shù)據(jù)尋址,找到操作數(shù)。執(zhí)行完這條指令后,又一次進(jìn)行指令尋址,查找下一條指令。此過(guò)程交替執(zhí)行。1.兩種指令尋址方式(1)順序?qū)ぶ贩绞街噶钜话沩樞虻拇鎯?chǔ)在內(nèi)存中,當(dāng)執(zhí)行一段程序時(shí),通常是一條指令接一條指令地順序取指執(zhí)行。也就是說(shuō),從存儲(chǔ)器取出第1條指令,執(zhí)行這條指令,接著從存儲(chǔ)器取出第2條指令,執(zhí)行第2條指令,依次執(zhí)行。對(duì)這種順序執(zhí)行的過(guò)程,對(duì)應(yīng)的指令取指方式叫做順序?qū)ぶ贩绞?。為此,必須使用程序?jì)數(shù)器(又稱指令計(jì)數(shù)器)PC來(lái)記錄指令的地址。處理器根據(jù)PC給出的地址取出相應(yīng)指令,同時(shí)修改PC的值,使其指向下一條指令地址。1.兩種指令尋址方式(2)跳躍尋址方式當(dāng)程序執(zhí)行轉(zhuǎn)移或者函數(shù)調(diào)用等相關(guān)指令時(shí),需要改變順序執(zhí)行模式,那么指令的尋址就會(huì)采取跳躍尋址方式。所謂跳躍,是指下條指令的地址碼不是由程序計(jì)數(shù)器PC給出,而是由正在處理器上執(zhí)行的指令給出。程序跳躍后,按新的指令地址開始順序執(zhí)行。因此,PC的內(nèi)容也必須相應(yīng)改變,以便及時(shí)跟蹤新的指令地址。采用指令跳躍尋址方式,可以實(shí)現(xiàn)程序轉(zhuǎn)移,構(gòu)成循環(huán)程序,從而能縮短程序長(zhǎng)度,或?qū)⒛承┏绦蜃鳛楣渤绦蛞谩V噶钕到y(tǒng)中的各種條件轉(zhuǎn)移、無(wú)條件轉(zhuǎn)移指令以及函數(shù)調(diào)用,就是為了實(shí)現(xiàn)指令的跳躍尋址而設(shè)置的。2.數(shù)據(jù)尋址方式形成操作數(shù)的有效地址的方法稱為數(shù)據(jù)尋址方式。下面介紹一些比較典型又常用的數(shù)據(jù)尋址方式。(1)隱含尋址(2)立即尋址(3)直接尋址(4)間接尋址(5)寄存器尋址方式和寄存器間接尋址方式(6)相對(duì)尋址方式(7)基址尋址方式(8)變址尋址方式(9)塊尋址方式2.1.3寄存器寄存器是中央處理器的組成部分,是有限存貯容量的高速存儲(chǔ)部件,可用來(lái)暫存指令、數(shù)據(jù)和地址。在中央處理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序計(jì)數(shù)器/指令計(jì)數(shù)器(PC)。在中央處理器的算術(shù)及邏輯部件中,寄存器有累加器(ACC)。寄存器是CPU內(nèi)部的元件,包括通用寄存器、專用寄存器和控制寄存器。寄存器的讀寫速度高,因此在寄存器之間的數(shù)據(jù)傳送非??臁<拇嫫魇窍到y(tǒng)獲得操作數(shù)的最快速途徑。寄存器通常都是以他們可以保存的位數(shù)量來(lái)定義,舉例來(lái)說(shuō),一個(gè)“8位寄存器”或“32位寄存器”。例如,x86指令集定義八個(gè)32位寄存器的集合,但一個(gè)實(shí)際x86指令集的CPU可以包含比八個(gè)更多的寄存器。1.寄存器分類根據(jù)根據(jù)寄存器的用途,主要分成以下幾類:(1)數(shù)據(jù)寄存器:用來(lái)儲(chǔ)存整數(shù)數(shù)字。在某些簡(jiǎn)單/舊的CPU中,特別地,數(shù)據(jù)寄存器是累加器,作為數(shù)學(xué)計(jì)算之用。(2)地址寄存器:用來(lái)存放存儲(chǔ)器地址,用來(lái)訪問(wèn)存儲(chǔ)器。(3)通用目的寄存器(GPRs):保存數(shù)據(jù)或地址,即結(jié)合了數(shù)據(jù)寄存器或地址寄存器的功能。(4)浮點(diǎn)寄存器(FPRs):用來(lái)儲(chǔ)存浮點(diǎn)數(shù)據(jù)。(5)常數(shù)寄存器:用來(lái)存放只讀的數(shù)值(例如0、1、圓周率等等)。(6)向量寄存器:用來(lái)儲(chǔ)存由向量處理器運(yùn)行SIMD(SingleInstruction,MultipleData)指令所得到的數(shù)據(jù)。(7)特殊目的寄存器:儲(chǔ)存CPU內(nèi)部的數(shù)據(jù),比如程序計(jì)數(shù)器、堆棧寄存器、程序狀態(tài)寄存器等。(8)指令寄存器:儲(chǔ)存當(dāng)前正在被執(zhí)行的指令。(9)索引寄存器:用于在程序運(yùn)行過(guò)程中更改運(yùn)算對(duì)象的地址。2.X86寄存器X86有14個(gè)32位寄存器,按用途可分為通用寄存器、指令指針、標(biāo)志寄存器和和段寄存器4類。(1)通用寄存器可用于傳送和暫存數(shù)據(jù),也可參與算術(shù)邏輯運(yùn)算,并保存運(yùn)算結(jié)果。除此之外,它們還各自具有一些特殊功能。通用寄存器的長(zhǎng)度取決于機(jī)器字長(zhǎng)。32位CPU的通用寄存器有8個(gè):EAX,EBX,ECX,EDX,EBP,ESP,ESI,EDI,又可以分成2組,一組是數(shù)據(jù)寄存器(4個(gè)),另一組是指針寄存器及變址寄存器(4個(gè))。(2)數(shù)據(jù)寄存器EAX:累加寄存器,常用于運(yùn)算,在乘除等指令中指定用來(lái)存放操作數(shù)。另外,所有的I/O指令都使用EAX與外設(shè)傳送數(shù)據(jù)。EBX:基址寄存器,常用于地址索引。ECX:計(jì)數(shù)寄存器,常用于計(jì)數(shù),如在移位指令、循環(huán)(loop)和串處理指令中用作隱含的計(jì)數(shù)器。EDX:數(shù)據(jù)寄存器,常用于數(shù)據(jù)傳遞。指針寄存器和變址寄存器:ESP:堆棧指針,與SS配合使用,可指向目前的堆棧位置。EBP:基址指針寄存器,可用作SS的一個(gè)相對(duì)基址位置。ESI:源變址寄存器,可用來(lái)存放相對(duì)于DS段之源變址指針。EDI:目的變址寄存器,可用來(lái)存放相對(duì)于ES段之目的變址指針。這4個(gè)32位寄存器主要用來(lái)形成操作數(shù)的有效地址。(2)指令指針EIP指令指針EIP是一個(gè)32位專用寄存器,它指向當(dāng)前需要取出的指令字節(jié),當(dāng)BIU(總線接口部件)從內(nèi)存中取出一個(gè)指令字節(jié)后,EIP就自動(dòng)加上所取出指令的長(zhǎng)度,以指向下一個(gè)指令字節(jié),如:BIU從內(nèi)存中取出的是1個(gè)字節(jié),EIP就會(huì)自動(dòng)加1;若BIU從內(nèi)存中取出的字節(jié)數(shù)長(zhǎng)度為3,則EIP就自動(dòng)加3。注意,EIP指向的是指令地址的段內(nèi)地址偏移量,又稱偏移地址(OffsetAddress)或有效地址(EA,EffectiveAddress)。(3)標(biāo)志寄存器EFRX86有一個(gè)32位的標(biāo)志寄存器EFR,在EFR中有意義的主要有9位,其中6位是狀態(tài)位,3位是控制位。標(biāo)志寄存器又稱程序狀態(tài)字(EPSW),用于存放條件標(biāo)志、控制標(biāo)志等,以反映處理器的狀態(tài)和運(yùn)算結(jié)果的某些特征及控制指令的執(zhí)行。(4)段寄存器為了運(yùn)用所有的內(nèi)存空間,X86設(shè)定了四個(gè)段寄存器,專門用來(lái)保存段地址: CS:代碼段寄存器 DS:數(shù)據(jù)段寄存器 SS:堆棧段寄存器 ES:附加段寄存器。當(dāng)一個(gè)程序要執(zhí)行時(shí),就要決定程序代碼、數(shù)據(jù)和堆棧各要用到內(nèi)存的哪些位置,通過(guò)設(shè)定段寄存器CS,DS,SS來(lái)指向這些起始位置。通常是將DS固定,而根據(jù)需要修改CS。所以,程序和其數(shù)據(jù)組合起來(lái)的大小,限制在DS所指的64K內(nèi),這就是COM文件不得大于64K的原因。102.1.4處理機(jī)的特權(quán)級(jí)1.為什么要區(qū)分處理機(jī)的運(yùn)行狀態(tài):保護(hù)操作系統(tǒng)
系統(tǒng)中兩類程序區(qū)別2.處理機(jī)的狀態(tài)分類
管態(tài)(系統(tǒng)態(tài))目態(tài)(用戶態(tài))操作系統(tǒng)的程序執(zhí)行用戶程序執(zhí)行使用全部指令禁止使用特權(quán)指令使用全部系統(tǒng)資源(包括整個(gè)存儲(chǔ)區(qū)域)只允許用戶程序訪問(wèn)自己的存儲(chǔ)區(qū)域OS:管理程序用戶程序管理系統(tǒng)資源使用資源,提出申請(qǐng)控制程序運(yùn)被控制①涉及外部設(shè)備的輸入/輸出指令②修改特殊寄存器的指令:CPU狀態(tài)寄存器PS、段地址寄存器、時(shí)鐘寄存器、I/O設(shè)備控制寄存器等③改變機(jī)器狀態(tài)的指令:停機(jī)指令、中斷返回指令、禁止中斷指令等3.特權(quán)指令集2.1.4處理機(jī)的特權(quán)級(jí)13①DOS系統(tǒng)
不分態(tài)②
Windows
系統(tǒng)
3環(huán)用戶態(tài)0環(huán)系統(tǒng)態(tài)還有1、2環(huán)預(yù)留③
UNIX系統(tǒng)、Linux系統(tǒng)
00管態(tài)(系統(tǒng)態(tài))11目態(tài)(用戶態(tài))4.實(shí)例操作系統(tǒng)處理機(jī)的狀態(tài)2.1.4處理機(jī)的特權(quán)級(jí)下列說(shuō)法正確的有()讀時(shí)鐘日期是特權(quán)指令訪管指令是特權(quán)指令設(shè)置時(shí)鐘日期是特權(quán)指令改變存儲(chǔ)器管理數(shù)據(jù)結(jié)構(gòu)是特權(quán)指令A(yù)BCD提交啟動(dòng)I/O指令是特權(quán)指令E多選題10分2.2存儲(chǔ)系統(tǒng)存儲(chǔ)系統(tǒng)是指計(jì)算機(jī)中由存放程序和數(shù)據(jù)的各種存儲(chǔ)設(shè)備、控制部件及管理信息調(diào)度的設(shè)備(硬件)和算法(軟件)所組成的系統(tǒng)。計(jì)算機(jī)的主存儲(chǔ)器不能同時(shí)滿足存取速度快、存儲(chǔ)容量大和成本低的要求,在計(jì)算機(jī)中必須有速度由慢到快、容量由大到小的多級(jí)層次存儲(chǔ)器,以最優(yōu)的控制調(diào)度算法和合理的成本,構(gòu)成具有性能可接受的存儲(chǔ)系統(tǒng)。制約計(jì)算機(jī)存儲(chǔ)器設(shè)計(jì)的因素主要有三個(gè):容量、速度、價(jià)格。這三個(gè)因素存在以下關(guān)系:(1)速度越快,每位價(jià)格越高;(2)容量越大,每位價(jià)格越低;(3)容量越大,速度越慢。為了權(quán)衡以上多種因素,目前主要采用存儲(chǔ)器層次結(jié)構(gòu),而不是依賴單一的存儲(chǔ)部件或技術(shù)。在現(xiàn)代計(jì)算機(jī)系統(tǒng)中存儲(chǔ)層次可分為高速緩沖存儲(chǔ)器、主存儲(chǔ)器、輔助存儲(chǔ)器三級(jí)。高速緩沖存儲(chǔ)器用來(lái)改善主存儲(chǔ)器與中央處理器的速度匹配問(wèn)題。輔助存儲(chǔ)器用于擴(kuò)大存儲(chǔ)空間。存儲(chǔ)器層次結(jié)構(gòu)如圖2-3所示圖中從上到下依次是高速緩存存儲(chǔ)器、主存儲(chǔ)器、輔助存儲(chǔ)器,速度逐漸下降,每位價(jià)格也隨之降低,但是容量逐步增大。因此,容量小、價(jià)格貴、但速度快的存儲(chǔ)器可作為容量大、價(jià)格便宜、但速度慢的存儲(chǔ)器的補(bǔ)充。這種存儲(chǔ)器系統(tǒng)結(jié)構(gòu)成功的關(guān)鍵是,隨著存儲(chǔ)器容量逐步變大、速度逐步下降,但是訪問(wèn)頻率也在降低。從而可以保證系統(tǒng)的高效。存儲(chǔ)器層次結(jié)構(gòu)如圖2-3所示例子假設(shè)處理器支持二級(jí)存儲(chǔ)器結(jié)構(gòu),第一級(jí)包含1000個(gè)字且存取時(shí)間為0.01us;第二級(jí)包含100000個(gè)字且存取時(shí)間為0.1us。假定要存取的一個(gè)字在第一級(jí),則處理器能直接存取它;如果它在第二級(jí),則這個(gè)字首先傳送到第一級(jí),然后再由處理器存取它。為了簡(jiǎn)化,我們不考慮處理器確定這個(gè)字是在第一級(jí)還是第二級(jí)所需的時(shí)間。圖2-4表示了兩級(jí)存儲(chǔ)器瓶頸存取時(shí)間和命中率的函數(shù)關(guān)系。這里:H=在較快存儲(chǔ)器(例如,cache)完成的存取占所有存儲(chǔ)器存取的百分比T1=第一級(jí)的存取時(shí)間T2=第二級(jí)的存取時(shí)間可以看出,第一級(jí)存取百分比高時(shí),總的平均存取時(shí)間接近于第一級(jí)的存取時(shí)間。根據(jù)這個(gè)簡(jiǎn)單的例子,若95%的字都是在第一級(jí)存儲(chǔ)器中找到,則存取一個(gè)字的平均時(shí)間可表示為:0.95*0.01us+0.05*(0.01us+0.1us)=0.0095+0.0055=0.015us此例的平均存取時(shí)間非常接近0.01us而不是0.1us,正如所期望的那樣。圖2-4兩級(jí)存儲(chǔ)器瓶頸存取時(shí)間和命中率的函數(shù)關(guān)系2.2.2內(nèi)存內(nèi)存(Memory)又被稱為內(nèi)存儲(chǔ)器或主存儲(chǔ)器,由半導(dǎo)體器件制成,是計(jì)算機(jī)的重要部件之一,是CPU能直接尋址的存儲(chǔ)空間,其特點(diǎn)是存取速率快。計(jì)算機(jī)中所有程序的運(yùn)行都是在內(nèi)存中進(jìn)行的,因此內(nèi)存的性能對(duì)計(jì)算機(jī)的影響非常大。內(nèi)存也的作用是暫時(shí)存放CPU中的運(yùn)算數(shù)據(jù)、以及與硬盤等外部存儲(chǔ)器交換的數(shù)據(jù)。只要計(jì)算機(jī)在運(yùn)行中,CPU就會(huì)把需要運(yùn)算的數(shù)據(jù)調(diào)到內(nèi)存中進(jìn)行運(yùn)算,當(dāng)運(yùn)算完成后CPU再將結(jié)果傳送出來(lái)。我們平常使用的程序,如Windows操作系統(tǒng)、打字軟件、游戲軟件等,一般都是安裝在硬盤等外存上的,但僅此是不能使用其功能的,必須把它們調(diào)入內(nèi)存中運(yùn)行,才能真正使用其功能,我們平時(shí)輸入一段文字,或玩一個(gè)游戲,其實(shí)都是在內(nèi)存中進(jìn)行的。就好比在一個(gè)書房里,存放書籍的書架和書柜相當(dāng)于電腦的外存,而我們工作的辦公桌就是內(nèi)存。通常我們把要永久保存的、大量的數(shù)據(jù)存儲(chǔ)在外存上,而把一些臨時(shí)的或少量的數(shù)據(jù)和程序放在內(nèi)存中,當(dāng)然內(nèi)存的性能會(huì)直接影響電腦的運(yùn)行速度。內(nèi)存包括隨機(jī)存儲(chǔ)器(RAM)和只讀存儲(chǔ)器(ROM)兩類:(1)只讀存儲(chǔ)器(ROM)ROM表示只讀存儲(chǔ)器(ReadOnlyMemory),在制造ROM的時(shí)候,信息(數(shù)據(jù)或程序)就被存入并永久保存。這些信息只能讀出,一般不能寫入,即使機(jī)器停電,數(shù)據(jù)也不會(huì)丟失。ROM一般用于存放計(jì)算機(jī)的基本程序和數(shù)據(jù),如BIOSROM。其物理外形一般是雙列直插式(DIP)的集成塊。(2)隨機(jī)存儲(chǔ)器(RAM)隨機(jī)存儲(chǔ)器(RandomAccessMemory)表示既可以從中讀取數(shù)據(jù),也可以寫入數(shù)據(jù)。當(dāng)機(jī)器電源關(guān)閉時(shí),存于其中的數(shù)據(jù)就會(huì)丟失。我們通常購(gòu)買或升級(jí)的內(nèi)存條(SIMM)就是用作電腦的內(nèi)存,它是將RAM集成塊集中在一起的一小塊電路板,插在計(jì)算機(jī)中的內(nèi)存插槽上,以減少RAM集成塊占用的空間。區(qū)分物理存儲(chǔ)器和存儲(chǔ)地址空間這兩個(gè)概念物理存儲(chǔ)器是指實(shí)際存在的具體存儲(chǔ)器芯片。如主板上裝插的內(nèi)存條和裝載有系統(tǒng)的BIOS的ROM芯片,顯示卡上的顯示RAM芯片和裝載顯示BIOS的ROM芯片,以及各種適配卡上的RAM芯片和ROM芯片都是物理存儲(chǔ)器。存儲(chǔ)地址空間是指對(duì)存儲(chǔ)器編碼(編碼地址)的范圍。所謂編碼就是對(duì)每一個(gè)物理存儲(chǔ)單元(一個(gè)字節(jié))分配一個(gè)號(hào)碼,通常叫作“編址”。分配一個(gè)號(hào)碼給一個(gè)存儲(chǔ)單元的目的是為了便于找到它,完成數(shù)據(jù)的讀寫,這就是所謂的“尋址”,因此有人也把地址空間稱為尋址空間。地址空間的大小和物理存儲(chǔ)器的大小并不一定相等。舉個(gè)例子來(lái)說(shuō)明這個(gè)問(wèn)題:某層樓共有17個(gè)房間,其編號(hào)為801~817。這17個(gè)房間是物理的,而其地址空間采用了三位編碼,其范圍是800~899共100個(gè)地址,可見地址空間是大于實(shí)際房間數(shù)量的。對(duì)于386以上檔次的微機(jī),其地址總線為32位,因此地址空間可達(dá)232B,即4GB。2.2.1高速緩存存儲(chǔ)器Cache高速緩沖存儲(chǔ)器(Cache),其原始意義是指存取速度比一般隨機(jī)存取存儲(chǔ)器(RAM)更快的一種RAM,一般而言它不像系統(tǒng)主存那樣使用動(dòng)態(tài)隨機(jī)存儲(chǔ)器(DRAM)技術(shù),而是使用昂貴但較快速的靜態(tài)隨機(jī)存儲(chǔ)器(SRAM)技術(shù)。高速緩沖存儲(chǔ)器是介于主存與CPU之間的一級(jí)存儲(chǔ)器,由靜態(tài)存儲(chǔ)芯片(SRAM)組成,容量較小但速度比主存快得多,接近于CPU的速度,其最重要的技術(shù)指標(biāo)是它的命中率。高速緩沖存儲(chǔ)器與主存儲(chǔ)器之間信息的調(diào)度和傳送是由硬件自動(dòng)進(jìn)行的。1.組成結(jié)構(gòu)高速緩沖存儲(chǔ)器主要由三大部分組成:Cache存儲(chǔ)體:存放由主存調(diào)入的指令與數(shù)據(jù)。地址轉(zhuǎn)換部件:建立目錄表以實(shí)現(xiàn)主存地址到緩存地址的轉(zhuǎn)換。置換換部件:在緩存已滿時(shí)按一定策略進(jìn)行數(shù)據(jù)替換,并修改地址轉(zhuǎn)換部件中的目錄表。2.工作原理高速緩沖存儲(chǔ)器通常由高速存儲(chǔ)器、聯(lián)想存儲(chǔ)器、置換邏輯電路和相應(yīng)的控制線路組成。在有高速緩沖存儲(chǔ)器的計(jì)算機(jī)系統(tǒng)中,中央處理器存取主存儲(chǔ)器的地址劃分為行號(hào)、列號(hào)和組內(nèi)地址三個(gè)字段。于是,主存儲(chǔ)器就在邏輯上劃分為若干行;每行劃分為若干的存儲(chǔ)單元組;每組包含幾個(gè)或幾十個(gè)字。高速存儲(chǔ)器也相應(yīng)地劃分為行和列的存儲(chǔ)單元組。二者的列數(shù)相同,組的大小也相同,但高速存儲(chǔ)器的行數(shù)卻比主存儲(chǔ)器的行數(shù)少得多。聯(lián)想存儲(chǔ)器用于地址聯(lián)想,有與高速存儲(chǔ)器相同行數(shù)和列數(shù)的存儲(chǔ)單元。當(dāng)主存儲(chǔ)器某一列某一行存儲(chǔ)單元組調(diào)入高速存儲(chǔ)器同一列某一空著的存儲(chǔ)單元組時(shí),與聯(lián)想存儲(chǔ)器對(duì)應(yīng)位置的存儲(chǔ)單元就記錄調(diào)入的存儲(chǔ)單元組在主存儲(chǔ)器中的行號(hào)。當(dāng)中央處理器存取主存儲(chǔ)器時(shí),硬件首先自動(dòng)對(duì)存取地址的列號(hào)字段進(jìn)行譯碼,以便將聯(lián)想存儲(chǔ)器該列的全部行號(hào)與存取主存儲(chǔ)器地址的行號(hào)字段進(jìn)行比較。若有相同的,表明要存取的主存儲(chǔ)器單元已在高速存儲(chǔ)器中,稱為命中,硬件就將存取主存儲(chǔ)器的地址映射為高速存儲(chǔ)器的地址并執(zhí)行存取操作;若都不相同,表明該單元不在高速存儲(chǔ)器中,稱為失效,硬件將執(zhí)行存取主存儲(chǔ)器操作并自動(dòng)將該單元所在的那一主存儲(chǔ)器單元組調(diào)入高速存儲(chǔ)器相同列中空著的存儲(chǔ)單元組中,同時(shí)將該組在主存儲(chǔ)器中的行號(hào)存入聯(lián)想存儲(chǔ)器對(duì)應(yīng)位置的單元內(nèi)。當(dāng)出現(xiàn)失效而高速存儲(chǔ)器對(duì)應(yīng)列中沒(méi)有空的位置時(shí),便淘汰該列中的某一組以騰出位置存放新調(diào)入的組,這稱為置換。確定替換的規(guī)則稱為置換算法,常用的置換算法有:最近最久未使用算法(LRU)、先進(jìn)先出法(FIFO)和隨機(jī)法(RAND)等,相關(guān)算法詳見第四章相應(yīng)內(nèi)容的介紹。置換邏輯電路就是執(zhí)行這個(gè)功能的。另外,當(dāng)執(zhí)行寫主存儲(chǔ)器操作時(shí),為保持主存儲(chǔ)器和高速存儲(chǔ)器內(nèi)容的一致性,對(duì)命中和失效分別處理。3.地址映象與轉(zhuǎn)換地址映象是指某一數(shù)據(jù)在內(nèi)存中的地址與在緩存中的地址兩者之間的對(duì)應(yīng)關(guān)系。下面介紹三種地址映象的方式。(1)全相聯(lián)方式(2)直接相聯(lián)方式(3)組相聯(lián)映象方式(1)全相聯(lián)方式全相聯(lián)方式的地址映象規(guī)則是:主存儲(chǔ)器中的任意一塊可以映象到Cache中的任意一塊。其基本實(shí)現(xiàn)思路是:①主存與緩存分成相同大小的數(shù)據(jù)塊;②主存的某一數(shù)據(jù)塊可以裝入緩存的任意一塊空間中。目錄表存放聯(lián)想存儲(chǔ)器中,其中包括三部分:數(shù)據(jù)塊在主存的塊地址、存入緩存后的塊地址、有效位(也稱裝入位)。由于是全相聯(lián)方式,因此,目錄表的容量應(yīng)當(dāng)與緩存的塊數(shù)相同。全相聯(lián)方式的優(yōu)點(diǎn)是命中率比較高,Cache存儲(chǔ)空間利用率高;缺點(diǎn)是訪問(wèn)相關(guān)存儲(chǔ)器時(shí),每次都要與全部?jī)?nèi)容比較,速度低,成本高,因而應(yīng)用少。(2)直接相聯(lián)方式直接相聯(lián)方式的地址映象規(guī)則是主存儲(chǔ)器中某一塊只能映象到Cache的一個(gè)特定的塊中。其基本實(shí)現(xiàn)思路是:①主存與緩存分成相同大小的數(shù)據(jù)塊;②主存容量應(yīng)是緩存容量的整數(shù)倍,將主存空間按緩存的容量分成區(qū),主存中每一區(qū)的塊數(shù)與緩存的總塊數(shù)相等;③主存中某區(qū)的一塊存入緩存時(shí)只能存入緩存中塊號(hào)相同的位置。主存中各區(qū)內(nèi)相同塊號(hào)的數(shù)據(jù)塊都可以分別調(diào)入緩存中塊號(hào)相同的地址中,但同時(shí)只能有一個(gè)區(qū)的塊存入緩存。由于主、緩存的塊號(hào)及塊內(nèi)地址兩個(gè)字段完全相同,因此,目錄登記時(shí),只記錄調(diào)入塊的區(qū)號(hào)即可。目錄表存放在高速小容量存儲(chǔ)器中,包括兩個(gè)字段:數(shù)據(jù)塊在主存的區(qū)號(hào)和有效位。目錄表的容量與緩存的塊數(shù)相同。直接相聯(lián)方式的優(yōu)點(diǎn)是地址映象方式簡(jiǎn)單,數(shù)據(jù)訪問(wèn)時(shí),只需檢查區(qū)號(hào)是否相等即可,因而可以得到比較快的訪問(wèn)速度,且硬件設(shè)備簡(jiǎn)單;缺點(diǎn)是置換操作頻繁,命中率比較低。(3)組相聯(lián)映象方式組相聯(lián)映象方式的地址映象規(guī)則是主存儲(chǔ)器中某一塊只能存入緩存的同組號(hào)的任一塊中。其基本實(shí)現(xiàn)思路是:①主存和緩存按同樣大小劃分成塊;②主存和緩存按同樣大小劃分成組;③主存容量是緩存容量的整數(shù)倍,將主存空間按緩存區(qū)的大小分成區(qū),主存中每一區(qū)的組數(shù)與緩存的組數(shù)相同;④當(dāng)主存的數(shù)據(jù)調(diào)入緩存時(shí),主存與緩存的組號(hào)應(yīng)相等,也就是各區(qū)中的某一塊只能存入緩存的同組號(hào)的空間內(nèi),但組內(nèi)各塊之間可任意存放,即從主存的組到緩存的組之間采用直接映象方式;在兩個(gè)對(duì)應(yīng)的組內(nèi)部采用全相聯(lián)映象方式。主存地址與緩存地址的轉(zhuǎn)換由兩部分構(gòu)成:組地址是按直接映象方式,按地址進(jìn)行訪問(wèn);而塊地址是采用全相聯(lián)方式,按內(nèi)容訪問(wèn)。組相聯(lián)映象方式的優(yōu)點(diǎn)是塊的沖突概率比較低,塊的利用率大幅度提高,塊失效率明顯降低;而缺點(diǎn)是實(shí)現(xiàn)難度和造價(jià)要比直接映象方式高。(3)組相聯(lián)映象方式2.2.3堆棧堆棧是C語(yǔ)言程序運(yùn)行時(shí)必須的一個(gè)記錄調(diào)用路徑和參數(shù)的空間:包括函數(shù)調(diào)用框架,傳遞參數(shù),保存返回地址,提供局部變量空間。1.堆棧相關(guān)基礎(chǔ)知識(shí)(1)堆棧相關(guān)寄存器:ESP:堆棧棧頂指針EBP:基址指針(EBP在C語(yǔ)言中用作記錄當(dāng)前函數(shù)調(diào)用基址)cs:eip:總是指向下一條指令的地址順序執(zhí)行:總是指向地址連續(xù)的下一條指令跳轉(zhuǎn)/分支:執(zhí)行這樣的指令的時(shí)候,cs:eip的值會(huì)根據(jù)程序需要被修改call:將當(dāng)前cs:eip的值壓入棧頂,cs:eip指向被調(diào)用函數(shù)的入口地址ret:從棧頂彈出原來(lái)保存在這里的cs:eip的值,放入cs:eip中iret:從棧頂彈出原來(lái)保存在這里的cs:eip及flags的值,放入cs:eip及標(biāo)志寄存器中(2)堆棧操作:PUSH:棧頂指針減少4個(gè)字節(jié)(32位)Pop:棧頂指針增加4個(gè)字節(jié)2.函數(shù)調(diào)用過(guò)程中堆棧的使用過(guò)程:函數(shù)調(diào)用過(guò)程中對(duì)堆棧的操作情況如圖2-5所示,一個(gè)主函數(shù)調(diào)用了一個(gè)子函數(shù)的過(guò)程。調(diào)用過(guò)程具體步驟:①執(zhí)行call之前,esp指向棧頂,ebp指向棧底;②執(zhí)行call時(shí),cs:eip原來(lái)的值被保存到棧頂,然后cs:eip的值指向被調(diào)用程序的入口地址;③進(jìn)入被調(diào)用程序,第一條指令:pushl%ebp,第二條指令:movl%esp,%ebp④此時(shí)進(jìn)入被調(diào)用程序,進(jìn)入后??蛇M(jìn)行入棧出棧等常規(guī)操作;退出被調(diào)用程序,第一條指令:movl%ebp,%esp,第二條指令:popl%ebp,第三條指令:ret,此時(shí)從被調(diào)用程序退出,通過(guò)ret將地址恢復(fù)到eip中。函數(shù)調(diào)用過(guò)程中對(duì)堆棧的操作圖2-5函數(shù)調(diào)用過(guò)程中對(duì)堆棧的操作2.2.3磁盤磁盤是最常用的外部存儲(chǔ)器,它是將圓形的磁性盤片裝在一個(gè)方型的密封盒子里,這樣做的目的是為了防止磁盤表面劃傷,導(dǎo)致數(shù)據(jù)丟失。存放在磁盤上的數(shù)據(jù)信息可長(zhǎng)期保存,且可以反復(fù)使用。磁盤有軟磁盤和硬磁盤之分,當(dāng)前軟磁盤已經(jīng)基本被淘汰了,計(jì)算機(jī)廣泛使用的是硬磁盤,我們可以把它比喻成是電腦儲(chǔ)存數(shù)據(jù)和信息的大倉(cāng)庫(kù)。1.硬磁盤的種類和構(gòu)成硬磁盤的種類主要包括SCSI、IDE、以及現(xiàn)在流行的SATA等;任何一種硬磁盤的生產(chǎn)都要一定的標(biāo)準(zhǔn);隨著相應(yīng)的標(biāo)準(zhǔn)的升級(jí),硬磁盤生產(chǎn)技術(shù)也在升級(jí);比如SCSI標(biāo)準(zhǔn)已經(jīng)經(jīng)歷了SCSI-1、SCSI-2、SCSI-3,而目前我們經(jīng)常在網(wǎng)站服務(wù)器看到的Ultral-160就是基于SCSI-3標(biāo)準(zhǔn)的;IDE遵循的是ATA標(biāo)準(zhǔn),而目前流行的SATA,是ATA標(biāo)準(zhǔn)的升級(jí)版本;IDE是并口設(shè)備,而SATA是串口,SATA的發(fā)展目的是替換IDE;一般說(shuō)來(lái),無(wú)論是哪種硬磁盤,都是由盤片、磁頭、盤片主軸、控制電機(jī)、磁頭控制器、數(shù)據(jù)轉(zhuǎn)換器、接口、緩存等幾個(gè)部份組成。硬磁盤結(jié)構(gòu)如圖2-6所示。所有的盤片都固定在一個(gè)旋轉(zhuǎn)軸上,這個(gè)軸即盤片主軸。而所有盤片之間是絕對(duì)平行的,在每個(gè)盤片的存儲(chǔ)面上都有一個(gè)磁頭,磁頭與盤片之間的距離比頭發(fā)絲的直徑還小。所有的磁頭連在一個(gè)磁頭控制器上,由磁頭控制器負(fù)責(zé)各個(gè)磁頭的運(yùn)動(dòng)。磁頭可沿盤片的半徑方向作徑向移動(dòng)(實(shí)際是斜切向運(yùn)動(dòng)),每個(gè)磁頭同一時(shí)刻也必須是同軸的,即從正上方向下看,所有磁頭任何時(shí)候都是重疊的(不過(guò)目前已經(jīng)有多磁頭獨(dú)立技術(shù),可不受此限制)。而盤片以每分鐘數(shù)千轉(zhuǎn)到上萬(wàn)轉(zhuǎn)的速度在高速旋轉(zhuǎn),這樣磁頭就能對(duì)盤片上的指定位置進(jìn)行數(shù)據(jù)的讀寫操作。硬磁盤結(jié)構(gòu)2.硬磁盤的工作原理1)盤面硬磁盤的盤片一般用鋁合金材料做基片,高速硬磁盤也可能用玻璃做基片。硬磁盤的每一個(gè)盤片都有兩個(gè)盤面(Side),即上、下盤面,一般每個(gè)盤面都會(huì)利用,都可以存儲(chǔ)數(shù)據(jù),成為有效盤面,也有極個(gè)別的硬磁盤盤面數(shù)為單數(shù)。每一個(gè)這樣的有效盤面都有一個(gè)盤面號(hào),按順序從上至下從0開始依次編號(hào)。在硬磁盤系統(tǒng)中,盤面號(hào)又叫磁頭號(hào),因?yàn)槊恳粋€(gè)有效盤面都有一個(gè)對(duì)應(yīng)的讀寫磁頭。硬磁盤的盤片組在2~14片不等,通常有2~3個(gè)盤片,故盤面號(hào)(磁頭號(hào))為0~3或0~5。2)磁道磁盤在低級(jí)格式化時(shí)被劃分成許多同心圓,這些同心圓軌跡叫做磁道(Track),信息以脈沖串的形式記錄在這些軌跡中。磁道從外向內(nèi)從0開始順序編號(hào)。硬磁盤的每一個(gè)盤面有300~1024個(gè)磁道,新式大容量硬磁盤每面的磁道數(shù)更多。,每條磁道并不是連續(xù)記錄數(shù)據(jù),而是被劃分成一段段的圓弧,這些圓弧的角速度一樣,但由于徑向長(zhǎng)度不一樣,所以線速度也不一樣,外圈的線速度較內(nèi)圈的線速度大,即同樣的轉(zhuǎn)速下,外圈在同樣時(shí)間段里,劃過(guò)的圓弧長(zhǎng)度要比內(nèi)圈劃過(guò)的圓弧長(zhǎng)度大。每段圓弧叫做一個(gè)扇區(qū),扇區(qū)從1開始編號(hào),每個(gè)扇區(qū)中的數(shù)據(jù)作為一個(gè)單元同時(shí)讀出或?qū)懭搿4诺朗强床灰姷?,只是盤面上以特殊形式磁化了的一些磁化區(qū),在磁盤格式化時(shí)就已規(guī)劃完畢。3)柱面所有盤面上的同一磁道構(gòu)成一個(gè)圓柱,通常稱做柱面(Cylinder),每個(gè)圓柱上的磁頭由上而下從0開始編號(hào)。數(shù)據(jù)的讀/寫按柱面進(jìn)行,即磁頭讀/寫數(shù)據(jù)時(shí)首先在同一柱面內(nèi)從0磁頭開始進(jìn)行操作,依次向下在同一柱面的不同盤面即磁頭上進(jìn)行操作,只在同一柱面所有的磁頭全部讀/寫完畢后磁頭才轉(zhuǎn)移到下一柱面(同心圓的再往里的柱面),因?yàn)檫x取磁頭只需通過(guò)電子切換即可,而選取柱面則必須通過(guò)機(jī)械切換,電子切換比在機(jī)械上磁頭向鄰近磁道移動(dòng)快得多,因此數(shù)據(jù)的讀/寫按柱面進(jìn)行,而不按盤面進(jìn)行,從而就提高硬磁盤的讀/寫效率。一塊硬磁盤驅(qū)動(dòng)器的柱面數(shù)(或每個(gè)盤面的磁道數(shù))既取決于每條磁道的寬窄(同樣,也與磁頭的大小有關(guān)),也取決于定位機(jī)構(gòu)所決定的磁道間步距的大小。4)扇區(qū)操作系統(tǒng)以扇區(qū)(Sector)形式將信息存儲(chǔ)在硬磁盤上,每個(gè)扇區(qū)包括兩個(gè)主要部分:扇區(qū)標(biāo)識(shí)符和存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)段(通常為512B)。扇區(qū)標(biāo)識(shí)符,又稱為扇區(qū)頭標(biāo),包括組成扇區(qū)三維地址的三個(gè)數(shù)字:
盤面號(hào):扇區(qū)所在的磁頭(或盤面);
柱面號(hào):磁道,確定磁頭的徑向方向;
扇區(qū)號(hào):在磁道上的位置,也叫塊號(hào),確定了數(shù)據(jù)在盤片圓圈上的位置。扇區(qū)頭標(biāo)中還包括一個(gè)字段,其中有一個(gè)標(biāo)識(shí)扇區(qū)是否能可靠存儲(chǔ)數(shù)據(jù)的標(biāo)記。有些硬磁盤控制器在扇區(qū)頭標(biāo)中還記錄有指示字,可在原扇區(qū)出錯(cuò)時(shí)指引磁盤轉(zhuǎn)到替換扇區(qū)或磁道。最后,扇區(qū)頭標(biāo)以循環(huán)冗余校驗(yàn)(CRC)值作為結(jié)束,以供控制器檢驗(yàn)扇區(qū)頭標(biāo)的讀出情況,確保準(zhǔn)確無(wú)誤。扇區(qū)的數(shù)據(jù)段用于存儲(chǔ)數(shù)據(jù)信息,包括數(shù)據(jù)和保護(hù)數(shù)據(jù)的糾錯(cuò)碼(ECC)。在初始準(zhǔn)備期間,計(jì)算機(jī)用512個(gè)虛擬信息字節(jié)(實(shí)際數(shù)據(jù)的存放位置)和與這些虛擬信息字節(jié)相應(yīng)的ECC數(shù)字填入這個(gè)部分。2.2.4非易失性存儲(chǔ)近年來(lái)出現(xiàn)的非易失性存儲(chǔ)(non-volatilememory,NVM)以其高集成度、低能耗、非易失性、字節(jié)尋址等特性得到了廣泛關(guān)注。學(xué)術(shù)界和工業(yè)界已經(jīng)開發(fā)了一些新型非易失存儲(chǔ)介質(zhì)和技術(shù),例如磁存儲(chǔ)器(magneticRAM,MRAM)、自旋磁存儲(chǔ)器(spintransfertorqueRAM,STT-RAM)、相變存儲(chǔ)器(phasechangememory,PCM)、阻變存儲(chǔ)器(resistiveRAM,RRAM)、鐵電存儲(chǔ)器(ferroelectricRAM,F(xiàn)eRAM)等。表2-2列舉了幾種主流新型存儲(chǔ)器件的主要參數(shù),從表中可以看出,非易失性存儲(chǔ)在集成度、讀速度方面具有較好的表現(xiàn),是構(gòu)建潛在新型存儲(chǔ)器件的候選對(duì)象。但是非易失性存儲(chǔ)也有幾個(gè)明顯的缺點(diǎn):1)具有較大的寫延時(shí),其寫延時(shí)比相應(yīng)的存儲(chǔ)介質(zhì)大1個(gè)數(shù)量級(jí),并且寫延時(shí)大于讀延時(shí),即讀寫不一致;2)雖然非易失性存儲(chǔ)的讀操作比寫操作快,但是相對(duì)傳統(tǒng)存儲(chǔ)介質(zhì),非易失性存儲(chǔ)的讀操作也比傳統(tǒng)存儲(chǔ)介質(zhì)慢;3)非易失性存儲(chǔ)的寫壽命有限,在連續(xù)寫的情況下,存儲(chǔ)單元很快會(huì)失效。參數(shù) 現(xiàn)有芯片容量級(jí)別 理論工藝制程級(jí)別(nm) 特征尺寸(F2) 讀操作時(shí)間 寫操作時(shí)間 壽命 數(shù)據(jù)保持力 寫操作功耗(nJ/b) 空閑功耗 非易失性質(zhì) 讀過(guò)程破壞性 當(dāng)前主要技術(shù)瓶頸DRAM ~16Gb ~20 6~10 <10ns <10ns >1015 刷新 ~0.1 高 易失 破壞性 需刷新,易失,作為內(nèi)存工藝制程有限NAND ~1Tb ~16 4~11 10~50us 0.1~1ms 104~106 10年 0.1~1 低 非易失 非破壞性 壽命/性能有限,存儲(chǔ)密度較低STT-RAM ~64Mb ~32 16~60 2~20ns 5~35ns 1012~1015 >10年 1.6~5 低 非易失 非破壞性 容量小,寫功耗較大,穩(wěn)定性差RRAM ~1TB ~11 4~14 10~50ns 10~50ns 108~1010 10年 ~0.1 低 非易失 非破壞性 材料級(jí)存儲(chǔ)機(jī)理尚不明確FeRAM ~64MB ~65 15~34 20~80ns 5~10ns 1012~1014 10年 <1 低 非易失 破壞性 容量小,具有讀破壞性,存儲(chǔ)密度低PCM ~8Gb ~5 4~8 10~100ns 20~120ns 108~1012 >10年 <1 低 非易失 非破壞性 容量較小,材料可操作溫度范圍狹窄2.2.5局部性原理所謂局部性原理,是指CPU訪問(wèn)存儲(chǔ)器時(shí),無(wú)論是存取指令還是存取數(shù)據(jù),所訪問(wèn)的存儲(chǔ)單元都趨于聚集在一個(gè)較小的連續(xù)區(qū)域中。局部性通常有兩種形式:(1)時(shí)間局部性(temporallocality):如果一個(gè)信息項(xiàng)正在被訪問(wèn),那么在近期它很可能還會(huì)被再次訪問(wèn)。程序循環(huán)、堆棧等是產(chǎn)生時(shí)間局部性的原因。(2)空間局部性(spatiallocality):在最近的將來(lái)將用到的信息很可能與現(xiàn)在正在使用的信息在空間地址上是臨近的。現(xiàn)代計(jì)算機(jī)系統(tǒng)的各個(gè)層次,從硬件到操作系統(tǒng),再到應(yīng)用程序,它們的設(shè)計(jì)都利用了局部性原理。在硬件層,局部性原理允許計(jì)算機(jī)設(shè)計(jì)者通過(guò)引入小而快速的高速緩存存儲(chǔ)器來(lái)保存最近被引用的指令和數(shù)據(jù)項(xiàng),從而提高對(duì)主存的訪問(wèn)速度。在操作系統(tǒng)級(jí),局部性原理允許系統(tǒng)使用主存作為虛擬地址空間最近被引用的高速緩存。類似地,操作系統(tǒng)用主存來(lái)緩存磁盤文件系統(tǒng)中最近被使用的磁盤塊。局部性原理在應(yīng)用程序的設(shè)計(jì)中也扮演著重要的角色,例如,Web瀏覽器將最近被引用的文檔放在本地磁盤上,利用的就是時(shí)間局部性。大量的Web服務(wù)器將最近被請(qǐng)求的文檔放在前端磁盤高速緩存中,這些緩存能滿足用戶對(duì)這些文檔的請(qǐng)求,而不需要服務(wù)器的任何干涉。下面用三個(gè)例子來(lái)說(shuō)明程序?qū)?shù)據(jù)引用的局部性:例1:上述代碼中,變量sum在每次循環(huán)迭代中被引用一次,因此,對(duì)于sum來(lái)說(shuō),有好的局部性;另一方面,因?yàn)閟um是變量,沒(méi)有空間局部性。對(duì)于向量v的元素,按照它們存儲(chǔ)在存儲(chǔ)器中的順序,被順序讀取,因此,對(duì)于v,函數(shù)有很好的空間局部性,但是時(shí)間局部性很差,因?yàn)槊總€(gè)向量元素只被訪問(wèn)一次。由于對(duì)于循環(huán)體內(nèi)的每個(gè)變量,這個(gè)函數(shù)要么有好的空間局部性,要么有好的時(shí)間局部性,因此,我們可以斷定sumvec函數(shù)有良好的局部性。例2:上述代碼中,數(shù)組v的元素都是按照步長(zhǎng)1來(lái)訪問(wèn)的,因此具有很好的空間局部性(數(shù)組元素是按照行順序存儲(chǔ)的);例3:上述代碼中,數(shù)組v的元素都是按照步長(zhǎng)N來(lái)訪問(wèn)的,因此其局部性就很差。綜上,我們可以得到如下結(jié)論:(1)重復(fù)引用同一個(gè)變量的程序有良好的時(shí)間局部性;(2)對(duì)于具有步長(zhǎng)為k的引用模式的程序,步長(zhǎng)越小,空間局部性越好。在存儲(chǔ)器中以大步長(zhǎng)跳來(lái)跳去的程序空間局部性會(huì)很差;(3)對(duì)于取指令來(lái)說(shuō),循環(huán)有好的時(shí)間和空間局部性。循環(huán)體越小,循環(huán)迭代次數(shù)越多,局部性越好。2.3中斷和時(shí)鐘1.中斷的基本概念中斷是指計(jì)算機(jī)運(yùn)行過(guò)程中,出現(xiàn)某些意外情況需主機(jī)干預(yù)時(shí),機(jī)器能自動(dòng)暫停正在運(yùn)行的程序并轉(zhuǎn)入處理新情況的程序,處理完畢后又返回原被暫停的程序繼續(xù)運(yùn)行。程序運(yùn)行過(guò)程中,如果系統(tǒng)外部、系統(tǒng)內(nèi)部或者當(dāng)前運(yùn)行程序本身出現(xiàn)緊急事件,處理機(jī)將立即暫停當(dāng)前程序的運(yùn)行,自動(dòng)轉(zhuǎn)入相應(yīng)的處理程序(中斷服務(wù)程序),待處理完后,再返回原來(lái)的程序運(yùn)行,這整個(gè)過(guò)程稱為程序中斷。2.現(xiàn)代計(jì)算機(jī)中采用中斷系統(tǒng)的主要目的①提高計(jì)算機(jī)系統(tǒng)效率②維持系統(tǒng)可靠正常工作③滿足實(shí)時(shí)處理要求④提供故障現(xiàn)場(chǎng)處理手段3.中斷的分類中斷會(huì)改變處理器執(zhí)行指令的順序,通常與CPU芯片內(nèi)部或外部硬件電路產(chǎn)生的電信號(hào)相對(duì)應(yīng)。中斷可以分為中斷和異常兩類:中斷一般是異步的,由硬件隨機(jī)產(chǎn)生,在程序執(zhí)行的任何時(shí)候可能出現(xiàn);異常一般是同步的,在(特殊的或出錯(cuò)的)指令執(zhí)行時(shí)由CPU控制單元產(chǎn)生。在Intel系列CPU中把中斷和異常分為以下幾類:(1)中斷
(2)異常(1)中斷又進(jìn)一步分為可屏蔽中斷和非屏蔽中斷:①可屏蔽中斷:可由程序控制其屏蔽性的中斷稱為可屏蔽中斷,處于屏蔽狀態(tài)時(shí),處理機(jī)將忽略該中斷信號(hào)。I/O設(shè)備發(fā)出的所有中斷請(qǐng)求都屬于可屏蔽中斷。②非屏蔽中斷:與可屏蔽中斷相對(duì)應(yīng),不能由程序控制其屏蔽性,處理機(jī)一定要立即處理的中斷稱為非屏蔽中斷或不可屏蔽中斷。非屏蔽中斷數(shù)量較少,通常是由一些緊急事件引發(fā)的中斷,如斷電、電源故障等情況,需要處理器立即處理。(2)異常:異常又可進(jìn)一步分為以下幾類:1)處理器探測(cè)異常:當(dāng)處理器執(zhí)行指令時(shí)探測(cè)到的一個(gè)反常條件所產(chǎn)生的異常??梢赃M(jìn)一步分為三類,這取決于處理器控制單元產(chǎn)生異常時(shí)保存在內(nèi)核態(tài)堆棧eip寄存器中的值。①故障:保存在eip中的值是引起故障的指令地址,因此,當(dāng)異常處理程序終止時(shí),那條指令會(huì)被重新執(zhí)行。②陷阱:保存在eip中的值是一個(gè)隨后要執(zhí)行的指令地址。只有當(dāng)沒(méi)有必要重新執(zhí)行已終止的指令時(shí),才觸發(fā)陷阱。陷阱的主要用途是為了調(diào)試程序。在這種情況下,中斷信號(hào)的作用是通知調(diào)試程序一條特殊指令已被執(zhí)行(例如到了一個(gè)程序內(nèi)的斷點(diǎn))。一旦用戶檢查到調(diào)試程序所提供的數(shù)據(jù),它就可能要求被調(diào)試程序從下一條執(zhí)行重新開始執(zhí)行。③異常中止:發(fā)生一個(gè)嚴(yán)重的錯(cuò)誤,控制單元出了問(wèn)題,不能在eip寄存器中保存引起異常的指令所在的確切位置。異常中止用于報(bào)告嚴(yán)重的錯(cuò)誤,如硬件故障或系統(tǒng)表中無(wú)效的值或不一致的值。由控制單元發(fā)生的這個(gè)中斷信號(hào)是緊急信號(hào),用來(lái)把控制權(quán)切換到相應(yīng)的異常中止處理程序,這個(gè)異常中止處理程序除了強(qiáng)制受影響的進(jìn)程終止外,沒(méi)有別的選擇。(2)異常:異常又可進(jìn)一步分為以下幾類:2)編程異常由編程者發(fā)出請(qǐng)求產(chǎn)生的異常。是由int或int3指令觸發(fā)的;當(dāng)into(檢查溢出)和bound(檢查地址出界)指令檢查的條件不為真時(shí),也引起編程異常。控制單元把編程異常作為陷阱來(lái)處理。編程異常通常也叫做軟中斷。這樣的異常有兩種常用的用途:執(zhí)行系統(tǒng)調(diào)用及給調(diào)試程序通報(bào)一個(gè)特定的事件。4.中斷向量為了方便異常和中斷的處理,系統(tǒng)為每個(gè)異常和中斷都賦予了一個(gè)唯一的標(biāo)識(shí)號(hào),稱為向量(vector),將其用作中斷描述符表IDT(InterruptDescriptorTable)中的一個(gè)索引號(hào),以快速定位一個(gè)異常或中斷的處理程序的入口地址。系統(tǒng)允許的向量號(hào)范圍是0~255,其中0~31保留用作80x86處理器定義的異常和中斷,32~255用于用戶定義的中斷。這些中斷通常用于外部I/O設(shè)備,使得這些設(shè)備可以通過(guò)外部硬件中斷機(jī)制向處理器發(fā)送中斷。表2-3以linux系統(tǒng)為例,給出了為80x86定義的異常和非屏蔽中斷分配的向量。向量范圍用途0~19(0x0~0x13)非屏蔽中斷和異常20~31(0x14~0x1f)Intel保留32~127(0x20~0x7f)外部中斷(IRQ)128(0x80)用于系統(tǒng)調(diào)用的可編程異常(參見第十章)129~238(0x81~0xee)外部中斷(IRQ)239(0xef)本地APIC時(shí)鐘中斷(參見第六章)240(0xf0)本地APIC高溫中斷(在Pentium4模型中引入)241~250(0xf0~0xfa)由Linux留作將來(lái)使用251~253(0xfb~0xff)處理器間中斷(參見本章后面“處理器間中斷處理”一節(jié))254(0xfe)本地APIC錯(cuò)誤中斷(當(dāng)本地APIC檢測(cè)到一個(gè)錯(cuò)誤條件是產(chǎn)生)255(0xff)本地APIC偽中斷(CPU屏蔽某個(gè)中斷時(shí)產(chǎn)生)表2-4給出了中斷請(qǐng)求與硬件設(shè)備的對(duì)應(yīng)表。IRQINT硬件設(shè)備032時(shí)鐘133鍵盤234PIC級(jí)聯(lián)335第二串口436第一串口638軟盤840系統(tǒng)時(shí)鐘1042網(wǎng)絡(luò)端口1143USB端口、聲卡1244PS/2鼠標(biāo)1345數(shù)學(xué)協(xié)處理器1446EIDE磁盤控制器的一級(jí)鏈接1547EIDE磁盤控制器的二級(jí)鏈接5.中斷描述符表(InterruptDescriptorTable,IDT)中斷描述符表(實(shí)模式中稱為中斷向量表)的作用是將每個(gè)異常或中斷向量分別與它們的處理程序聯(lián)系起來(lái)。由于系統(tǒng)中最多只有256個(gè)中斷或異常向量,因此IDT中的描述符個(gè)數(shù)不會(huì)超出256個(gè),不過(guò)IDT中所有空描述符項(xiàng)應(yīng)該設(shè)置其存在位(標(biāo)志)為0。、在實(shí)地址模式中,CPU把內(nèi)存的從0開始的1K字節(jié)用于存放中斷向量表,表中每個(gè)表項(xiàng)占四個(gè)字節(jié),由兩個(gè)字節(jié)的段地址和兩個(gè)字節(jié)的偏移量組成,這樣構(gòu)成的地址便是相應(yīng)中斷處理程序的入口地址。但是,在保護(hù)模式下,中斷處理程序入口地址的偏移量需要4個(gè)字節(jié),另外還要有反映模式切換的信息,因此表項(xiàng)長(zhǎng)度擴(kuò)展為8個(gè)字節(jié),此時(shí)中斷向量表也改稱為中斷描述符表IDT,其中的每個(gè)表項(xiàng)叫做一個(gè)門描述符(gatedescriptor),“門”的含義是當(dāng)中斷發(fā)生時(shí)必須先通過(guò)這些門,然后才能進(jìn)入相應(yīng)的處理程序。保護(hù)模式下IDT可以駐留在內(nèi)存空間的任何地方,處理器使用IDTR寄存器來(lái)定位IDT的位置,該寄存器是一個(gè)48位的寄存器,其低16位保存中斷描述符表的大小,高32位保存IDT的基址。由于每個(gè)描述符的長(zhǎng)度是8字節(jié),因此IDT的基地址應(yīng)對(duì)齊在8字節(jié)邊界上以提高訪問(wèn)效率。限長(zhǎng)值是以字節(jié)為單位的IDT的長(zhǎng)度。與IDTR寄存器相關(guān)的指令有LIDT和SIDT。LIDT指令用于把內(nèi)存中的IDT的限長(zhǎng)值和基地址加載到IDTR寄存器中,該指令僅能由當(dāng)前特權(quán)級(jí)CPL是0的代碼執(zhí)行,通常在操作系統(tǒng)初始創(chuàng)建IDT時(shí)執(zhí)行。SIDT指令用于把IDTR中的基地址和限長(zhǎng)值復(fù)制到內(nèi)存中,該指令可在任何特權(quán)級(jí)上執(zhí)行。下面介紹保護(hù)模式下主要的門描述符:介紹保護(hù)模式下主要的門描述符:(1)中斷門(Interruptgate)中斷門的類型碼為110,其中包含了一個(gè)中斷或異常處理程序所在段的選擇符和段內(nèi)偏移量,如圖2-7上所示。當(dāng)控制權(quán)通過(guò)中斷門進(jìn)入中斷處理程序時(shí),處理器清除IF標(biāo)志,即關(guān)中斷,以避免嵌套中斷的發(fā)生。中斷門中的DPL(DescriptorPrivilegeLevel)為0,因此,用戶態(tài)的進(jìn)程不能訪問(wèn)中斷門。所有的中斷處理程序都由中斷門激活,并全部限制在內(nèi)核態(tài)中執(zhí)行。(2)陷阱門(Trapgate)陷阱門的類型碼為111,與中斷門類似,兩者唯一的區(qū)別是,控制權(quán)通過(guò)陷阱門進(jìn)入處理程序時(shí)維持IF標(biāo)志位不變,即不關(guān)中斷,其結(jié)構(gòu)如圖2-7中所示。(3)系統(tǒng)門(Systemgate)這是Linux內(nèi)核特別設(shè)置的,用來(lái)讓用戶態(tài)的進(jìn)程訪問(wèn)陷阱門,因此,其門描述符的DPL為3。通過(guò)系統(tǒng)門來(lái)激活4個(gè)Linux異常處理程序,它們的向量是3、4、5及128,即在用戶態(tài)下可以執(zhí)行int3、into、bound及int0x80四條匯編指令。其結(jié)構(gòu)如圖2-7下所示。6.傳統(tǒng)的中斷控制器:8259A傳統(tǒng)的中斷控制器使用兩片8259A以“級(jí)聯(lián)”的方式連接在一起,如圖2-8所示。每個(gè)芯片可以處理最多8個(gè)不同的IRQ線,為了增加IRQ線,使用2個(gè)8259A芯片以級(jí)聯(lián)的方式進(jìn)行鏈接,從8259的輸出引角連接主8259的IRQ輸入引腳,因此,一共可以處理最多15個(gè)不同的IRQ線。圖2-8基于8259的中斷控制器簡(jiǎn)要說(shuō)明下CPU的中斷處理過(guò)程假設(shè)內(nèi)核已完成初始化,CPU在保護(hù)模式下運(yùn)行。當(dāng)CPU正常執(zhí)行完一條指令后,cs和eip這對(duì)寄存器包含了下一條將要執(zhí)行的指令的邏輯地址。在執(zhí)行這條指令之前,CPU控制單元會(huì)檢查在運(yùn)行前一條指令時(shí)是否發(fā)生了一個(gè)中斷或者異常。如果確定發(fā)生了一個(gè)中斷或異常,那么CPU控制單元將依次執(zhí)行下列操作:(1)確定與中斷或者異常關(guān)聯(lián)的向量i(0~255);(2)讀idtr寄存器指向的IDT表中的第i項(xiàng);(3)從gdtr寄存器獲得GDT的基地址,并查找GDT,以讀取IDT表項(xiàng)中的段選擇符所標(biāo)識(shí)的段描述符;(4)確定中斷是由授權(quán)的發(fā)生源發(fā)出的:(5)檢查是否發(fā)生了特權(quán)級(jí)的變化,一般指是否由用戶態(tài)陷入了內(nèi)核態(tài),如果是,則控制單元必須開始使用與新的特權(quán)級(jí)相關(guān)的堆棧:讀tr寄存器,訪問(wèn)運(yùn)行進(jìn)程的tss段,找到與新特權(quán)級(jí)相關(guān)的棧段和棧指針的值;然后用這些值裝載CPU的ss和esp寄存器;最后在新的棧中保存ss和esp以前的值,這些值指明了與舊特權(quán)級(jí)相關(guān)的棧的地址。(6)若發(fā)生的是故障,用引起異常的指令地址修改cs和eip寄存器的值,以使得這條指令在異常處理結(jié)束后能被再次執(zhí)行;(7)在棧中保存eflags、cs和eip的內(nèi)容;(8)如果異常產(chǎn)生一個(gè)硬件出錯(cuò)碼,則將它保存在棧中;(9)裝載cs和eip寄存器,其值分別是IDT表中第i項(xiàng)門描述符的段選擇符和偏移量字段。這對(duì)寄存器值給出中斷或者異常處理程序的第一條指令的地址。之后CPU就將去執(zhí)行中斷或異常處理程序了。當(dāng)中斷或異常處理程序執(zhí)行完成后,相應(yīng)的處理程序會(huì)執(zhí)行一條iret匯編指令,實(shí)現(xiàn)從中斷或異常的返回。iret指令將完成如下工作:(1)用保存在棧中的值裝載cs、eip和eflags寄存器。如果一個(gè)硬件出錯(cuò)碼曾被壓入棧中,那么彈出這個(gè)硬件出錯(cuò)碼;(2)檢查處理程序的特權(quán)級(jí)是否等于cs中最低兩位的值(即判斷進(jìn)程在被中斷時(shí)是否運(yùn)行在內(nèi)核態(tài))。若是,iret終止執(zhí)行;否則,轉(zhuǎn)入(3);(3)從棧中裝載ss和esp寄存器,即返回到與舊特權(quán)級(jí)相關(guān)的棧;(4)檢查ds、es、fs和gs段寄存器的內(nèi)容,如果其中一個(gè)寄存器包含的選擇符是一個(gè)段描述符,并且特權(quán)級(jí)比當(dāng)前特權(quán)級(jí)高,則清除相應(yīng)的寄存器,以防止懷有惡意的用戶程序利用這些寄存器訪問(wèn)內(nèi)核空間。中斷舉例,如圖2-9。分析A,B,C,D在互相搶占上的關(guān)系假設(shè):2個(gè)interrupt,記為A和B2個(gè)process,記為C和D1、假設(shè)某個(gè)時(shí)刻C占用CPU運(yùn)行,此時(shí)A中斷發(fā)生,C被A搶占,A得以在CPU上執(zhí)行。由于Linux不為中斷處理程序設(shè)置獨(dú)立堆棧,A只能使用C的kernelstack作為自己的運(yùn)行棧。2、無(wú)論如何,Linux的interruptA絕對(duì)不會(huì)被某個(gè)進(jìn)程C或者D搶占!這是由于所有已經(jīng)啟動(dòng)的interrupt,不管是interrupt之間切換,還是在某個(gè)interrupt中執(zhí)行代碼的過(guò)程,決不可能插入scheduler調(diào)度例程的調(diào)用。除非interrupt主動(dòng)或者被動(dòng)阻塞進(jìn)入睡眠,喚起scheduler,但這是必須避免的,危險(xiǎn)性見第3點(diǎn)說(shuō)明。3、關(guān)于第2點(diǎn)的解釋:首先,interrupt沒(méi)有堆棧,A中斷是“借”了C的堆棧運(yùn)行的,若允許A“阻塞”或“睡眠”,則C將被迫阻塞或睡眠,僅當(dāng)A被“喚醒”C才被喚醒;而“喚醒”后,A將按照C在就緒隊(duì)列中的順序被調(diào)度。這既損害了A的利益也污染了C的kernelstack。其次,如果interruptA由于阻塞或是其他原因睡眠,外界對(duì)系統(tǒng)的響應(yīng)能力將變得不可忍受4、那么interruptA和B的關(guān)系又如何呢?由于可能在中斷的某個(gè)步驟打開了CPU的IFflag標(biāo)志,這使得在A過(guò)程中,B的irqline已經(jīng)觸發(fā)了PIC,進(jìn)而觸發(fā)了CPUIRQpin,使得CPU執(zhí)行中斷B,這是中斷上下文的嵌套過(guò)程。5、通常Linux不對(duì)不同的interrupt設(shè)置優(yōu)先級(jí),這種任意的嵌套是允許的圖2-9中斷舉例2.3.2系統(tǒng)調(diào)用(以Linux/openEuler為例)系統(tǒng)調(diào)用概念系統(tǒng)功能調(diào)用是用戶在程序一級(jí)請(qǐng)求操作系統(tǒng)服務(wù)的一種手段,它是帶有一定功能號(hào)的“訪管指令”。其功能是由操作系統(tǒng)中的程序完成的。INT指令Dos:INT21HLinux:INT80Htrap指令┇fork()┇在應(yīng)用程序中調(diào)用系統(tǒng)調(diào)用fork(){┇int0x80┇}在libc庫(kù)中的封裝例程用戶態(tài)system_call:┇sys_fork()
┇ret_from_sys_calliretsys_fork(){┇}內(nèi)核態(tài)系統(tǒng)調(diào)用處理程序系統(tǒng)調(diào)用服務(wù)例程2.系統(tǒng)調(diào)用執(zhí)行流程系統(tǒng)調(diào)用與API有什么區(qū)別?2.3.2
系統(tǒng)調(diào)用(以Linux/openEuler為例)4.系統(tǒng)調(diào)用號(hào)(以Linux/openEuler為例)操作系統(tǒng)為每個(gè)系統(tǒng)調(diào)用都賦予一個(gè)唯一的系統(tǒng)調(diào)用號(hào)比如Linux
4.12中:系統(tǒng)調(diào)用號(hào)系統(tǒng)調(diào)用名0Read1Write2Open3Close60exit2.3.2
系統(tǒng)調(diào)用(以Linux/openEuler為例)2.3.2系統(tǒng)調(diào)用(以Linux/openEuler為例)5.系統(tǒng)調(diào)用服務(wù)例程與系統(tǒng)調(diào)用入口表①系統(tǒng)調(diào)用服務(wù)例程:完成某個(gè)系統(tǒng)調(diào)用功能的內(nèi)核函數(shù)②系統(tǒng)調(diào)用入口表:記錄了內(nèi)核中所有已注冊(cè)過(guò)的系統(tǒng)調(diào)用,是系統(tǒng)調(diào)用的跳轉(zhuǎn)表。③Linux系統(tǒng)調(diào)用表保存在linux-4.12/arch/x86/entyr/syscalls/syscall_32.tbl或syscall_64.tbl中
<number><abi><name><entrypoint>3.系統(tǒng)調(diào)用處理程序:
system_call()
int$0x80異常的處理程序,是所有系統(tǒng)調(diào)用的入口點(diǎn)內(nèi)核初始化時(shí)調(diào)用trap_init()函數(shù):設(shè)置中斷描述符相應(yīng)字段
2.3.2系統(tǒng)調(diào)用(以Linux/openEuler為例)3.系統(tǒng)調(diào)用處理程序:
system_call()
segmentselector:內(nèi)核代碼段__KERNEL_CS的段選擇符
offset:指向system_call()異常處理程序的入口地址
type:置為15,表示該異常是一個(gè)陷阱,相應(yīng)處理程序不禁止可屏蔽中斷
DPL(特權(quán)級(jí)):置為3,允許用戶程序中執(zhí)行int$0x80存放系統(tǒng)調(diào)用號(hào)主要工作:pushl%eax宏SAVE_ALL保護(hù)現(xiàn)場(chǎng);正確性檢查;依eax中所包含的系統(tǒng)調(diào)用號(hào),調(diào)用其對(duì)應(yīng)的服務(wù)例程;系統(tǒng)服務(wù)例程結(jié)束時(shí),通過(guò)宏RESTORE_ALL恢復(fù)寄存器;通過(guò)iret指令返回。call*SYMBOL_NAME(sys_call_table)(0,%eax,4)#defineSAVE_ALL\cld;\pushl%es;\pushl%ds;\pushl%eax;\pushl%ebp;\pushl%edi;\pushl%esi;\pushl%edx;\pushl%ecx;\pushl%ebx;\movl$(__KERNEL_DS),%edx;\movl%edx,%ds;\movl%edx,%es;3.系統(tǒng)調(diào)用處理程序:
system_call()2.3.2系統(tǒng)調(diào)用(以Linux/openEuler為例)ENTRY(system_call) pushl%eax //保存EAX寄存器的內(nèi)容
SAVE_ALL//保存各通用寄存器的內(nèi)容
GET_CURRENT(%ebx)//獲取調(diào)用進(jìn)程的task_struct結(jié)構(gòu)的指針 ┇cmpl$(NR_syscalls),%eax//檢測(cè)系統(tǒng)調(diào)用是否合法系統(tǒng)調(diào)用。
jaebadsys//如果該系統(tǒng)調(diào)用號(hào)越界則跳轉(zhuǎn)到標(biāo)號(hào)badsys處
testb$0x20,flags(%ebx) //檢測(cè)是否設(shè)置了PF_TRACESYS標(biāo)志
jnetracesys//如果設(shè)置了PF_TRACESYS標(biāo)志則跳轉(zhuǎn)到標(biāo)號(hào)tracesys處
call*SYMBOL_NAME(sys_call_table)(,%eax,4)//執(zhí)行系統(tǒng)調(diào)用服務(wù)例程
movl%eax,EAX(%esp) //系統(tǒng)調(diào)用返回值進(jìn)棧保存。ret_from_sys_call://系統(tǒng)調(diào)用返回system_call()的源代碼:2.3.2
系統(tǒng)調(diào)用(以Linux/openEuler為例)4.系統(tǒng)調(diào)用參數(shù)傳遞寄存器傳遞:eax:系統(tǒng)調(diào)用號(hào)ebx,ecx,edx,esi和edi按照順序存放前五個(gè)參數(shù)對(duì)參數(shù)的要求:每個(gè)參數(shù)長(zhǎng)度不能超過(guò)寄存器長(zhǎng)度,即32位;參數(shù)個(gè)數(shù)實(shí)際不能超過(guò)5個(gè);5.系統(tǒng)調(diào)用返回值:所有系統(tǒng)調(diào)用返回一個(gè)整數(shù)值:正數(shù)或0表示系統(tǒng)調(diào)用成功結(jié)束負(fù)數(shù)表示出錯(cuò),返回的負(fù)值由封裝例程存放在errno變量中返回給應(yīng)用程序如果系統(tǒng)調(diào)用參數(shù)超出5個(gè)怎么辦?2.3.2
系統(tǒng)調(diào)用(以Linux/openEuler為例)fork(){┇int0x80┇}在執(zhí)行int$0x80之前l(fā)ibc庫(kù)中的封裝例程設(shè)置16
6.系統(tǒng)調(diào)用執(zhí)行過(guò)程intmain(){…getuid();
…}intgetuid(void)
{long_res;…int$0x80;
…}ENTRY(system_call)pushl%eaxSAVE_ALLGET_CURRENT(%ebx)
…callsys_getuid16
…RESTORE_ALLiretasmlinkagelongsys_getuid16(void){return(current_uid);}用戶程序系統(tǒng)調(diào)用處理程序標(biāo)準(zhǔn)C庫(kù)內(nèi)核服務(wù)例程getuid():返回調(diào)用進(jìn)程的用戶ID哪個(gè)小組積極來(lái)回答?2.3.2
系統(tǒng)調(diào)用(以Linux/openEuler為例)6.系統(tǒng)調(diào)用執(zhí)行流程在封裝例程中含有int$0x80匯編指令代碼int$0x80使該調(diào)用進(jìn)入內(nèi)核:system_call()該系統(tǒng)調(diào)用被執(zhí)行,并返回執(zhí)行結(jié)果該系統(tǒng)調(diào)用由標(biāo)準(zhǔn)C庫(kù)的封裝例程(宏)來(lái)引導(dǎo)
用戶發(fā)出一個(gè)系統(tǒng)調(diào)用的請(qǐng)求由system_call找到指定的系統(tǒng)調(diào)用服務(wù)例程2.3.2系統(tǒng)調(diào)用(以Linux/openEuler為例)2.3.3計(jì)算機(jī)系統(tǒng)時(shí)鐘計(jì)算機(jī)中很多活動(dòng)都是由定時(shí)測(cè)量來(lái)驅(qū)動(dòng)的,這對(duì)用戶常常是不可見的。例如,當(dāng)你停止使用計(jì)算機(jī)的控制臺(tái)以后,屏幕會(huì)自動(dòng)關(guān)閉,這得歸因于定時(shí)器,它允許內(nèi)核跟蹤你按鍵或移動(dòng)鼠標(biāo)后到現(xiàn)在過(guò)了多少時(shí)間;如果你收到了一個(gè)來(lái)自系統(tǒng)的警告信息,建議你刪除一組不用的文件,這是由于有一個(gè)程序能識(shí)別長(zhǎng)時(shí)間未被訪問(wèn)的所有用戶文件。為了進(jìn)行這些操作,程序必須能從每個(gè)設(shè)備或文件中檢索到它們最后被訪問(wèn)的時(shí)間,即時(shí)間戳,而這些時(shí)間標(biāo)記必須由內(nèi)核自動(dòng)地設(shè)置。Linux內(nèi)核提供了兩種主要的定時(shí)測(cè)量手段:一是獲得當(dāng)前的時(shí)間和日期,包括time()
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 押題03水循環(huán)與水量平衡-備戰(zhàn)2023年高考地理之考前押大題(原卷版)
- 2024年攜手樂(lè)斯泉軟水體驗(yàn)尊享優(yōu)惠
- 2024年房屋交易簡(jiǎn)易合同
- 2024年教育培訓(xùn)機(jī)構(gòu)服務(wù)合同
- 制定大學(xué)個(gè)人暑假計(jì)劃(4篇)
- 2024年攜手共創(chuàng):多媒體內(nèi)容獨(dú)家授權(quán)協(xié)議
- DB4106T 8-2019 豬肉生產(chǎn)環(huán)節(jié)獸藥殘留控制技術(shù)規(guī)范
- 第21講自然環(huán)境對(duì)人類活動(dòng)的影響(講義)-2023年高考地理一輪復(fù)習(xí)(新教材新高考)
- DB4102T 004-2020 檢測(cè)設(shè)備計(jì)量溯源管理指南
- 小班德育工作總結(jié)(8篇)
- 國(guó)企紀(jì)檢監(jiān)察嵌入式監(jiān)督的探索與實(shí)踐
- 淺議小升初數(shù)學(xué)教學(xué)銜接
- 設(shè)備安裝應(yīng)急救援預(yù)案
- 深基坑工程降水技術(shù)及現(xiàn)階段發(fā)展
- 暫堵壓裂技術(shù)服務(wù)方案
- 《孔乙己》公開課一等獎(jiǎng)PPT優(yōu)秀課件
- 美的中央空調(diào)故障代碼H系列家庭中央空調(diào)(第一部分多聯(lián)機(jī))
- 業(yè)主委員會(huì)成立流程圖
- (完整版)全usedtodo,beusedtodoing,beusedtodo辨析練習(xí)(帶答案)
- 廣聯(lián)達(dá)辦公大廈工程施工組織設(shè)計(jì)
- 疑難病例HELLP綜合征
評(píng)論
0/150
提交評(píng)論