Linux復(fù)習(xí)大匯總_第1頁(yè)
Linux復(fù)習(xí)大匯總_第2頁(yè)
Linux復(fù)習(xí)大匯總_第3頁(yè)
Linux復(fù)習(xí)大匯總_第4頁(yè)
Linux復(fù)習(xí)大匯總_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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)化過(guò)程中出現(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的遞歸縮寫(xiě),是自由軟件基金會(huì)的一個(gè)工程。GNU工程產(chǎn)品包括emacs編輯器、著名的GNU C和Gcc編譯器等,這些軟件叫做GNU軟件。GNU軟件和派

2、生工作均適用GNU通用公共許可證,即GPLGeneral Public License。Linux的開(kāi)發(fā)使用了眾多的GUN工具。3、Linux系統(tǒng)由哪些局部組成?Linux內(nèi)核處于什么位置?答:(1)符合POSIX標(biāo)準(zhǔn)的操作系統(tǒng)內(nèi)核、Shell和外圍工具。(2)C語(yǔ)言編譯器和其他開(kāi)發(fā)工具及函數(shù)庫(kù)。(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、請(qǐng)用C語(yǔ)言描述段描述符表。答:#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ī)制又巧妙的繞過(guò)段機(jī)制的?在內(nèi)核代碼中如何表示各種段,查找最新源代碼并進(jìn)行閱讀和分析。答:IA32規(guī)定段機(jī)制是不可禁止的,因此不可能繞過(guò)它直接給出線性地址空間的地址。萬(wàn)般無(wú)奈之下,Linux的設(shè)計(jì)人員干脆讓段的基地址為0,而段的界限為4GB,這時(shí)任意給出一個(gè)偏移量,那么等式為“0+偏移量=線性地址,也就是說(shuō)“

13、偏移量線性地址。另外由于段機(jī)制規(guī)定“偏移量 < 4GB,所以偏移量的范圍為0HFFFFFFFFH,這恰好是線性地址空間范圍,也就是說(shuō)虛擬地址直接映射到了線性地址,我們以后所提到的虛擬地址和線性地址指的也就是同一地址。看來(lái),Linux在沒(méi)有回避段機(jī)制的情況下巧妙地把段機(jī)制給繞過(guò)去了。另外,由于IA32段機(jī)制還規(guī)定,必須為代碼段和數(shù)據(jù)段創(chuàng)立不同的段,所以Linux必須為代碼段和數(shù)據(jù)段分別創(chuàng)立一個(gè)基地址為0,段界限為4GB的段描述符。不僅如此,由于Linux內(nèi)核運(yùn)行在特權(quán)級(jí)0,而用戶程序運(yùn)行在特權(quán)級(jí)別3,根據(jù)IA32的段保護(hù)機(jī)制規(guī)定,特權(quán)級(jí)3的程序是無(wú)法訪問(wèn)特權(quán)級(jí)為0的段的,所以Linux必須

14、為內(nèi)核和用戶程序分別創(chuàng)立其代碼段和數(shù)據(jù)段。這就意味著Linux必須創(chuàng)立4個(gè)段描述符特權(quán)級(jí)0的代碼段和數(shù)據(jù)段,特權(quán)級(jí)3的代碼段和數(shù)據(jù)段。5、為什么在設(shè)計(jì)兩級(jí)頁(yè)表的線性地址結(jié)構(gòu)時(shí),給頁(yè)目錄和頁(yè)表各分配10位?如果不是這樣,舉例說(shuō)明會(huì)產(chǎn)生什么樣的結(jié)果?答:所謂兩級(jí)頁(yè)表就是對(duì)頁(yè)表再進(jìn)行分頁(yè)。第一級(jí)稱為頁(yè)目錄,其中存放的是關(guān)于頁(yè)表的信息。4MB的頁(yè)表再次分頁(yè)4MB4K可以分為1K個(gè)頁(yè),同樣對(duì)每個(gè)頁(yè)的描述需要4個(gè)字節(jié),于是可以算出頁(yè)目錄最多占用4KB個(gè)字節(jié),正好是一個(gè)頁(yè),其示意圖如2.9所示。頁(yè)目錄共有1K個(gè)表項(xiàng), 于是,線性地址的最高10位(即22位 31位)用來(lái)產(chǎn)生第一級(jí)的索引。兩級(jí)表結(jié)構(gòu)的第二級(jí)稱為

15、頁(yè)表,每個(gè)頁(yè)表也剛好存放在一個(gè)4K字節(jié)的頁(yè)中,包含1K個(gè)字節(jié)的表項(xiàng)。第二級(jí)頁(yè)表由線性地址的中間10位(即21位 12位)進(jìn)行索引,最低12位表示頁(yè)內(nèi)偏量。 舉例:如果頁(yè)目錄占用3124位,頁(yè)表項(xiàng)占用2312位,偏移地址占110位,那么有28個(gè)頁(yè)表項(xiàng),一個(gè)頁(yè)面有2124k個(gè)表項(xiàng),每個(gè)表項(xiàng)大小為4字節(jié),212的范圍為4頁(yè)面,而不是以一個(gè)頁(yè)面為準(zhǔn)。6、深入理解圖2.12,并結(jié)合圖表達(dá)線性地址到物理地址的轉(zhuǎn)換。答:第一步,用32位線性地址的最高10位第3122位作為頁(yè)目錄項(xiàng)的索引,將它乘以4,與CR3中的頁(yè)目錄的起始地址相加,獲得相應(yīng)目錄項(xiàng)在內(nèi)存的地址。第二步,從這個(gè)地址開(kāi)始讀取32位頁(yè)目錄項(xiàng),取出其

16、高20位,再給低12位補(bǔ)0,形成的32位就是頁(yè)表在內(nèi)存的起始地址。第三步,用32位線性地址中的第2112位作為頁(yè)表中頁(yè)表項(xiàng)的索引,將它乘以4,與頁(yè)表的起始地址相加,獲得相應(yīng)頁(yè)表項(xiàng)在內(nèi)存的地址。第四步,從這個(gè)地址開(kāi)始讀取32位頁(yè)表項(xiàng),取出其高20位,再將線性地址的第110位放在低12位,形成最終32位頁(yè)面物理地址。 第三章 進(jìn)程1、什么是進(jìn)程控制塊?它包含哪些根本信息? 答:對(duì)進(jìn)程進(jìn)行全面描述的數(shù)據(jù)結(jié)構(gòu),Linux中把對(duì)進(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),用它來(lái)記錄進(jìn)程的外部特征,描述進(jìn)程的運(yùn)動(dòng)變化過(guò)程。系統(tǒng)利用PCB來(lái)控制和管理進(jìn)程,所以PCB是系統(tǒng)感知進(jìn)程存在的唯一標(biāo)志。進(jìn)程與PCB是一一對(duì)應(yīng)的。包含的根本信息:(1)狀態(tài)信息描述進(jìn)程動(dòng)態(tài)的變化。(2)鏈接信息描述進(jìn)程的父子關(guān)系。(3)各種標(biāo)識(shí)符用簡(jiǎn)單數(shù)字對(duì)進(jìn)程進(jìn)行標(biāo)識(shí)。(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)先級(jí)、調(diào)度策略等信息。(7)文件系統(tǒng)信息對(duì)進(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中存放的是棧頂指針,請(qǐng)用三句匯編語(yǔ)句描述如何獲得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。為了能有效的對(duì)它們加以管理,應(yīng)該用適當(dāng)?shù)姆绞綄⑦@些PCB組織起來(lái)。5、請(qǐng)編寫(xiě)內(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、什么是寫(xiě)時(shí)復(fù)制技術(shù),這種技術(shù)在什么情況下最能發(fā)揮其優(yōu)勢(shì)?答:父進(jìn)程和子進(jìn)程共享頁(yè)面而不是復(fù)制頁(yè)面。然而,只要頁(yè)面被共享,它們就不能被修改。無(wú)論父進(jìn)程和子進(jìn)程何時(shí)試圖寫(xiě)一個(gè)共享的頁(yè)面,就產(chǎn)生一個(gè)錯(cuò)誤,這時(shí)內(nèi)核就把這個(gè)頁(yè)復(fù)制到一個(gè)新的頁(yè)面中并標(biāo)記為可寫(xiě)。原

21、來(lái)的頁(yè)面仍然是寫(xiě)保護(hù)的:當(dāng)其它進(jìn)程試圖寫(xiě)入時(shí),內(nèi)核檢查寫(xiě)進(jìn)程是否是這個(gè)頁(yè)面的唯一屬主;如果是,它把這個(gè)頁(yè)面標(biāo)記為對(duì)這個(gè)進(jìn)程是可寫(xiě)的。采用這種技術(shù),顯然只有預(yù)測(cè)到將要修改的頁(yè)才會(huì)被復(fù)制,而且必須被復(fù)制,不然的話,就會(huì)破壞父進(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)程沒(méi)有什么兩樣。10、用fork寫(xiě)一個(gè)簡(jiǎn)單的測(cè)試程序,從父進(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開(kāi)始的地方,內(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)行,被引用的程序局部會(huì)由操作系統(tǒng)裝入到物理內(nèi)存,這種將映像鏈接到進(jìn)程用戶空間的方法被稱為“虛存映射,也就是把文件從磁盤映射到進(jìn)程的用戶空間,這樣把對(duì)文件的訪問(wèn)轉(zhuǎn)化為對(duì)虛存區(qū)的訪問(wèn)。有兩種類型的虛存映射:1共享的:有幾個(gè)進(jìn)程共享這一映射,也就是說(shuō),如果一個(gè)進(jìn)程對(duì)共享的虛存區(qū)進(jìn)行寫(xiě),其它進(jìn)程都能感覺(jué)到,而且會(huì)修改磁盤上對(duì)應(yīng)的文件。2私有的:進(jìn)程創(chuàng)立的這種映射只是為了讀文件,而不是寫(xiě)文件,因此,對(duì)虛存區(qū)的寫(xiě)操作不會(huì)修改磁盤上的文件,由此可以看出,私有映射的效率要比共享映射的高。 除了這兩種映射外,如果映

25、射與文件無(wú)關(guān),就叫匿名映射。5、一個(gè)進(jìn)程一般包含哪些虛存區(qū)?舉例說(shuō)明。6、說(shuō)明mmap()系統(tǒng)調(diào)用的功能?利用mmap()寫(xiě)一個(gè)拷貝文件的程序。答:mmap()系統(tǒng)調(diào)用時(shí)通過(guò)調(diào)用do_mmap內(nèi)核函數(shù)來(lái)實(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)“請(qǐng)求調(diào)頁(yè)的?答:1)如果被訪問(wèn)的頁(yè)不在內(nèi)存,也就是說(shuō),這個(gè)頁(yè)還沒(méi)有被存放在任何一個(gè)物理頁(yè)面中,那么,內(nèi)核分配一個(gè)新的頁(yè)面并將其適當(dāng)?shù)爻跏蓟?,這種技術(shù)稱為“請(qǐng)求調(diào)頁(yè);2)“請(qǐng)求調(diào)頁(yè)是一種

27、動(dòng)態(tài)內(nèi)存分配技術(shù),它將頁(yè)面的分配推遲到不能再推遲為止,也就是說(shuō),一直推遲到進(jìn)程要訪問(wèn)的頁(yè)不在物理內(nèi)存時(shí)為止,由此引起一個(gè)缺頁(yè)異常;該技術(shù)的引入主要是因?yàn)檫M(jìn)程開(kāi)始運(yùn)行時(shí)并不訪問(wèn)其地址空間中的全部地址。8、試表達(dá)伙伴算法的工作原理,并說(shuō)明為什么伙伴算法可以消除外碎片?答:假設(shè)要求分配的塊其大小為128個(gè)頁(yè)面。該算法先在塊大小為128個(gè)頁(yè)面的鏈表中查找,看是否有這樣一個(gè)空閑塊。如果有,就直接分配;如果沒(méi)有,該算法會(huì)查找下一個(gè)更大的塊,具體地說(shuō),就是在塊大小為256個(gè)頁(yè)面的鏈表中查找一個(gè)空閑塊。如果存在這樣的空閑塊,內(nèi)核就把這256個(gè)頁(yè)面分為兩等份,一份分配出去,另一份插入到塊大小為128個(gè)頁(yè)面的鏈表

