版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第一章 概述1、什么是POSIX標(biāo)準(zhǔn),為什么現(xiàn)代造作系統(tǒng)的設(shè)計(jì)必須遵循POSIX標(biāo)準(zhǔn)?答:POSIX表示可移植操作系統(tǒng)接口Portable Operating System Interface。POSIX是在Unix標(biāo)準(zhǔn)化過程中出現(xiàn)的產(chǎn)物。POSIX 1003.1標(biāo)準(zhǔn)定義了一個(gè)最小的Unix操作系統(tǒng)接口。任何操作系統(tǒng)只有符合這一標(biāo)準(zhǔn),才有可能運(yùn)行Unix程序。2、什么是GNU?Linux與GNU有什么關(guān)系?答:GNU是GNU Is Not Unix的遞歸縮寫,是自由軟件基金會的一個(gè)工程。GNU工程產(chǎn)品包括emacs編輯器、著名的GNU C和Gcc編譯器等,這些軟件叫做GNU軟件。GNU軟件和派
2、生工作均適用GNU通用公共許可證,即GPLGeneral Public License。Linux的開發(fā)使用了眾多的GUN工具。3、Linux系統(tǒng)由哪些局部組成?Linux內(nèi)核處于什么位置?答:(1)符合POSIX標(biāo)準(zhǔn)的操作系統(tǒng)內(nèi)核、Shell和外圍工具。(2)C語言編譯器和其他開發(fā)工具及函數(shù)庫。(3)X Window窗口系統(tǒng)。(4)各種應(yīng)用軟件,包括字處理軟件、圖象處理軟件等。Linux內(nèi)核是所有Linux 發(fā)布版本的核心。第二章 內(nèi)存尋址1、在80x86的存放器中,哪些存放器供一般用戶使用?哪些存放器只能被操作系統(tǒng)使用?答:通用存放器EAX,EBX,ECX,EDX,EBP(基址指針),ES
3、P(堆棧指針),ESI(擴(kuò)展源指針),EDI(擴(kuò)展目的指針),還有EFLAGS(標(biāo)志存放器).專供操作系統(tǒng)使用的存放器:IDTR中斷描述符存放器,GDTR全局描述符表存放器,LDTR局部描述符表存放器,TaskRegisters任務(wù)存放器,DebugRegister調(diào)試存放器,ControlRegister控制存放器,Model-SpecificRegisters模型專用存放器。3、請用C語言描述段描述符表。答:#include <stdio.h>#include <stdlib.h>#define BASE_H 0xff00#define BASE_M 0x00ff#
4、define BASE_L 0xffff#define LIMIT_H 0x000f#define LIMIT_L 0xffff#define GRANULARITY 0x0080#define SEGMENT_P 0x8000#define SYSTEM_TYPE 0x1000#define DPL 0x6000#define TYPE_E 0x0800#define TYPE_ED_C 0x0400#define TYPE_RW 0x0200#define TYPE_A 0x0100struct unsigned char base_high;unsigned char g : 1;uns
5、igned char other : 3;unsigned char limit_high : 4;unsigned char P : 1;unsigned char dpl : 2;unsigned char S : 1;unsigned char E : 1;unsigned char ED_C : 1;unsigned char RW : 1;unsigned char A : 1;unsigned char base_middle;unsigned short base_low;unsigned short limit_low; gdt_t;int main(int argc, cha
6、r *argv)/ int gdt4 = 0x0fff, 0x0000, 0x9a00, 0x00c0 ; / 0x08/ int gdt4 = 0x7fff, 0x0000, 0x9a01, 0x00c0 ; / 0x10/ int gdt4 = 0x0002, 0x8000, 0x920b, 0x00c0 ; / display memory/ int gdt4 = 0xffff, 0xffff, 0xffff, 0xffff ; / test int gdt4 = 0x03ff, 0x0000, 0xf201, 0x00c0 ; / ldt0unsigned int base, limi
7、t;unsigned int granularity;unsigned int present, dpl, system_type, segment_type;unsigned int type_e, type_ed_c, type_rw, type_a;base = (gdt3 & BASE_H) << 16;base += (gdt2 & BASE_M) << 16;base += gdt1 & BASE_L << 0;limit = (gdt0 & LIMIT_L) << 0;limit += (gdt3 &
8、amp; LIMIT_H) << 16;granularity = (gdt3 & GRANULARITY) >> 7;present = (gdt2 & SEGMENT_P) >> 15;dpl = (gdt2 & DPL) >> 13;system_type = (gdt2 & SYSTEM_TYPE) >> 12;type_e = (gdt2 & TYPE_E) >> 11;type_ed_c = (gdt2 & TYPE_ED_C) >> 10;type_
9、rw = (gdt2 & TYPE_RW) >> 9;type_a = (gdt2 & TYPE_A) >> 8;printf("basett0x%xt%dn", base, base);printf("limittt0x%xt%dn", limit, limit);printf("n");printf("Gtt%dt(0=bype, 1=4KB)n", granularity);printf("n");printf("Ptt%dn",
10、 present);printf("DPLtt%dn", dpl);printf("Stt%dt(0=system, 1=code or data)n", system_type);printf("TYPE_Ett%xn", type_e);printf("TYPE_ED_Ct%xn", type_ed_c);printf("TYPE_RWtt%xn", type_rw);printf("TYPE_Att%xn", type_a);printf("n");
11、printf("E=0, data segmentn");printf("ED=0, data segmentn");printf("ED=1, stack segmentn");printf("W=0, not writablen");printf("W=1, writablen");printf("n");printf("E=1, code segmentn");printf("C=0, ingore privilegen");pr
12、intf("C=1, use privilegen");printf("R=0, not readablen");printf("R=1, readablen");return EXIT_SUCCESS;4、Linux是如何利用段機(jī)制又巧妙的繞過段機(jī)制的?在內(nèi)核代碼中如何表示各種段,查找最新源代碼并進(jìn)行閱讀和分析。答:IA32規(guī)定段機(jī)制是不可禁止的,因此不可能繞過它直接給出線性地址空間的地址。萬般無奈之下,Linux的設(shè)計(jì)人員干脆讓段的基地址為0,而段的界限為4GB,這時(shí)任意給出一個(gè)偏移量,那么等式為“0+偏移量=線性地址,也就是說“
13、偏移量線性地址。另外由于段機(jī)制規(guī)定“偏移量 < 4GB,所以偏移量的范圍為0HFFFFFFFFH,這恰好是線性地址空間范圍,也就是說虛擬地址直接映射到了線性地址,我們以后所提到的虛擬地址和線性地址指的也就是同一地址??磥?,Linux在沒有回避段機(jī)制的情況下巧妙地把段機(jī)制給繞過去了。另外,由于IA32段機(jī)制還規(guī)定,必須為代碼段和數(shù)據(jù)段創(chuàng)立不同的段,所以Linux必須為代碼段和數(shù)據(jù)段分別創(chuàng)立一個(gè)基地址為0,段界限為4GB的段描述符。不僅如此,由于Linux內(nèi)核運(yùn)行在特權(quán)級0,而用戶程序運(yùn)行在特權(quán)級別3,根據(jù)IA32的段保護(hù)機(jī)制規(guī)定,特權(quán)級3的程序是無法訪問特權(quán)級為0的段的,所以Linux必須
14、為內(nèi)核和用戶程序分別創(chuàng)立其代碼段和數(shù)據(jù)段。這就意味著Linux必須創(chuàng)立4個(gè)段描述符特權(quán)級0的代碼段和數(shù)據(jù)段,特權(quán)級3的代碼段和數(shù)據(jù)段。5、為什么在設(shè)計(jì)兩級頁表的線性地址結(jié)構(gòu)時(shí),給頁目錄和頁表各分配10位?如果不是這樣,舉例說明會產(chǎn)生什么樣的結(jié)果?答:所謂兩級頁表就是對頁表再進(jìn)行分頁。第一級稱為頁目錄,其中存放的是關(guān)于頁表的信息。4MB的頁表再次分頁4MB4K可以分為1K個(gè)頁,同樣對每個(gè)頁的描述需要4個(gè)字節(jié),于是可以算出頁目錄最多占用4KB個(gè)字節(jié),正好是一個(gè)頁,其示意圖如2.9所示。頁目錄共有1K個(gè)表項(xiàng), 于是,線性地址的最高10位(即22位 31位)用來產(chǎn)生第一級的索引。兩級表結(jié)構(gòu)的第二級稱為
15、頁表,每個(gè)頁表也剛好存放在一個(gè)4K字節(jié)的頁中,包含1K個(gè)字節(jié)的表項(xiàng)。第二級頁表由線性地址的中間10位(即21位 12位)進(jìn)行索引,最低12位表示頁內(nèi)偏量。 舉例:如果頁目錄占用3124位,頁表項(xiàng)占用2312位,偏移地址占110位,那么有28個(gè)頁表項(xiàng),一個(gè)頁面有2124k個(gè)表項(xiàng),每個(gè)表項(xiàng)大小為4字節(jié),212的范圍為4頁面,而不是以一個(gè)頁面為準(zhǔn)。6、深入理解圖2.12,并結(jié)合圖表達(dá)線性地址到物理地址的轉(zhuǎn)換。答:第一步,用32位線性地址的最高10位第3122位作為頁目錄項(xiàng)的索引,將它乘以4,與CR3中的頁目錄的起始地址相加,獲得相應(yīng)目錄項(xiàng)在內(nèi)存的地址。第二步,從這個(gè)地址開始讀取32位頁目錄項(xiàng),取出其
16、高20位,再給低12位補(bǔ)0,形成的32位就是頁表在內(nèi)存的起始地址。第三步,用32位線性地址中的第2112位作為頁表中頁表項(xiàng)的索引,將它乘以4,與頁表的起始地址相加,獲得相應(yīng)頁表項(xiàng)在內(nèi)存的地址。第四步,從這個(gè)地址開始讀取32位頁表項(xiàng),取出其高20位,再將線性地址的第110位放在低12位,形成最終32位頁面物理地址。 第三章 進(jìn)程1、什么是進(jìn)程控制塊?它包含哪些根本信息? 答:對進(jìn)程進(jìn)行全面描述的數(shù)據(jù)結(jié)構(gòu),Linux中把對進(jìn)程的描述結(jié)構(gòu)叫做task_struct:struct task_struct 傳統(tǒng)上這樣的數(shù)據(jù)結(jié)構(gòu)被叫做進(jìn)程控制塊PCBprocess control blaock系統(tǒng)為了管理
17、進(jìn)程設(shè)置的一個(gè)專門的數(shù)據(jù)結(jié)構(gòu),用它來記錄進(jìn)程的外部特征,描述進(jìn)程的運(yùn)動(dòng)變化過程。系統(tǒng)利用PCB來控制和管理進(jìn)程,所以PCB是系統(tǒng)感知進(jìn)程存在的唯一標(biāo)志。進(jìn)程與PCB是一一對應(yīng)的。包含的根本信息:(1)狀態(tài)信息描述進(jìn)程動(dòng)態(tài)的變化。(2)鏈接信息描述進(jìn)程的父子關(guān)系。(3)各種標(biāo)識符用簡單數(shù)字對進(jìn)程進(jìn)行標(biāo)識。(4)進(jìn)程間通信信息描述多個(gè)進(jìn)程在同一任務(wù)上協(xié)作工作。(5)時(shí)間和定時(shí)器信息描述進(jìn)程在生存周期內(nèi)使用CPU時(shí)間的統(tǒng)計(jì)、計(jì)費(fèi)等信息。(6)調(diào)度信息描述進(jìn)程優(yōu)先級、調(diào)度策略等信息。(7)文件系統(tǒng)信息對進(jìn)程使用文件情況進(jìn)行記錄。(8)虛擬內(nèi)存信息描述每個(gè)進(jìn)程擁有的地址空間。(9)處理器環(huán)境信息描述進(jìn)程
18、的執(zhí)行環(huán)境(處理器的存放器及堆棧等) 3、Linux的進(jìn)程控制塊如何存放?為什么?假設(shè)ESP中存放的是棧頂指針,請用三句匯編語句描述如何獲得current的PCB的地址。答:當(dāng)進(jìn)程一進(jìn)入內(nèi)核態(tài),CPU就自動(dòng)設(shè)置進(jìn)程的內(nèi)核棧。這個(gè)棧位于內(nèi)核的數(shù)據(jù)段上,為了節(jié)省空間,Linux把內(nèi)核棧和一個(gè)緊挨近的PCB的小數(shù)據(jù)結(jié)構(gòu),thread_info放在一起,占用8kb的內(nèi)存區(qū)。因?yàn)檫@樣可以節(jié)省空間,內(nèi)核很容易從ESP存放器的值獲得,當(dāng)前在CPU上正在運(yùn)行的thread_info結(jié)構(gòu)的地址。movl$0xfffe000,%eaxandl%esp,%ecxmovl%ecx,p4、PCB的組織方式有哪幾種?為什
19、么要采取這些組織方式?答:1進(jìn)程鏈表2哈希表3就緒隊(duì)列4等待隊(duì)列在一個(gè)系統(tǒng)中,通??梢該碛袛?shù)十個(gè)、數(shù)百個(gè)乃至數(shù)千個(gè)進(jìn)程,相應(yīng)的就有這么多PCB。為了能有效的對它們加以管理,應(yīng)該用適當(dāng)?shù)姆绞綄⑦@些PCB組織起來。5、請編寫內(nèi)核模塊,打印系統(tǒng)中各進(jìn)程的名字以及PID,同時(shí)統(tǒng)計(jì)系統(tǒng)中進(jìn)程的個(gè)數(shù)。答:static int print_pid(void)struct task_struct *task,*p;struct list_head *pos;int count = 0;printk("Hello World enter begin:n");task = &init_
20、task;list_for_each(pos,struct task_struct,tasks);count+;printk("%d->%sn",p->pid,p->comm);printk("the number of process is:%dn",count);return 0;7、什么是寫時(shí)復(fù)制技術(shù),這種技術(shù)在什么情況下最能發(fā)揮其優(yōu)勢?答:父進(jìn)程和子進(jìn)程共享頁面而不是復(fù)制頁面。然而,只要頁面被共享,它們就不能被修改。無論父進(jìn)程和子進(jìn)程何時(shí)試圖寫一個(gè)共享的頁面,就產(chǎn)生一個(gè)錯(cuò)誤,這時(shí)內(nèi)核就把這個(gè)頁復(fù)制到一個(gè)新的頁面中并標(biāo)記為可寫。原
21、來的頁面仍然是寫保護(hù)的:當(dāng)其它進(jìn)程試圖寫入時(shí),內(nèi)核檢查寫進(jìn)程是否是這個(gè)頁面的唯一屬主;如果是,它把這個(gè)頁面標(biāo)記為對這個(gè)進(jìn)程是可寫的。采用這種技術(shù),顯然只有預(yù)測到將要修改的頁才會被復(fù)制,而且必須被復(fù)制,不然的話,就會破壞父進(jìn)程的程序執(zhí)行。9、init內(nèi)核線程與init進(jìn)程是一回事嗎?它們有什么本質(zhì)的區(qū)別?答:1init函數(shù)是內(nèi)核代碼的一局部,在內(nèi)核態(tài)運(yùn)行,是獨(dú)立的可執(zhí)行代碼的一局部。2init進(jìn)程在Linux操作系統(tǒng)中是一個(gè)具有特殊意義的進(jìn)程,它是由內(nèi)核啟動(dòng)并運(yùn)行的第一個(gè)用戶進(jìn)程,因此它不是運(yùn)行在內(nèi)核態(tài),而是運(yùn)行在用戶態(tài)。它的代碼不是內(nèi)核本身的一局部,而是存放在硬盤上可執(zhí)行文件的映象中,和其他用
22、戶進(jìn)程沒有什么兩樣。10、用fork寫一個(gè)簡單的測試程序,從父進(jìn)程和子進(jìn)程中打印信息。信息應(yīng)該包括父進(jìn)程和子進(jìn)程的PID。執(zhí)行程序假設(shè)干次,看兩個(gè)信息是否以同樣的次序打印。答:#include<unistd.h>int main(void)pid_t pid;pid = fork();if(pid < 0)printf("error");return 0;else if(pid = 0)printf("this is chile process with pid of %dn",getpid();elseprintf("thi
23、s is parent process with pid of %dn",pid);return 0;第四章 內(nèi)存管理2、什么是內(nèi)核映像?它存放在物理空間和內(nèi)核空間的什么地方?答:內(nèi)核空間由所有進(jìn)程共享,其中存放的是內(nèi)核代碼和數(shù)據(jù),即“內(nèi)核映象Linux內(nèi)核映像被裝入在物理地址0x00100000開始的地方,內(nèi)核映像在內(nèi)核空間的起始地址就為0xC0100000。3、用戶空間劃分為哪幾局部?用戶程序調(diào)用malloc()分配的內(nèi)存屬于那一局部?答:分為堆棧段、BSS(未初始化的數(shù)據(jù)段)、數(shù)據(jù)段和代碼段。從數(shù)據(jù)段的頂部到堆棧段地址的下沿這個(gè)區(qū)間是一個(gè)巨大的空洞,這就是進(jìn)程在運(yùn)行時(shí)調(diào)用mal
24、loc()可以動(dòng)態(tài)分配的空間,也叫動(dòng)態(tài)內(nèi)存或堆。4、什么是虛存映射?有哪幾種類型?答:隨著進(jìn)程的運(yùn)行,被引用的程序局部會由操作系統(tǒng)裝入到物理內(nèi)存,這種將映像鏈接到進(jìn)程用戶空間的方法被稱為“虛存映射,也就是把文件從磁盤映射到進(jìn)程的用戶空間,這樣把對文件的訪問轉(zhuǎn)化為對虛存區(qū)的訪問。有兩種類型的虛存映射:1共享的:有幾個(gè)進(jìn)程共享這一映射,也就是說,如果一個(gè)進(jìn)程對共享的虛存區(qū)進(jìn)行寫,其它進(jìn)程都能感覺到,而且會修改磁盤上對應(yīng)的文件。2私有的:進(jìn)程創(chuàng)立的這種映射只是為了讀文件,而不是寫文件,因此,對虛存區(qū)的寫操作不會修改磁盤上的文件,由此可以看出,私有映射的效率要比共享映射的高。 除了這兩種映射外,如果映
25、射與文件無關(guān),就叫匿名映射。5、一個(gè)進(jìn)程一般包含哪些虛存區(qū)?舉例說明。6、說明mmap()系統(tǒng)調(diào)用的功能?利用mmap()寫一個(gè)拷貝文件的程序。答:mmap()系統(tǒng)調(diào)用時(shí)通過調(diào)用do_mmap內(nèi)核函數(shù)來實(shí)現(xiàn)建立文件到顯存的映射。int i,fd1,fd2;char *buf1,buf2;fd1 = open("data",0 KDOMCY);if(fd1&&fd2&&(fstar(fd);&star buf1()=0)if(lseek(fd) statbuf,st_size-1,seek_set)<0perror"ls
26、eek target");exit(-1);if(MAP_FAILED = buf()perror("Lmap source");exit(-1);if(map_FAFCE) = buf2)perror("mmap target");exit(-1);mempy(buf2,buf1,(size - f)startbuf,st_size);7、Linux是如何實(shí)現(xiàn)“請求調(diào)頁的?答:1)如果被訪問的頁不在內(nèi)存,也就是說,這個(gè)頁還沒有被存放在任何一個(gè)物理頁面中,那么,內(nèi)核分配一個(gè)新的頁面并將其適當(dāng)?shù)爻跏蓟?,這種技術(shù)稱為“請求調(diào)頁;2)“請求調(diào)頁是一種
27、動(dòng)態(tài)內(nèi)存分配技術(shù),它將頁面的分配推遲到不能再推遲為止,也就是說,一直推遲到進(jìn)程要訪問的頁不在物理內(nèi)存時(shí)為止,由此引起一個(gè)缺頁異常;該技術(shù)的引入主要是因?yàn)檫M(jìn)程開始運(yùn)行時(shí)并不訪問其地址空間中的全部地址。8、試表達(dá)伙伴算法的工作原理,并說明為什么伙伴算法可以消除外碎片?答:假設(shè)要求分配的塊其大小為128個(gè)頁面。該算法先在塊大小為128個(gè)頁面的鏈表中查找,看是否有這樣一個(gè)空閑塊。如果有,就直接分配;如果沒有,該算法會查找下一個(gè)更大的塊,具體地說,就是在塊大小為256個(gè)頁面的鏈表中查找一個(gè)空閑塊。如果存在這樣的空閑塊,內(nèi)核就把這256個(gè)頁面分為兩等份,一份分配出去,另一份插入到塊大小為128個(gè)頁面的鏈表
28、中。如果在塊大小為256個(gè)頁面的鏈表中也沒有找到空閑頁塊,就繼續(xù)找更大的塊,即512個(gè)頁面的塊。如果存在這樣的塊,內(nèi)核就從512個(gè)頁面的塊中分出128個(gè)頁面滿足請求,然后從384個(gè)頁面中取出256個(gè)頁面插入到塊大小為256個(gè)頁面的鏈表中。然后把剩余的128個(gè)頁面插入到塊大小為128個(gè)頁面的鏈表中。如果512個(gè)頁面的鏈表中還沒有空閑塊,該算法就放棄分配,并發(fā)出出錯(cuò)信號。9、vmalloc()和kmalloc()有何區(qū)別?編寫內(nèi)核模塊程序,調(diào)用這兩個(gè)函數(shù)以觀察二者所分配空間位于不同的區(qū)域。答:在內(nèi)核空間中調(diào)用kmalloc()分配連續(xù)物理空間,而調(diào)用vmalloc()分配非物理連續(xù)空間。我們把km
29、alloc()所分配內(nèi)核空間中的地址稱為內(nèi)核邏輯地址,把vmalloc()分配的內(nèi)核空間中的地址稱為內(nèi)核虛擬地址 vmalloc()在分配過程中須更新內(nèi)核頁表 #include<Linux/module.h>#include<Linux/init.h>#include<Linux/slala.h>#include<Linux/min.h>#include<Linux/vmalloc.h>unsigned char * kmalloc men;unsigned char * vmalloc men;MODULL_LICENSE(&quo
30、t;GPL");static int_init init_mmshow(void)pagemem = _get_free_page(GFP_KERNEL);if(!kmallocmen)goto fail2;printk(KERN_INFO"vmallocmen=0x%pn",vmallocmen);return 0;failBfail 1:Kfree(kmallocmen);fail 2:free_page(pagemon);fail 3:return -1;static void_exit cleanup_mmshow(void)Vfree(vmallocme
31、n);Kfree(kmallocmen);free_page(pagemen);module_init(imit_mmshow);module_exit(cleanup_mmshow);10、分析守護(hù)進(jìn)程kswapd的運(yùn)行時(shí)機(jī),你認(rèn)為怎樣換出頁面比擬合理?答:為了防止在CPU忙碌的時(shí)候,也就是在缺頁異常發(fā)生時(shí),臨時(shí)搜索可供換出的內(nèi)存頁面并加以換出,Linux內(nèi)核定期地檢查系統(tǒng)內(nèi)的空閑頁面數(shù)是否小于預(yù)定義的極限,一旦發(fā)現(xiàn)空閑頁面數(shù)太少,就預(yù)先將假設(shè)干頁面換出,以減輕缺頁異常發(fā)生時(shí)系統(tǒng)所承受的負(fù)擔(dān)。當(dāng)然,由于無法確切地預(yù)測頁面的使用,即使這樣做了也還可能出現(xiàn)缺頁異常發(fā)生時(shí)內(nèi)存依然沒有足夠的空閑頁面
32、。但是,預(yù)換出畢竟能減少空閑頁面不夠用的概率。并且通過選擇適當(dāng)?shù)膮?shù)如每隔多久換出一次,每次換出多少頁,可以使臨時(shí)尋找要換出頁面的情況很少發(fā)生。為此,Linux內(nèi)核設(shè)置了一個(gè)定期將頁面換出的守護(hù)進(jìn)程kswapd。第五章 中斷和異常1、什么是中斷向量?Linux是如何分配中斷向量的?答:每個(gè)中斷源都被分配一個(gè)8位無符號整數(shù)作為類型碼,即中斷向量Linux對256個(gè)向量的分配如下:(1)從031的向量對應(yīng)于異常和非屏蔽中斷。(2)從3247的向量即由I/O設(shè)備引起的中斷分配給屏蔽中斷。(3)剩余的從48255的向量用來標(biāo)識軟中斷。Linux只用了其中的一個(gè)即128或0x80向量用來實(shí)現(xiàn)系統(tǒng)調(diào)用。
33、3、如何對中斷描述符表進(jìn)行初始化?答:Linux內(nèi)核在系統(tǒng)的初始化階段要初始化可編程控制器8259A;將中斷描述符表的起始地址裝入IDTR存放器,并初始化表中的每一項(xiàng);當(dāng)計(jì)算機(jī)運(yùn)行在實(shí)模式時(shí),中斷描述符表被初始化,并由BIOS使用;真正進(jìn)入了Linux內(nèi)核,中斷描述符表就被移到內(nèi)存的另一個(gè)區(qū)域,并為進(jìn)入保護(hù)模式進(jìn)行預(yù)初始化。4、在中斷描述符表中如何插入一個(gè)中斷門、陷阱門和系統(tǒng)門?答:IDT表項(xiàng)的設(shè)置通過_set_gaet()函數(shù)實(shí)現(xiàn)。調(diào)用該函數(shù)在IDT表中插入一個(gè)中斷門:set_intr_gate(unsigned int n, void *addr);調(diào)用該函數(shù)在IDT表中插入一個(gè)陷阱門:s
34、et_trap_gate(unsigned int n, void *addr);調(diào)用該函數(shù)在IDT表中插入一個(gè)系統(tǒng)門:set_system_gate(unsigned int n, void *addr) 5、CPU為什么要進(jìn)行有效性檢查?如何檢查?CPU是如何跳到中斷或異常處理程序的?答:有效性檢查防止用戶應(yīng)用程序訪問特殊的陷阱門或中斷門。當(dāng)從用戶態(tài)堆棧切換到內(nèi)核態(tài)堆棧時(shí),先把用戶態(tài)堆棧的值壓入中斷程序的內(nèi)核態(tài)堆棧中,同時(shí)把 EFLAGS存放器自動(dòng)壓棧,然后把被中斷進(jìn)程的返回地址壓入堆棧。如果異常產(chǎn)生了一個(gè)硬錯(cuò)誤碼,那么將它也保存在堆棧中。如果特權(quán)級沒有發(fā)生變化,那么壓入棧中的內(nèi)容如圖5.
35、4中。此時(shí),CS:EIP的值就是IDT表中第i項(xiàng)門描述符的段選擇符和偏移量的值,于是,CPU就跳轉(zhuǎn)到了中斷或異常處理程序。 分兩步進(jìn)行有效性檢查:首先是“段級檢查,將CPU的當(dāng)前特權(quán)級CPL存放在CS存放器的最低兩位與IDT中第i項(xiàng)段選擇符中的DPL相比擬,如果DPL3大于CPL0,就產(chǎn)生一個(gè)“通用保護(hù)異常,因?yàn)橹袛嗵幚沓绦虻奶貦?quán)級不能低于引起中斷的進(jìn)程的特權(quán)級。這種情況發(fā)生的可能性不大,因?yàn)橹袛嗵幚沓绦蛞话氵\(yùn)行在內(nèi)核態(tài),其特權(quán)級為0。然后是“門級檢查,把CPL與IDT中第i個(gè)門的DPL相比擬,如果CPL大于DPL,也就是當(dāng)前特權(quán)級3小于這個(gè)門的特權(quán)級0,CPU就不能“穿過這個(gè)門,于是產(chǎn)生一個(gè)
36、“通用保護(hù)異常,這是為了防止用戶應(yīng)用程序訪問特殊的陷阱門或中斷門。但是請注意,這種“門級檢查是針對一般的用戶程序,而不包括外部I/O產(chǎn)生的中斷或因CPU內(nèi)部異常而產(chǎn)生的異常,也就是說,如果產(chǎn)生了中斷或異常,就免去了“門級檢查。6、中斷處理程序和中斷效勞程序有何區(qū)別?Linux如何描述一條共享的中斷線?答:中斷效勞程序ISR與中斷處理程序是兩個(gè)不同的概念。在Linux中,15條中斷線對應(yīng)15個(gè)中斷處理程序。具體來說,中斷處理程序相當(dāng)于某個(gè)中斷向量的總處理程序,例如IRQ0x05_interrupt()是中斷號為5向量為37的總處理程序,如果這個(gè)5號中斷由網(wǎng)卡和圖形卡共享,那么網(wǎng)卡和圖形卡分別有其
37、相應(yīng)的中斷效勞程序。typedef irqreturn_t(* irq_handler_t) (int, void *);struct irqactionirq_handler_t handler;unsigned long flags;cpumask_t mask;const char *name;void *dev_id;struct irqaction *next;int irq;.;8、為什么把中斷分為兩局部來處理?答:中斷效勞例程一般都是在中斷請求關(guān)閉的條件下執(zhí)行的,以防止嵌套而使中斷控制復(fù)雜化。但是,中斷是一個(gè)隨機(jī)事件,它隨時(shí)會到來,如果關(guān)中斷的時(shí)間太長,CPU就不能及時(shí)響應(yīng)其他的
38、中斷請求,從而造成中斷的喪失。因此,內(nèi)核的目標(biāo)就是盡可能快的處理完中斷請求,盡其所能把更多的處理向后推遲。例如,假設(shè)一個(gè)數(shù)據(jù)塊已經(jīng)到達(dá)了網(wǎng)線,當(dāng)中斷控制器接受到這個(gè)中斷請求信號時(shí),Linux內(nèi)核只是簡單地標(biāo)志數(shù)據(jù)到來了,然后讓處理器恢復(fù)到它以前運(yùn)行的狀態(tài),其余的處理稍后再進(jìn)行如把數(shù)據(jù)移入一個(gè)緩沖區(qū),接受數(shù)據(jù)的進(jìn)程就可以在緩沖區(qū)找到數(shù)據(jù)。因此,內(nèi)核把中斷處理分為兩局部:前半局部top half和后半局部bottom half,前半局部內(nèi)核立即執(zhí)行,而后半局部留著稍后處理。9、實(shí)時(shí)時(shí)鐘和操作系統(tǒng)時(shí)鐘有何不同?答:大局部PC機(jī)中有兩個(gè)時(shí)鐘源,分別是實(shí)時(shí)時(shí)鐘RTC和 操作系統(tǒng)OS時(shí)鐘實(shí)時(shí)時(shí)鐘也叫硬件時(shí)
39、鐘,它靠電池供電,即使系統(tǒng)斷電,也可以維持日期和時(shí)間。RTC是OS時(shí)鐘的時(shí)間基準(zhǔn),操作系統(tǒng)通過讀取RTC來初始化OS時(shí)鐘,此后二者保持同步運(yùn)行,共同維持著系統(tǒng)時(shí)間。所謂同步,是指操作系統(tǒng)在運(yùn)行過程中,每隔一個(gè)固定時(shí)間會刷新或校正RTC中的信息10、jiffies表示什么?什么時(shí)候?qū)ζ湓黾樱看穑簀iffies是Linux內(nèi)核中的一個(gè)全局變量,用它來表示系統(tǒng)自啟動(dòng)以來的時(shí)鐘節(jié)拍總數(shù)。啟動(dòng)時(shí),內(nèi)核將該變量初始化為0,此后,每次時(shí)鐘中斷處理程序都會增加該變量的值。11、時(shí)鐘中斷的下半局部主要做什么?答:run_lock_timers()函數(shù)去處理所有到期的定時(shí)器,定時(shí)器作為軟中斷在下半局部中執(zhí)行。Sc
40、heduler_tick()函數(shù)負(fù)責(zé)減少當(dāng)前運(yùn)行進(jìn)程的時(shí)間片計(jì)數(shù)值并且在需要時(shí)設(shè)置need_resched標(biāo)志。當(dāng)update_process_timer()函數(shù)返回后,do_timer()函數(shù)接著會調(diào)用update_times()函數(shù)更新墻上時(shí)鐘。第六章 系統(tǒng)調(diào)用1、系統(tǒng)調(diào)用與庫函數(shù)、系統(tǒng)命令及內(nèi)核函數(shù)有什么區(qū)別和聯(lián)系?答:應(yīng)用編程接口(API)其實(shí)是一個(gè)函數(shù)定義, 比方常見的read()、malloc()、free、abs()函數(shù)等,這些函數(shù)說明了如何獲得一個(gè)給定的效勞;而系統(tǒng)調(diào)用是通過軟中斷向內(nèi)核發(fā)出一個(gè)明確的請求。從編程者的觀點(diǎn)看,API和系統(tǒng)調(diào)用之間沒有什么差異,二者關(guān)注的都是函數(shù)名
41、、參數(shù)類型及返回代碼的含義。然而,從設(shè)計(jì)者的觀點(diǎn)看,這是有差異的,因?yàn)橄到y(tǒng)調(diào)用的實(shí)現(xiàn)是在內(nèi)核完成的,而用戶態(tài)的函數(shù)是在函數(shù)庫中實(shí)現(xiàn)的。系統(tǒng)命令相對應(yīng)用編程接口更高一層,每個(gè)系統(tǒng)命令都是一個(gè)可執(zhí)行程序,比方常用的系統(tǒng)命令ls、hostname等,這些命令的實(shí)現(xiàn)調(diào)用了系統(tǒng)調(diào)用。內(nèi)核函數(shù)與普通函數(shù)形式上沒有什么區(qū)別,只不過前者在內(nèi)核實(shí)現(xiàn),因此要滿足一些內(nèi)核編程的要求。系統(tǒng)調(diào)用是用戶進(jìn)程進(jìn)入內(nèi)核的接口層,它本身并非內(nèi)核函數(shù),但它是由內(nèi)核函數(shù)實(shí)現(xiàn)的,進(jìn)入內(nèi)核后,不同的系統(tǒng)調(diào)用會找到各自對應(yīng)的內(nèi)核函數(shù)。2、內(nèi)核為什么要設(shè)置系統(tǒng)調(diào)用處理程序,它與效勞例程有什么區(qū)別?答:用戶空間的程序無法直接執(zhí)行內(nèi)核代碼,內(nèi)
42、核駐留在受保護(hù)的地址空間上,不允許用戶進(jìn)程內(nèi)核地址空間上讀寫。當(dāng)用戶態(tài)的進(jìn)程調(diào)用一個(gè)系統(tǒng)調(diào)用時(shí),CPU切換到內(nèi)核態(tài)并開始執(zhí)行一個(gè)內(nèi)核函數(shù)。系統(tǒng)調(diào)用處理程序執(zhí)行以下操作:在內(nèi)核棧保存大多數(shù)存放器的內(nèi)容;調(diào)用所謂系統(tǒng)調(diào)用效勞例程的相應(yīng)的C函數(shù)來處理系統(tǒng)調(diào)用;通過ret_from_sys_call( )函數(shù)從系統(tǒng)調(diào)用返回;不同的系統(tǒng)調(diào)用會找到各自對應(yīng)的內(nèi)核函數(shù),這些內(nèi)核函數(shù)被稱為系統(tǒng)調(diào)用的“效勞例程。3、說明系統(tǒng)調(diào)用號的作用。答:因?yàn)閮?nèi)核實(shí)現(xiàn)了很多不同的系統(tǒng)調(diào)用,因此進(jìn)程必須傳遞一個(gè)叫做系統(tǒng)調(diào)用號的參數(shù)來識別所需的系統(tǒng)調(diào)用;第七章 內(nèi)核中的同步1、什么事臨界區(qū)?什么是競爭狀態(tài)?什么是同步?答:臨界區(qū)
43、critical regions就是訪問和操作共享數(shù)據(jù)的代碼段,這段代碼必須被原子地執(zhí)行。競爭狀態(tài)是多個(gè)內(nèi)核任務(wù)同時(shí)訪問同一臨界區(qū)。防止并發(fā)和防止競爭狀態(tài)稱為同步synchronization 2、內(nèi)核中造成并發(fā)執(zhí)行的原因是什么?答:1中斷中斷幾乎可以在任何時(shí)刻異步發(fā)生,也可能隨時(shí)打斷正在執(zhí)行的代碼。2內(nèi)核搶占假設(shè)內(nèi)核具有搶占性,內(nèi)核中的任務(wù)就可能會被另一任務(wù)搶占3睡眠及與用戶空間的同步在內(nèi)核執(zhí)行的進(jìn)程可能會睡眠,這將喚醒調(diào)度程序,導(dǎo)致調(diào)度一個(gè)新的用戶進(jìn)程執(zhí)行4對稱多處理兩個(gè)或多個(gè)處理器可以同時(shí)執(zhí)行代碼3、給出信號量的定義,并說明down()和up()的含義。答:信號量是在1968年由Edsg
44、er Wybe DijKstra提出的,此后它逐漸成為一種常用的鎖機(jī)制。信號量支持兩個(gè)原子操作P()和V(),這兩個(gè)名字來自荷蘭語 Proberen和Vershogen。前者做測試操作字面意思是探查,后者叫做增加操作。后來的系統(tǒng)把這兩種操作分別叫做down()和up(),Linux也遵從這種叫法。down()操作通過對信號量計(jì)數(shù)減1來請求獲得一個(gè)信號量。如果結(jié)果是0或大于0,信號量鎖被獲得,任務(wù)就可以進(jìn)入臨界區(qū)了。如果結(jié)果是負(fù)數(shù),任務(wù)會被放入等待隊(duì)列,處理器執(zhí)行其它任務(wù)。down()函數(shù)如同一個(gè)動(dòng)詞“降低down,一次down()操作就等于獲取該信號量。相反,當(dāng)臨界區(qū)中的操作完成后,up()操
45、作用來釋放信號量,該操作也被稱作是“提升upping信號量,因?yàn)樗鼤黾有盘柫康挠?jì)數(shù)值。如果在該信號量上的等待隊(duì)列不為空,處于隊(duì)列中等待的任務(wù)在被喚醒的同時(shí)會獲得該信號量。4、申明一個(gè)信號量,并給出如何使用它。答:定義:struct semaphore atomic_t count; int sleepers; wait_queue_head_t wait; 使用:static DECLARE_MUTEX(mr_sem);*聲明并初始化互斥信號量*/if(!down_interruptible(&mr_sem)/* 信號被接收 , 信號量還未獲取 */*臨界區(qū)*/up(&mr_
46、sem); 5、自旋鎖和信號量各用在什么情況下?低開銷加鎖 優(yōu)先使用自旋鎖 短期鎖定 優(yōu)先使用自旋鎖 長期加鎖 優(yōu)先使用信號量 中斷上下文中加鎖 使用自旋鎖 持有鎖時(shí)需要睡眠、調(diào)度 使用信號量 第八章 文件系統(tǒng)1、什么是軟鏈接和硬鏈接?二者有何區(qū)別?答:軟鏈接符號鏈接symbolic link是一種特殊的文件,這種文件包含了另一個(gè)文件的任意一個(gè)路徑名。這個(gè)路徑名指向位于任意一個(gè)文件系統(tǒng)的任意文件,甚至可以指向一個(gè)不存在的文件。硬鏈接(hard link)讓一個(gè)文件對應(yīng)一個(gè)或多個(gè)文件名,或者說把我們使用的文件名和文件系統(tǒng)使用的節(jié)點(diǎn)號鏈接起來,這些文件名可以在同一目錄或不同目錄2、什么是虛擬文件系
47、統(tǒng)?什么是虛擬文件系統(tǒng)界面?答:為了支持其他各種不同的文件系統(tǒng),Linux提供了一種統(tǒng)一的框架,就是所謂的虛擬文件系統(tǒng)轉(zhuǎn)換Virtual Filesystem Switch,簡稱虛擬文件系統(tǒng)(VFS)。虛擬文件系統(tǒng)所提供的抽象界面主要由一組標(biāo)準(zhǔn)的、抽象的操作構(gòu)成,例如read()、write()、lseek等,這些函數(shù)以系統(tǒng)調(diào)用的形式供用戶程序調(diào)用。這樣,用戶程序調(diào)用這些系統(tǒng)調(diào)用時(shí),根本無需關(guān)心所操作的文件屬于哪個(gè)文件系統(tǒng),這個(gè)文件系統(tǒng)是怎樣設(shè)計(jì)和實(shí)現(xiàn)的。3、以wirte()系統(tǒng)調(diào)用為例,說明VFS是如何與具體文件系統(tǒng)如DOS的FAT相結(jié)合的?答:Linux的目錄建立了一棵根目錄為“/ 的樹。
48、根目錄包含在根文件系統(tǒng)中,在Linux 中,這個(gè)根文件系統(tǒng)通常就是 Ext2類型。其他所有的文件系統(tǒng)都可以被“安裝在根文件系統(tǒng)的子目錄中。例如,用戶可以通過“mount命令,將DOS格式的磁盤分區(qū)即FAT文件系統(tǒng)安裝到Linux系統(tǒng)中,然后,用戶就可以像訪問Ext2文件一樣訪問DOS的文件。 4、內(nèi)核如何組織索引結(jié)點(diǎn)?為什么要設(shè)置多個(gè)鏈表管理索引結(jié)點(diǎn)?答:內(nèi)核使用如下的數(shù)據(jù)庫來自組織索引節(jié)點(diǎn)。struct inode struct list_head i_hash; *指向哈希鏈表的指針*/struct list_head i_list; /*指向索引節(jié)點(diǎn)鏈表的指針*/struct list_head i_dentry;/*指向目錄項(xiàng)鏈表的指針*/unsigned long i_ino; /*索引節(jié)點(diǎn)號*/kdev_t i_dev; /*設(shè)備標(biāo)識號 */umode_t i_mode; /*文件的類型與訪問權(quán)限 */nlink_t i_nlink; /*與該節(jié)點(diǎn)建立鏈接的文件數(shù) */uid_t i_uid; /*文件擁有者標(biāo)識號*/gid_t i_gid; /*文件擁有者所在組的標(biāo)識號*/*用于索引節(jié)點(diǎn)操作的域*/struct inode_operations *i_op; /*索引節(jié)點(diǎn)的操作*/str
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 實(shí)習(xí)護(hù)士的心得體會15篇
- 物流實(shí)習(xí)報(bào)告范文集合5篇
- 畢業(yè)典禮學(xué)校領(lǐng)導(dǎo)代表講話稿篇
- 年度銷售工作計(jì)劃模板8篇
- 公司實(shí)習(xí)報(bào)告范文9篇
- 北師大版八年級上冊數(shù)學(xué)期末考試試卷及答案
- 九年級語文下冊 第六單元 23《詩詞曲五首》白雪歌送武判官歸京教學(xué)實(shí)錄 新人教版
- 植樹節(jié)日作文600字范文
- 學(xué)生會面試自我介紹匯編15篇
- 教師個(gè)人工作計(jì)劃(集合15篇)
- 低空經(jīng)濟(jì)的商業(yè)化路徑分析
- 項(xiàng)目年終總結(jié)及明年計(jì)劃
- 新外貿(mào)業(yè)務(wù)員年終總結(jié)
- 化工廠設(shè)備安裝施工方案
- 國家電網(wǎng)公司招聘高校畢業(yè)生應(yīng)聘登記表
- 代賬公司會計(jì)主管年終總結(jié)
- 創(chuàng)新思維訓(xùn)練學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 2024年一級注冊消防工程師考試復(fù)習(xí)題庫100題及答案(一)
- 定向羅盤項(xiàng)目可行性實(shí)施報(bào)告
- 學(xué)術(shù)基本要素:專業(yè)論文寫作學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 2024年《中華人民共和國監(jiān)察法》知識測試題庫及答案
評論
0/150
提交評論