資源描述:
《linux內(nèi)核完全注釋部分習(xí)題解答》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、作者給的一些解答:第3章?內(nèi)核引導(dǎo)和啟動(dòng)過(guò)程2.為什么不直接將system模塊搬到0x00000處而是先搬到0x10000處,再搬到0x00000處呢?在機(jī)器開(kāi)機(jī)上電時(shí),ROM?BIOS將bootsect代碼加載到內(nèi)存的固定位置0x7c00處,bootsect又把自己移動(dòng)到了0x90000處,同時(shí)把setup.s代碼和system模塊分別加載到0x90200和0x10000處。對(duì)于本書所討論的Linux內(nèi)核,system模塊的大小不超過(guò)512KB。由于在即將執(zhí)行的setup代碼中還需要使用BIOS的功能,因此若直接將system模塊加載到0x0
2、0000處就會(huì)覆蓋掉BIOS設(shè)置的中斷向量區(qū)域(0x0000-0x0400)。3.setup.s和head.s中都設(shè)置了一次GDT和IDT,這是為何,可否只在head.s做一次設(shè)置?第一次設(shè)置是為了head.s能首次運(yùn)行在32位保護(hù)模式下。GDT臨時(shí)在setup.s中,也即0x902xx左右的地方,這個(gè)地方將被用于緩沖區(qū)。而內(nèi)核是在靠近物理內(nèi)存0x0處的,因此必須重新設(shè)置。4.不用as86,用gas來(lái)編譯bootsect可以么?為什么Linus當(dāng)時(shí)要使用as86匯編器?可以。bootsect需要是16位的實(shí)模式程序。目前gas匯編器也支持16位
3、的編譯。Linus當(dāng)時(shí)是在MINIX系統(tǒng)上開(kāi)發(fā)Linux的,最初MINIX系統(tǒng)上還沒(méi)有移植gas程序,因此Linus就使用了MINIX系統(tǒng)上的as86。5.根據(jù)setup.s和head.s程序中的使用方法,請(qǐng)?jiān)敿?xì)說(shuō)明Intel?32位保護(hù)模式的運(yùn)行機(jī)制。它與實(shí)模式下的尋址方式有和主要區(qū)別?第4章?系統(tǒng)初始化1.在setup.s代碼執(zhí)行完之后,head.s及system被移到了0x00000~0x800000處,那么PC開(kāi)機(jī)時(shí)0x0000~0x0400處及之后的一些參數(shù)不是也被覆蓋了嗎??jī)?nèi)核以后是怎么設(shè)置的?Linux在這之后就完全不用PC自己的
4、中斷程序,而純粹自己作中斷程序了。在head.s中的78行(setup_idt)開(kāi)始,首先在232行的_idt處設(shè)置了256個(gè)亞中斷向量,指向一個(gè)只顯示"Unknown?interrupt"的中斷處理程序。然后會(huì)在init的main()中各個(gè)硬件的初始化函數(shù)中一個(gè)一個(gè)地分別設(shè)置所用到的實(shí)際中斷向量。2.請(qǐng)簡(jiǎn)述Linux內(nèi)核的整個(gè)初始化過(guò)程。系統(tǒng)初始化時(shí),sched_init()?程序啟動(dòng)了系統(tǒng)的空閑任務(wù)0,同時(shí)派生了任務(wù)1,此時(shí),系統(tǒng)中有兩個(gè)進(jìn)程(task?0?and?task?1),假設(shè)從此時(shí)開(kāi)始,系統(tǒng)沒(méi)有接收到任何中斷(包括系統(tǒng)的定時(shí)時(shí)鐘中
5、斷或外部硬件中斷以及軟件的系統(tǒng)調(diào)用產(chǎn)生的中斷),那么系統(tǒng)中將永遠(yuǎn)只包含著這兩個(gè)進(jìn)程,但是實(shí)際中,時(shí)鐘中斷周期的檢查有沒(méi)有新任務(wù)就緒,或者硬件中斷包括系統(tǒng)調(diào)用使系統(tǒng)調(diào)度執(zhí)行來(lái)檢查系統(tǒng)的新任務(wù),如果有新任務(wù)就緒,執(zhí)行新任務(wù)。系統(tǒng)的其它部分,都是為這些任務(wù)的執(zhí)行提供服務(wù)。系統(tǒng)中各進(jìn)程的執(zhí)行基本上是由于進(jìn)程請(qǐng)求等待想要的資源而自動(dòng)情愿地放棄CPU去睡眠,另一種就是時(shí)鐘中斷把用完時(shí)間片的進(jìn)程對(duì)CPU的使用權(quán)剝奪,不情愿地放棄CPU。3.詳細(xì)說(shuō)明_syscall0(int,fork)嵌入函數(shù)的使用方法。在程序中調(diào)用該函數(shù)的實(shí)際語(yǔ)句是怎樣的?請(qǐng)具體寫出來(lái)。第
6、5章?進(jìn)程調(diào)度與系統(tǒng)調(diào)用1.請(qǐng)問(wèn)硬盤中斷怎么產(chǎn)生的?系統(tǒng)調(diào)用read、write等都是產(chǎn)生請(qǐng)求,并將請(qǐng)求插入請(qǐng)求隊(duì)列,在中斷時(shí)由中斷處理函數(shù)遍歷請(qǐng)求隊(duì)列完程讀寫,那么請(qǐng)問(wèn)最初的硬盤的中斷是由誰(shuí)、如何激發(fā)的呢?參見(jiàn)6.6.1功能描述和圖6.12.copy_process的參數(shù)有17個(gè),從右往左分別是:ss,esp,eflags,cs,eip,ds,es,fs,edx,ecs,ebx,none,gs,esi,edi,ebp,nr。請(qǐng)問(wèn)其中的那個(gè)none對(duì)應(yīng)的是堆棧中的什么內(nèi)容?簡(jiǎn)單說(shuō)明原因。3.在do_signal()函數(shù)中的104行語(yǔ)句是:*(&
7、eip)?=?sa_hangler;這條語(yǔ)句不就是等價(jià)與eip?=?sa_handler;嗎?Linus為什么會(huì)這樣表達(dá)?這里主要是牽涉到變量類型匹配的問(wèn)題。因?yàn)檫@兩個(gè)變量的類型不一樣。4.在head.s中執(zhí)行?lss?_stack_start,%esp,此時(shí)ss是什么內(nèi)容?(提示:參考sched.c,第69行)。ss=0x10,也即內(nèi)核段選擇符。參見(jiàn)sched.c,69行。此時(shí)ss=ds。5.在中斷程序里,段描述符寄存器的值被改掉了,那請(qǐng)問(wèn)是在什么時(shí)候改的呢?比如說(shuō)原來(lái)用戶態(tài)時(shí),使用的是LDT,代碼段是cs=f,當(dāng)發(fā)生中斷時(shí),CPU根據(jù)中斷I
8、DT表中相應(yīng)的描述符設(shè)置CS:EIP,此時(shí)所有中斷描述符表中描述符的段選擇符值都已經(jīng)被設(shè)置成=8(內(nèi)核代碼,在head.s中設(shè)置的),于是就會(huì)去執(zhí)行內(nèi)