28、中。如果在塊大小為256個(gè)頁(yè)面的鏈表中也沒(méi)有找到空閑頁(yè)塊,就繼續(xù)找更大的塊,即512個(gè)頁(yè)面的塊。如果存在這樣的塊,內(nèi)核就從512個(gè)頁(yè)面的塊中分出128個(gè)頁(yè)面滿足請(qǐng)求,然后從384個(gè)頁(yè)面中取出256個(gè)頁(yè)面插入到塊大小為256個(gè)頁(yè)面的鏈表中。然后把剩余的128個(gè)頁(yè)面插入到塊大小為128個(gè)頁(yè)面的鏈表中。如果512個(gè)頁(yè)面的鏈表中還沒(méi)有空閑塊,該算法就放棄分配,并發(fā)出出錯(cuò)信號(hào)。9、vmalloc()和kmalloc()有何區(qū)別?編寫(xiě)內(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()在分配過(guò)程中須更新內(nèi)核頁(yè)表 #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)為怎樣換出頁(yè)面比擬合理?答:為了防止在CPU忙碌的時(shí)候,也就是在缺頁(yè)異常發(fā)生時(shí),臨時(shí)搜索可供換出的內(nèi)存頁(yè)面并加以換出,Linux內(nèi)核定期地檢查系統(tǒng)內(nèi)的空閑頁(yè)面數(shù)是否小于預(yù)定義的極限,一旦發(fā)現(xiàn)空閑頁(yè)面數(shù)太少,就預(yù)先將假設(shè)干頁(yè)面換出,以減輕缺頁(yè)異常發(fā)生時(shí)系統(tǒng)所承受的負(fù)擔(dān)。當(dāng)然,由于無(wú)法確切地預(yù)測(cè)頁(yè)面的使用,即使這樣做了也還可能出現(xiàn)缺頁(yè)異常發(fā)生時(shí)內(nèi)存依然沒(méi)有足夠的空閑頁(yè)面

32、。但是,預(yù)換出畢竟能減少空閑頁(yè)面不夠用的概率。并且通過(guò)選擇適當(dāng)?shù)膮?shù)如每隔多久換出一次,每次換出多少頁(yè),可以使臨時(shí)尋找要換出頁(yè)面的情況很少發(fā)生。為此,Linux內(nèi)核設(shè)置了一個(gè)定期將頁(yè)面換出的守護(hù)進(jìn)程kswapd。第五章 中斷和異常1、什么是中斷向量?Linux是如何分配中斷向量的?答:每個(gè)中斷源都被分配一個(gè)8位無(wú)符號(hào)整數(shù)作為類型碼,即中斷向量Linux對(duì)256個(gè)向量的分配如下:(1)從031的向量對(duì)應(yīng)于異常和非屏蔽中斷。(2)從3247的向量即由I/O設(shè)備引起的中斷分配給屏蔽中斷。(3)剩余的從48255的向量用來(lái)標(biāo)識(shí)軟中斷。Linux只用了其中的一個(gè)即128或0x80向量用來(lái)實(shí)現(xiàn)系統(tǒng)調(diào)用。

