中國科學(xué)院大學(xué)操作系統(tǒng)考試思考題答案_第1頁
中國科學(xué)院大學(xué)操作系統(tǒng)考試思考題答案_第2頁
中國科學(xué)院大學(xué)操作系統(tǒng)考試思考題答案_第3頁
中國科學(xué)院大學(xué)操作系統(tǒng)考試思考題答案_第4頁
中國科學(xué)院大學(xué)操作系統(tǒng)考試思考題答案_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

經(jīng)典word整理文檔,僅參考,雙擊此處可刪除頁眉頁腳。本資料屬于網(wǎng)絡(luò)整理,如有侵權(quán),請聯(lián)系刪除,謝謝!1.為什么計算機啟動最開始的時候執(zhí)行的是BIOS代碼而不是操作系統(tǒng)自身的代碼?答:通常我們用C語言寫的用戶程序,必須在操作系統(tǒng)的平臺上執(zhí)行,即操作作最開始的部分,就是由bios程序來實現(xiàn)的。所以計算機啟動最開始執(zhí)行的是bios代碼2.為什么BIOS只加載了一個扇區(qū),后續(xù)扇區(qū)卻是由bootsect代碼加載?為什么BIOS沒有把所有需要加載的扇區(qū)都加載?答:對BIOS啟動扇區(qū)把代碼加載到0x7c00這個位置。后續(xù)扇區(qū)則由bootsect代碼加載,這些代碼由編寫系統(tǒng)的用戶負(fù)責(zé),與BIOS無關(guān)。這樣構(gòu)建的好處是站在整個體系的高度,統(tǒng)一設(shè)計和統(tǒng)一安排,簡單而有效。BIOS和操作系統(tǒng)的開發(fā)都可BIOS可以不用知道內(nèi)核鏡像的大小以及其在軟盤的分布等等信息,減輕了BIOS程序的復(fù)雜度,降低了硬更為靈活。另外,如果要使用BIOS進行加載,而且加載完成之后再執(zhí)行,則需要很長的時間,因此Linux采用的是邊執(zhí)行邊加載的方法。3.為什么BIOS把bootsect加載到0x07c00,而不是0x00000?加載后又馬上挪到0x90000處,是何道理?為什么不一次加載到位?BIOS首先會把中斷向量表加載到0x000000x003ff的1KB的內(nèi)存空間,在加載bootsect時約定加載到0x07c00處,符合內(nèi)存布局,如下。加載之后挪到0x90000處的原因如下:首先內(nèi)核會使用啟動扇區(qū)中的一些數(shù)據(jù),如第508509字節(jié)處的ROOT_DEV;其次,依據(jù)系統(tǒng)對內(nèi)存的規(guī)劃,內(nèi)核占用0x0000開始的空間,因此0x7c00可能會被覆蓋。因為加載到0x07c00是BIOS約定好的,操作系統(tǒng)只能遵守這個約定。4.bootsect、setup、head程序之間是怎么銜接的?給出代碼證據(jù)。答:bootsect首先利用int0x13中斷分別加載setup程序及systembootsect程序的任務(wù)完成之后,執(zhí)行jmpi0,SETUPSEG由于bootsect將setup段加載到了SETUPSEG:0的地方,在實模式下,該指令跳轉(zhuǎn)到setup段的第一條指令。setup執(zhí)行了之后,內(nèi)核被移到了0x00000處,系統(tǒng)進入了保護模式,并加載了中斷描述符表和全局描述符表lidtidt_48lgdtgdt_48在保護模式下,一個重要的特征就是根據(jù)GDT決定后續(xù)執(zhí)行哪里的程序。開啟保護模式后,執(zhí)行jmpi0,8根據(jù)保護模式的機制,該指令執(zhí)行后跳轉(zhuǎn)到以GDT第2項中的base_addr為基0base_addr為0head放置在內(nèi)核的頭部,因此程序跳轉(zhuǎn)到head中執(zhí)行5.setup程序里的cli是為了什么?答:cli是關(guān)中斷指令。因為此時需要由16位實模式向32位保護模式轉(zhuǎn)變,即式的中斷機制尚未完成時不允許響應(yīng)中斷,以免發(fā)生未知的錯誤。6.setup程序的最后是jmpi0,8為什么這個8不能簡單的當(dāng)作阿拉伯?dāng)?shù)字8看待?答:這里8要看成二進制1000,最后兩位00表示內(nèi)核特權(quán)級,第三位0表示GDT1表示根據(jù)GDT中的第2項來確定代碼段的段基址和段限長等0x000000000處開始執(zhí)行的,即head的開始位置。注意到已經(jīng)開啟了保護模式的機制,這里的8是保護模式下的段選擇符,而不能當(dāng)成簡單的阿拉伯?dāng)?shù)字8來看待。7.打開A20和打開pe究竟是什么關(guān)系,保護模式不就是32位的嗎?為什么還要打開A20?有必要嗎?答:有必要。A20是cpu的第21位地址線,A20未打開的時候,實模式下的最大尋址為1MB+64KB,而第21根地址線被強制為0,所以相當(dāng)于cpu“回滾”到內(nèi)存地址起始處尋址。打開A20僅僅意味著CPU可以進行32位尋址,且最大尋址空間是,而打開PE是使能保護模式。打開A20是打開PE的必要條件;而打開A20不一定非得打開PE。打開PE是說明系統(tǒng)處于保護模式下,如果不打開A20的話,可以訪問的內(nèi)存只能是奇數(shù)1M段,若要真正在保護模式下工作,必須打開A20,實現(xiàn)32位尋址。8.Linux是用C語言寫的,為什么沒有從main還是開始,而是先運行3個匯編程序,道理何在?答:通常用C語言編寫的程序都是用戶應(yīng)用程序,這類程序的執(zhí)行必須在操作行代碼從硬盤加載到內(nèi)存。BIOS程序在運行,需要借助BIOS分別加載bootsectsetup及system3個程序來IDT和、設(shè)置分頁機制等等,并實現(xiàn)從開機時的16位實模式到main函數(shù)執(zhí)行需要的32位保護模式之間的轉(zhuǎn)換。當(dāng)計算機處在32main的條件才算準(zhǔn)備完畢。9.為什么不用call,而是用main函數(shù)?畫出調(diào)用路線圖,給出代碼證據(jù)。答:CALL指令會將EIP的值自動壓棧,保護返回現(xiàn)場,然后執(zhí)行被調(diào)函數(shù),檔執(zhí)行到被調(diào)函數(shù)的ret指令時,自動出棧給EIPCALLhead程序向mainmain函數(shù)返回的;同時由于main所以要達(dá)到既調(diào)用maincall而是選擇了ret調(diào)用線路圖見P42圖146。代碼如下:(見P36最下面)setup_paging:…ret10.保護模式的“保護”體現(xiàn)在哪里?答:打開了保護模式后,CPU的尋址模式發(fā)生了變化,需要依賴于GDT去獲GDT又防止了代碼段自身的訪問超限,明顯增強了保護作用。同時,保護模式中特權(quán)級的引入對于操作系統(tǒng)內(nèi)核提供了強有力的保護。Intel從硬件上禁止低特權(quán)級代碼段使用一些關(guān)鍵性指令,還提供了機會允許操clisti等對掌控局面TR、LDT是邏輯地址形成線性地址的關(guān)鍵,因此操作系統(tǒng)可以掌控線性地址。物理用戶進程只能使用邏輯地址。11.特權(quán)級的目的和意義是什么?為什么特權(quán)級是基于段的?統(tǒng)的安全性。保護模式中特權(quán)級的引入對于操作系統(tǒng)內(nèi)核提供了強有力的保護。Intel從clisti等對掌控局面至關(guān)重要TRGDTLDT是只能使用邏輯地址。段,數(shù)據(jù)放在一個段,并通過段選擇符(包括CS、SS、DS、ES、FS和GS)點和硬件實現(xiàn)的一種考慮。12.在setup程序里曾經(jīng)設(shè)置過一次head設(shè)置了一個?為什么折騰兩次,而不是一次搞好?答:見P33點評。13.在headidt的前面有184個字節(jié)的head程序的剩余代碼,剩余了什么?為什么要剩余?idt前面有184after_page_tables、ignore_int和setup_paging代碼段,其中after_page_tablesignore_int用做初始化中斷時的中斷處理函數(shù),setup_paging則是初始化分頁。剩余的原因:after_page_tablesmain函數(shù)的跳轉(zhuǎn)做準(zhǔn)備。L6處執(zhí)行。ignore_int為中斷處理函數(shù),使用ignore_int將idt全部初始化,因此如果中斷開啟后,可能使用了未設(shè)置的中斷向量,那么將默認(rèn)跳轉(zhuǎn)到ignore_int處執(zhí)行。這樣做的好處是使得系統(tǒng)不會跳轉(zhuǎn)到隨機的地方執(zhí)行錯誤的代碼,所以ignore_int不能被覆蓋。setup_paging0x0000和0x5000的進行了初始化操作。該代碼需要“剩余”用于跳轉(zhuǎn)到main,即執(zhí)行”ret”指令。14.進程0的task_struct在哪?具體內(nèi)容是什么?給出代碼證據(jù)。答:進程0的task_struct是操作系統(tǒng)設(shè)計者事先寫好的,位于內(nèi)核數(shù)據(jù)區(qū),存儲在user_stack中。因為在進程0boot階段的user_stack)staticuniontask_unioninit_task={INIT_TASK};具體內(nèi)容如下:包含了進程00的0的TSSldt設(shè)置了代碼段和堆棧段的基址和限長(640KB)TSS則保存了各種寄存器的值,包括各個段選擇符。代碼如下:INIT_TASK的定義見P68。15.進程0創(chuàng)建進程11建立了自己的task_struct表,分別位于物理內(nèi)存16MB的頂端倒數(shù)第一頁、第二頁。請問,這個了頁究竟占用的是誰的線性地址空間,內(nèi)核、進程0、進程1、還是沒有占用任何線性地址空間(直接從物理地址分配)?說明理由并給出代碼證據(jù)。答:占用的是內(nèi)核的線性地址空間。先理解清楚,稍后補充)16.假設(shè):經(jīng)過一段時間的運行,操作系統(tǒng)中已經(jīng)有5個進程在運行,且內(nèi)核分別為進程4、進程5分別創(chuàng)建了第一個頁表,這兩個頁表在誰的線性地址空間?用圖表示這兩個頁表在線性地址空間和物理地址空間的映射關(guān)系。答:在內(nèi)核的線性地址空間。圖片自己畫,參考如下圖)17.進程0開始創(chuàng)建進程,調(diào)用了fork代碼執(zhí)行了兩次,第一次,跳過()直接執(zhí)行了for(;;),第二次執(zhí)行fork代碼后,執(zhí)行了goto語句,也沒有看到循環(huán)語句,是什么原因?qū)е路磸?fù)執(zhí)行?請說明理由,并給出代碼證據(jù)。0創(chuàng)建進程1ssespeflags,eip的值壓入了內(nèi)核棧,其中eip的值指向了int0x80的下一條指令。在執(zhí)行fork時,通過0x80號系統(tǒng)調(diào)用,內(nèi)核執(zhí)行copy_process函數(shù),為進程1準(zhǔn)備task_struct1的線性地址空間及物理頁面,其中設(shè)置了進程1的TSS中eax的值為0的寄存器值設(shè)置進程1的ss,esp,eflags,cs,eip。copy_process:p>pid=last_pid;…p>tss.eip=eip;p>tss.eflags=eflags;p>tss.eax=0;…p>tss.esp=esp;…p>tss.cs=cs&0xffff;p>tss.ss=ss&0xffff;…p>state=TASK_RUNNING;returnlast_pid;函數(shù)copy_process的返回值是last_pid,即進程1的pid(pid不為0fork返回到進程0后,進程0判斷返回值非0,因此執(zhí)行代碼for(;;)pause();在sys_pause函數(shù)中,內(nèi)核設(shè)置了進程0的狀態(tài)為,并11進程1在TSS中設(shè)置了eip等寄存器的值,因此從int0x80的下一條指令開始執(zhí)行,且設(shè)定返回eax的值作為fork的返回值(值為01執(zhí)行了init的函數(shù)。導(dǎo)致反復(fù)執(zhí)行,主要是利用了兩個系統(tǒng)調(diào)用sys_fork和sys_pause對進程狀態(tài)的設(shè)置,以及利用了進程調(diào)度機制。18.copy_process函數(shù)的參數(shù)最后五項是:longeip,longcs,longeflags,longesp,longss。查看棧結(jié)構(gòu)確實有這五個參數(shù),奇怪的是其他參數(shù)的壓棧代碼都能找得答:在中,當(dāng)執(zhí)行“int$0x80”時產(chǎn)生一個軟中斷,該中斷使CPU硬件自動將SSESPEFLAGSCSEIP這5個寄存器的數(shù)值按照這個順序壓入進程0的內(nèi)核棧。利用硬件進行壓棧,可以確保eip的值指向正確的指令,以使在中斷返回后,程序能夠繼續(xù)執(zhí)行。19.為什么staticinline_syscall0(type,name)中需要加上關(guān)鍵字inline?答:inline一般是用于定義內(nèi)聯(lián)函數(shù),內(nèi)聯(lián)函數(shù)結(jié)合了函數(shù)以及宏的優(yōu)點,在定代碼會被直接嵌入在它被調(diào)用的地方,這樣省去了函數(shù)調(diào)用時的一些額外開銷,比如保存和恢復(fù)函數(shù)返回地址等,可以加快速度。20.根據(jù)代碼詳細(xì)說明copy_process函數(shù)的所有參數(shù)是如何形成的?函數(shù)參數(shù)可以由函數(shù)定義以外的程序通過壓棧的方式“做”出來。copy_processP83頁、P85頁、P86頁。21.根據(jù)代碼詳細(xì)分析,進程0如何根據(jù)調(diào)度第一次切換到進程1的。答:通過進程0創(chuàng)建進程1,并將其狀態(tài)設(shè)為,fork()函數(shù)執(zhí)行完畢后返回,進入for(;;)pause();在sys_pause()中,將當(dāng)前進程進程的狀態(tài)設(shè)置為然后執(zhí)行schedule()task[]TASK_RUNNING的進程進程,然后切換到進程1執(zhí)行,即switch_to(1)。代碼見P10622.內(nèi)核的線性地址空間是如何分頁的?畫出從0x000000開始的7目錄表、頁表所在頁)的掛接關(guān)系圖,就是頁目錄表的前四個頁目錄項、第一個個頁表的前7個頁表項指向什么位置?給出代碼證據(jù)。45頁空間內(nèi)容全部清零(每頁4項,使之分別指向44第4地址方向填寫4個頁面,依次指向內(nèi)存從高地址向低地址方向的各個頁面。圖見P39(注意要畫出7個頁,參考如下)代碼見P39最下面23.用文字和圖說明中斷描述符表是如何初始化的,可以舉例說明(比如:set_trap_gate(0,÷_error)答:以set_trap_gate(0,÷_error)為例,其中,n是0,gate_addr是&idt[0],也就是idt的第一項中斷描述符的地址;type是15,dpl(描述符特權(quán)級)是0;addr是中斷服務(wù)程序divide_error(void)的入口地址。見P54圖29P53代碼24.進程0fork進程1之前,為什么先要調(diào)用move_to_user_mode()?用的是什么方法?解釋其中的道理。答:因為在0.11中,除進程0之外,所有進程都是由一個已有進程在用戶0move_to_user_mode()0為在0.11現(xiàn)從3到030從0特權(quán)級到3特權(quán)級轉(zhuǎn)換時采用的是模仿中斷返回。設(shè)計者首先手工寫壓棧代碼模擬intiret指令時,CPU自動將這5個寄存器的值()按序恢復(fù)給CPU,CPU就會翻轉(zhuǎn)到3特權(quán)級去執(zhí)行代碼。25.進程0創(chuàng)建進程1時調(diào)用copy_process函數(shù),在其中直接、間接調(diào)用了兩次get_free_page函數(shù),在物理內(nèi)存中獲得了兩個頁,分別用作什么?是怎么設(shè)置的?給出代碼證據(jù)。答:第一次調(diào)用get_free_page函數(shù)申請的空閑頁面用于進程1的task_struct及00的task_struct1esp01的堆棧的起始地址。代碼見P90及P92。第二次調(diào)用get_free_page函數(shù)申請的空閑頁面用于進程1的頁表。在創(chuàng)建進程1執(zhí)行copy_process中,執(zhí)行時,內(nèi)核為進程1拷貝了進程0的頁表(160P98。26.在32中,有大約20多個指令是只能在0特權(quán)級下使用,其他的指令,比如cli,并沒有這個約定。奇怪的是,在Linux0.11中,在3特權(quán)級的進程代碼并不能使用cli據(jù)。答:cli指令用于復(fù)位IF標(biāo)志位,其執(zhí)行與當(dāng)前特權(quán)級和EFLAGS[IOPL]標(biāo)志位有關(guān)。只有當(dāng)CPL小于或等于IOPL時才可以執(zhí)行該指令。如果在CPL大于IOPL的情況下執(zhí)行,將會產(chǎn)生一個一般性保護異常,如下:set_trap_gate(13,&general_protection);由于在內(nèi)核IOPL的初始值為00在move_to_user_mode中,繼承了內(nèi)核的eflags,如下:move_to_user_mode()…"pushfl\n\t"\…"iret\n"\在進程0的TSSeflags中的IOPL位為0P68如果沒有改動的話也是0,即。因此,通過設(shè)置,可以限制3特權(quán)級的進程代碼使用cli指令。27.根據(jù)代碼詳細(xì)分析操作系統(tǒng)是如何獲得一個空閑頁的。答:代碼見P90get_free_page函數(shù)。過程:(1)將EAX設(shè)置為0,EDI設(shè)置指向mem_map的最后一項(mem_map+PAGING_PAGES1std設(shè)置掃描是從高地址向低地址。從mem_map如果找到,則將找到的頁設(shè)引用數(shù)為1;(2)ECX左移12位得到頁的相對地址,加LOW_MEM得到物理地址,將此頁最后一個字節(jié)的地址賦值給(LOW_MEM+4092(3)stosl將EAX的值設(shè)置到ES:EDI所指內(nèi)存,即反向清零1024*32bit,將此頁清空;(4)將頁的地址(存放在)返回。28.用戶進程自己設(shè)計一套LDT表,并與GDT掛接,是否可行,為什么?答:不可行。GDT和LDT放在內(nèi)核數(shù)據(jù)區(qū),屬于0特權(quán)級,3特權(quán)級的用戶進程無權(quán)訪問修改。此外,如果用戶進程可以自己設(shè)計LDT的話,表明用戶進程可以訪問其他進程的,則會削弱進程之間的保護邊界,容易引發(fā)問題。29.保護模式下,線性地址到物理地址的轉(zhuǎn)化過程是什么?轉(zhuǎn)化過程如圖所示(見P97圖39)Linux0.11中僅有一個頁目錄表,其地址存放在CR3寄存器中,通過線性地址中的“頁目錄項”數(shù)據(jù)及CR3寄存器就可以應(yīng)的物理頁面,最后通過線性地址中的“頁內(nèi)偏移”落實到實際的物理地址值。30.為什么get_free_page()將新分配的頁面清0?答:Linux在回收頁面時并沒有將頁面清0,只是將mem_map中與該頁對應(yīng)的位置0。在使用get_free_page申請頁時,也是遍歷mem_map尋找對應(yīng)位為0的頁,但是該頁可能存在垃圾數(shù)據(jù),如果不清0的話,若將該頁用做頁表,則可能導(dǎo)致錯誤的映射,引發(fā)錯誤,所以要將新分配的頁面清0。31.內(nèi)核和普通用戶進程并不在一個線性地址空間內(nèi),為什么仍然能夠訪問普通用戶進程的頁面?16M物理內(nèi)存,所以內(nèi)核可以訪問普通用戶進程的頁面。32.詳細(xì)分析一個進程從創(chuàng)建、加載程序、執(zhí)行、退出的全過程。答:可以參考課本P273頁,其中的核心部分課上都進行了介紹,包括、copy_process()、do_execve()及do_exit等。參考:首先,shell調(diào)用forkint0x80sys_fork(),調(diào)用find_empty_process(),為str1申請可用的pid和task[64]空閑位置,接著調(diào)用copy_process()為str1申請用來承載進程task_struct和內(nèi)核棧的一個頁面,shell把自己的task_struct復(fù)制給str1進程,然后修改str1的task_struct的部分?jǐn)?shù)據(jù),包括時間片,TSS字段等。接著調(diào)用copy_mem()為進程分段(確定段基址和段copy_page_tables為str1進程另起一套頁目錄項和頁表項,并指向shell的頁面。還要解決文件繼承的問題,然后將str1進程TSS和LDT掛接在GDT的指定位置,完成這些后,將str1設(shè)為就緒態(tài)。接下來加載用戶程free_page_tables解除與shell,調(diào)整str1的task_struct,最后調(diào)整EIP和ESP。用戶程序被調(diào)度執(zhí)行,產(chǎn)生缺頁do_no_page為str1mem_map中,將str1址空間內(nèi)。執(zhí)行加載到的程序,產(chǎn)生壓棧動作,若棧空間不夠,則產(chǎn)生缺頁中斷繼續(xù)申請頁面。最后,用戶進程調(diào)用exit退出,釋放程序所占頁面,解除與文件有關(guān)的內(nèi)容,并調(diào)用tell_fathershell進程收到用戶進程發(fā)送的信號設(shè)置為就緒態(tài),待其執(zhí)行時,釋放掉用戶進程task_struct所占用的頁面,解除與task[64]的關(guān)系,這時用戶進程徹底退出。33.詳細(xì)分析多個進程(無父子關(guān)系)共享一個可執(zhí)行程序的完整過程。答:依次創(chuàng)建3個用戶進程,每個進程都有自己的task。假設(shè)進程1先執(zhí)行,需1的線性地址空間。這時產(chǎn)生時鐘中斷,輪到進程2執(zhí)行,進程2也執(zhí)行同樣邏輯的程序。之后,又輪到進程3執(zhí)行,也是壓棧,并設(shè)置text??梢?,三個進程雖程序相同,但數(shù)據(jù)獨立,用TSS和LDT實現(xiàn)對進程的保護。34.缺頁中斷是如何產(chǎn)生的,頁寫保護中斷是如何產(chǎn)生的,操作系統(tǒng)是如何處理的?答:缺頁中斷:每個頁目錄項和頁表項都有個標(biāo)志位P,如果和一個頁面建立了P位置1,否則置0MMU在解析線性地址時,若發(fā)現(xiàn)某個表項的P位為零,說明沒有對應(yīng)頁面,就會產(chǎn)生缺頁中斷。操作系統(tǒng)會調(diào)用_do_no_page頁表頁面的三級映射管理關(guān)系。時若某一進程執(zhí)行寫操作,就會產(chǎn)生“頁寫保護”異常。操作系統(tǒng)會調(diào)用_do_wp_page,為該進程申請空閑頁面,將該進程的頁表

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論