33、3、如何對(duì)中斷描述符表進(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è)置通過(guò)_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)用程序訪問(wèn)特殊的陷阱門或中斷門。當(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)級(jí)沒(méi)有發(fā)生變化,那么壓入棧中的內(nèi)容如圖5.

35、4中。此時(shí),CS:EIP的值就是IDT表中第i項(xiàng)門描述符的段選擇符和偏移量的值,于是,CPU就跳轉(zhuǎn)到了中斷或異常處理程序。 分兩步進(jìn)行有效性檢查:首先是“段級(jí)檢查,將CPU的當(dāng)前特權(quán)級(jí)CPL存放在CS存放器的最低兩位與IDT中第i項(xiàng)段選擇符中的DPL相比擬,如果DPL3大于CPL0,就產(chǎn)生一個(gè)“通用保護(hù)異常,因?yàn)橹袛嗵幚沓绦虻奶貦?quán)級(jí)不能低于引起中斷的進(jìn)程的特權(quán)級(jí)。這種情況發(fā)生的可能性不大,因?yàn)橹袛嗵幚沓绦蛞话氵\(yùn)行在內(nèi)核態(tài),其特權(quán)級(jí)為0。然后是“門級(jí)檢查,把CPL與IDT中第i個(gè)門的DPL相比擬,如果CPL大于DPL,也就是當(dāng)前特權(quán)級(jí)3小于這個(gè)門的特權(quán)級(jí)0,CPU就不能“穿過(guò)這個(gè)門,于是產(chǎn)生一個(gè)

36、“通用保護(hù)異常,這是為了防止用戶應(yīng)用程序訪問(wèn)特殊的陷阱門或中斷門。但是請(qǐng)注意,這種“門級(jí)檢查是針對(duì)一般的用戶程序,而不包括外部I/O產(chǎn)生的中斷或因CPU內(nèi)部異常而產(chǎn)生的異常,也就是說(shuō),如果產(chǎn)生了中斷或異常,就免去了“門級(jí)檢查。6、中斷處理程序和中斷效勞程序有何區(qū)別?Linux如何描述一條共享的中斷線?答:中斷效勞程序ISR與中斷處理程序是兩個(gè)不同的概念。在Linux中,15條中斷線對(duì)應(yīng)15個(gè)中斷處理程序。具體來(lái)說(shuō),中斷處理程序相當(dāng)于某個(gè)中斷向量的總處理程序,例如IRQ0x05_interrupt()是中斷號(hào)為5向量為37的總處理程序,如果這個(gè)5號(hào)中斷由網(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、為什么把中斷分為兩局部來(lái)處理?答:中斷效勞例程一般都是在中斷請(qǐng)求關(guān)閉的條件下執(zhí)行的,以防止嵌套而使中斷控制復(fù)雜化。但是,中斷是一個(gè)隨機(jī)事件,它隨時(shí)會(huì)到來(lái),如果關(guān)中斷的時(shí)間太長(zhǎng),CPU就不能及時(shí)響應(yīng)其他的

38、中斷請(qǐng)求,從而造成中斷的喪失。因此,內(nèi)核的目標(biāo)就是盡可能快的處理完中斷請(qǐng)求,盡其所能把更多的處理向后推遲。例如,假設(shè)一個(gè)數(shù)據(jù)塊已經(jīng)到達(dá)了網(wǎng)線,當(dāng)中斷控制器接受到這個(gè)中斷請(qǐng)求信號(hào)時(shí),Linux內(nèi)核只是簡(jiǎn)單地標(biāo)志數(shù)據(jù)到來(lái)了,然后讓處理器恢復(fù)到它以前運(yùn)行的狀態(tài),其余的處理稍后再進(jìn)行如把數(shù)據(jù)移入一個(gè)緩沖區(qū),接受數(shù)據(jù)的進(jìn)程就可以在緩沖區(qū)找到數(shù)據(jù)。因此,內(nèi)核把中斷處理分為兩局部:前半局部top half和后半局部bottom half,前半局部?jī)?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)通過(guò)讀取RTC來(lái)初始化OS時(shí)鐘,此后二者保持同步運(yùn)行,共同維持著系統(tǒng)時(shí)間。所謂同步,是指操作系統(tǒng)在運(yùn)行過(guò)程中,每隔一個(gè)固定時(shí)間會(huì)刷新或校正RTC中的信息10、jiffies表示什么?什么時(shí)候?qū)ζ湓黾??答:jiffies是Linux內(nèi)核中的一個(gè)全局變量,用它來(lái)表示系統(tǒng)自啟動(dòng)以來(lái)的時(shí)鐘節(jié)拍總數(shù)。啟動(dòng)時(shí),內(nèi)核將該變量初始化為0,此后,每次時(shí)鐘中斷處理程序都會(huì)增加該變量的值。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ù)接著會(huì)調(diào)用update_times()函數(shù)更新墻上時(shí)鐘。第六章 系統(tǒng)調(diào)用1、系統(tǒng)調(diào)用與庫(kù)函數(shù)、系統(tǒng)命令及內(nèi)核函數(shù)有什么區(qū)別和聯(lián)系?答:應(yīng)用編程接口(API)其實(shí)是一個(gè)函數(shù)定義, 比方常見(jiàn)的read()、malloc()、free、abs()函數(shù)等,這些函數(shù)說(shuō)明了如何獲得一個(gè)給定的效勞;而系統(tǒng)調(diào)用是通過(guò)軟中斷向內(nèi)核發(fā)出一個(gè)明確的請(qǐng)求。從編程者的觀點(diǎn)看,API和系統(tǒng)調(diào)用之間沒(méi)有什么差異,二者關(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ù)庫(kù)中實(shí)現(xiàn)的。系統(tǒng)命令相對(duì)應(yīng)用編程接口更高一層,每個(gè)系統(tǒng)命令都是一個(gè)可執(zhí)行程序,比方常用的系統(tǒng)命令ls、hostname等,這些命令的實(shí)現(xiàn)調(diào)用了系統(tǒng)調(diào)用。內(nèi)核函數(shù)與普通函數(shù)形式上沒(méi)有什么區(qū)別,只不過(guò)前者在內(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)用會(huì)找到各自對(duì)應(yīng)的內(nèi)核函數(shù)。2、內(nèi)核為什么要設(shè)置系統(tǒng)調(diào)用處理程序,它與效勞例程有什么區(qū)別?答:用戶空間的程序無(wú)法直接執(zhí)行內(nèi)核代碼,內(nèi)

42、核駐留在受保護(hù)的地址空間上,不允許用戶進(jìn)程內(nèi)核地址空間上讀寫(xiě)。當(dāng)用戶態(tài)的進(jìn)程調(diào)用一個(gè)系統(tǒng)調(diào)用時(shí),CPU切換到內(nèi)核態(tài)并開(kā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ù)來(lái)處理系統(tǒng)調(diào)用;通過(guò)ret_from_sys_call( )函數(shù)從系統(tǒng)調(diào)用返回;不同的系統(tǒng)調(diào)用會(huì)找到各自對(duì)應(yīng)的內(nèi)核函數(shù),這些內(nèi)核函數(shù)被稱為系統(tǒng)調(diào)用的“效勞例程。3、說(shuō)明系統(tǒng)調(diào)用號(hào)的作用。答:因?yàn)閮?nèi)核實(shí)現(xiàn)了很多不同的系統(tǒng)調(diào)用,因此進(jìn)程必須傳遞一個(gè)叫做系統(tǒng)調(diào)用號(hào)的參數(shù)來(lái)識(shí)別所需的系統(tǒng)調(diào)用;第七章 內(nèi)核中的同步1、什么事臨界區(qū)?什么是競(jìng)爭(zhēng)狀態(tài)?什么是同步?答:臨界區(qū)

43、critical regions就是訪問(wèn)和操作共享數(shù)據(jù)的代碼段,這段代碼必須被原子地執(zhí)行。競(jìng)爭(zhēng)狀態(tài)是多個(gè)內(nèi)核任務(wù)同時(shí)訪問(wèn)同一臨界區(qū)。防止并發(fā)和防止競(jìng)爭(zhēng)狀態(tài)稱為同步synchronization 2、內(nèi)核中造成并發(fā)執(zhí)行的原因是什么?答:1中斷中斷幾乎可以在任何時(shí)刻異步發(fā)生,也可能隨時(shí)打斷正在執(zhí)行的代碼。2內(nèi)核搶占假設(shè)內(nèi)核具有搶占性,內(nèi)核中的任務(wù)就可能會(huì)被另一任務(wù)搶占3睡眠及與用戶空間的同步在內(nèi)核執(zhí)行的進(jìn)程可能會(huì)睡眠,這將喚醒調(diào)度程序,導(dǎo)致調(diào)度一個(gè)新的用戶進(jìn)程執(zhí)行4對(duì)稱多處理兩個(gè)或多個(gè)處理器可以同時(shí)執(zhí)行代碼3、給出信號(hào)量的定義,并說(shuō)明down()和up()的含義。答:信號(hào)量是在1968年由Edsg

44、er Wybe DijKstra提出的,此后它逐漸成為一種常用的鎖機(jī)制。信號(hào)量支持兩個(gè)原子操作P()和V(),這兩個(gè)名字來(lái)自荷蘭語(yǔ) Proberen和Vershogen。前者做測(cè)試操作字面意思是探查,后者叫做增加操作。后來(lái)的系統(tǒng)把這兩種操作分別叫做down()和up(),Linux也遵從這種叫法。down()操作通過(guò)對(duì)信號(hào)量計(jì)數(shù)減1來(lái)請(qǐng)求獲得一個(gè)信號(hào)量。如果結(jié)果是0或大于0,信號(hào)量鎖被獲得,任務(wù)就可以進(jìn)入臨界區(qū)了。如果結(jié)果是負(fù)數(shù),任務(wù)會(huì)被放入等待隊(duì)列,處理器執(zhí)行其它任務(wù)。down()函數(shù)如同一個(gè)動(dòng)詞“降低down,一次down()操作就等于獲取該信號(hào)量。相反,當(dāng)臨界區(qū)中的操作完成后,up()操

45、作用來(lái)釋放信號(hào)量,該操作也被稱作是“提升upping信號(hào)量,因?yàn)樗鼤?huì)增加信號(hào)量的計(jì)數(shù)值。如果在該信號(hào)量上的等待隊(duì)列不為空,處于隊(duì)列中等待的任務(wù)在被喚醒的同時(shí)會(huì)獲得該信號(hào)量。4、申明一個(gè)信號(hào)量,并給出如何使用它。答:定義:struct semaphore atomic_t count; int sleepers; wait_queue_head_t wait; 使用:static DECLARE_MUTEX(mr_sem);*聲明并初始化互斥信號(hào)量*/if(!down_interruptible(&mr_sem)/* 信號(hào)被接收 , 信號(hào)量還未獲取 */*臨界區(qū)*/up(&mr_

46、sem); 5、自旋鎖和信號(hào)量各用在什么情況下?低開(kāi)銷加鎖 優(yōu)先使用自旋鎖 短期鎖定 優(yōu)先使用自旋鎖 長(zhǎng)期加鎖 優(yōu)先使用信號(hào)量 中斷上下文中加鎖 使用自旋鎖 持有鎖時(shí)需要睡眠、調(diào)度 使用信號(hào)量 第八章 文件系統(tǒng)1、什么是軟鏈接和硬鏈接?二者有何區(qū)別?答:軟鏈接符號(hào)鏈接symbolic link是一種特殊的文件,這種文件包含了另一個(gè)文件的任意一個(gè)路徑名。這個(gè)路徑名指向位于任意一個(gè)文件系統(tǒng)的任意文件,甚至可以指向一個(gè)不存在的文件。硬鏈接(hard link)讓一個(gè)文件對(duì)應(yīng)一個(gè)或多個(gè)文件名,或者說(shuō)把我們使用的文件名和文件系統(tǒng)使用的節(jié)點(diǎn)號(hào)鏈接起來(lái),這些文件名可以在同一目錄或不同目錄2、什么是虛擬文件系

47、統(tǒng)?什么是虛擬文件系統(tǒng)界面?答:為了支持其他各種不同的文件系統(tǒng),Linux提供了一種統(tǒng)一的框架,就是所謂的虛擬文件系統(tǒng)轉(zhuǎn)換Virtual Filesystem Switch,簡(jiǎn)稱虛擬文件系統(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í),根本無(wú)需關(guān)心所操作的文件屬于哪個(gè)文件系統(tǒng),這個(gè)文件系統(tǒng)是怎樣設(shè)計(jì)和實(shí)現(xiàn)的。3、以wirte()系統(tǒng)調(diào)用為例,說(shuō)明VFS是如何與具體文件系統(tǒng)如DOS的FAT相結(jié)合的?答:Linux的目錄建立了一棵根目錄為“/ 的樹(shù)。

48、根目錄包含在根文件系統(tǒng)中,在Linux 中,這個(gè)根文件系統(tǒng)通常就是 Ext2類型。其他所有的文件系統(tǒng)都可以被“安裝在根文件系統(tǒng)的子目錄中。例如,用戶可以通過(guò)“mount命令,將DOS格式的磁盤分區(qū)即FAT文件系統(tǒng)安裝到Linux系統(tǒng)中,然后,用戶就可以像訪問(wèn)Ext2文件一樣訪問(wèn)DOS的文件。 4、內(nèi)核如何組織索引結(jié)點(diǎn)?為什么要設(shè)置多個(gè)鏈表管理索引結(jié)點(diǎn)?答:內(nèi)核使用如下的數(shù)據(jù)庫(kù)來(lái)自組織索引節(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)號(hào)*/kdev_t i_dev; /*設(shè)備標(biāo)識(shí)號(hào) */umode_t i_mode; /*文件的類型與訪問(wèn)權(quán)限 */nlink_t i_nlink; /*與該節(jié)點(diǎn)建立鏈接的文件數(shù) */uid_t i_uid; /*文件擁有者標(biāo)識(shí)號(hào)*/gid_t i_gid; /*文件擁有者所在組的標(biāo)識(shí)號(hào)*/*用于索引節(jié)點(diǎn)操作的域*/struct inode_operations *i_op; /*索引節(jié)點(diǎn)的操作*/str

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論