




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
2.10 Minix
3
進(jìn)程概述2.10.1
MINIX的結(jié)構(gòu)第2頁
共
頁Minix的層次結(jié)構(gòu)內(nèi)核時鐘任務(wù)系統(tǒng)任務(wù)磁盤驅(qū)動終端驅(qū)動進(jìn)程管理文件系統(tǒng)信息服務(wù)器網(wǎng)絡(luò)服務(wù)器Init進(jìn)程用戶進(jìn)程用戶進(jìn)程用戶進(jìn)程……用戶進(jìn)程網(wǎng)卡驅(qū)動第3頁
共
頁MINIX
3被組織成四層,每一層執(zhí)行一組定義明確的功能。第1層第4頁
共
頁內(nèi)核處理所有進(jìn)程間的消息最底層進(jìn)行進(jìn)程調(diào)度支持對I/O端口和中斷的訪問時鐘任務(wù)時鐘中斷驅(qū)動處理時鐘定時器時鐘任務(wù)也是一個進(jìn)程,在進(jìn)程隊列中排隊系統(tǒng)任務(wù)為上層驅(qū)動程序和服務(wù)器提供一組特權(quán)內(nèi)核調(diào)用讀寫I/O端口、跨地址空間復(fù)制數(shù)據(jù)等系統(tǒng)任務(wù)是單獨(dú)的進(jìn)程,并有自己的調(diào)用堆棧第2層第5頁
共
頁第2、3、4層與第1層有本質(zhì)的區(qū)別,不能執(zhí)行特權(quán)指令。都是以用戶模式運(yùn)行。第2、3、4層的進(jìn)程調(diào)用系統(tǒng)調(diào)用的能力不同。第2層的稱為設(shè)備驅(qū)動程序(devicedrivers),具有最多的權(quán)限??梢哉埱笙到y(tǒng)任務(wù)代表它們從I/O端口讀數(shù)據(jù)或向I/O端口寫數(shù)據(jù)。請求剛剛讀取的數(shù)據(jù)副本拷貝到另一個進(jìn)程的地址空間。第3層第6頁
共
頁第3層包含了服務(wù)器,即向用戶進(jìn)程提供有用服務(wù)的進(jìn)程。進(jìn)程管理器(ProcessManager,PM)執(zhí)行所有涉及啟動或終止進(jìn)程的MINIX3系統(tǒng)調(diào)用。例如fork,exec
和wait等。負(fù)責(zé)執(zhí)行與信號有關(guān)的系統(tǒng)調(diào)用,例如alarm和kill等。PM還負(fù)責(zé)管理內(nèi)存,例如發(fā)出brk系統(tǒng)調(diào)用。文件系統(tǒng)(File
System,F(xiàn)S)負(fù)責(zé)執(zhí)行文件系統(tǒng)的調(diào)用,如read,mount和chdir等。第3層—內(nèi)核調(diào)用和系統(tǒng)調(diào)用的區(qū)別第7頁
共
頁內(nèi)核調(diào)用(kernelcall)和POSIX系統(tǒng)調(diào)用(systemcall)
有本質(zhì)的區(qū)別。在MINIX3中用戶進(jìn)程發(fā)出的系統(tǒng)調(diào)用將被轉(zhuǎn)換為發(fā)往服務(wù)器進(jìn)程的消息。服務(wù)器進(jìn)程被禁止執(zhí)行實(shí)際的I/O操作,也不能改動系統(tǒng)表及完成其他操作系統(tǒng)一般都有的功能。內(nèi)核為驅(qū)動程序和服務(wù)器提供一組服務(wù)—內(nèi)核調(diào)用。這些對普通用戶進(jìn)程不可用的服務(wù),允許驅(qū)動程序和服務(wù)器執(zhí)行實(shí)際I/O操作、存取內(nèi)核表以及其他它們所需要的功能,而不需要在內(nèi)核內(nèi)部。
注意:用戶進(jìn)程不能產(chǎn)生內(nèi)核調(diào)用。服務(wù)器進(jìn)程相互之間、服務(wù)器進(jìn)程與設(shè)備驅(qū)動程序之間以及服務(wù)器進(jìn)程與內(nèi)核之間通過消息進(jìn)行通信。第3層—IS
&
RS第8頁
共
頁信息服務(wù)器(informationserver,IS)負(fù)責(zé)提供其他驅(qū)動程序和服務(wù)器的調(diào)試和狀態(tài)信息的工作。再生服務(wù)器(reincarnationserver,RS)啟動或重啟那些不與內(nèi)核一起加載到內(nèi)存的設(shè)備驅(qū)動程序。如果驅(qū)動程序在操作過程中失敗,那么再生服務(wù)器檢測到這個失敗,并殺死這個驅(qū)動程序(如果它沒有死的話),重啟一個驅(qū)動程序的新的副本,從而使整個系統(tǒng)具有更好的容錯能力。這一功能在大多數(shù)操作系統(tǒng)中是沒有的。第3層—增加新的服務(wù)器第9頁
共
頁在進(jìn)程管理器和文件系統(tǒng)之外,可以補(bǔ)充網(wǎng)絡(luò)服務(wù)器等其他服務(wù)器補(bǔ)充。進(jìn)程管理器和文件系統(tǒng)也可以被其他服務(wù)器取代。通過當(dāng)MINIX3啟動時或啟動后向系統(tǒng)添加另外的服務(wù)器來實(shí)現(xiàn)。設(shè)備驅(qū)動程序通常在系統(tǒng)啟動時開始運(yùn)行,但也可以在系統(tǒng)運(yùn)行時啟動。設(shè)備驅(qū)動程序和服務(wù)器都被編譯并以一般可執(zhí)行文件的形式存儲在磁盤上。與用戶進(jìn)程不同,當(dāng)系統(tǒng)處于活動狀態(tài)時驅(qū)動程序和服務(wù)器進(jìn)程不會終止。系統(tǒng)進(jìn)程是操作系統(tǒng)的一部分。它們不屬于某一個特定的用戶,大部分會在系統(tǒng)第1個用戶登錄前啟動。第4層第10頁
共
頁第4層包括了所有的用戶進(jìn)程,如init、shell程序、編輯器、編譯器和用戶自己編譯好的可執(zhí)行程序。系統(tǒng)對象每個進(jìn)程是一個對象。內(nèi)存數(shù)據(jù)的值OS為其保留的值指令指針的值堆棧棧頂?shù)闹导拇嫫鞯闹档?1頁
共
頁OS要做的事情I/O
服務(wù)進(jìn)程間通信進(jìn)程切換保留狀態(tài)恢復(fù)狀態(tài)進(jìn)程創(chuàng)建、清除對象
U.code U.data U.register U.kernel U.kernel.fdU.kernel.fd[i].pos2.10.2
MINIX進(jìn)程管理第12頁
共
頁引導(dǎo)(
Bootstrap
)第13頁
共
頁Bootstrap(靴帶)是皮鞋后部的一條小帶子或一個小環(huán),它可以使你方便地把鞋子穿起來。軟盤啟動硬件(BIOS)從引導(dǎo)盤上將第1道第1個扇區(qū)(bootstrap)讀人內(nèi)存并從那里開始執(zhí)行。引導(dǎo)程序很小,因?yàn)樗仨毮苋菁{在一個扇區(qū)(512字節(jié))里。引導(dǎo)程序裝入一個更大的程序boot,由boot裝入操作系統(tǒng)。硬盤啟動硬盤被分成若干個分區(qū)(partition),整個硬盤的第1個扇區(qū)包括一段小程序和磁盤分區(qū)表(partition
table)。兩者合在一起稱為主引導(dǎo)記錄(Master
Boot
Record,MBR)。程序部分被執(zhí)行以讀人分區(qū)表并選擇活動分區(qū)(active
partition)。活動分區(qū)的第1個扇區(qū)有一個引導(dǎo)程序,它隨后被裝入并執(zhí)行以查找并啟動程序boot。啟動(boot)第14頁
共
頁MINIX3的boot程序?qū)⒃谲洷P或硬盤分區(qū)上找一個包含多個部分的文件(引導(dǎo)映像,bootimage),并將各部分裝到內(nèi)存的適當(dāng)位置。Minix3的引導(dǎo)映像內(nèi)核,時鐘任務(wù)和系統(tǒng)任務(wù);磁盤驅(qū)動程序;再生服務(wù)器;它可以把一個初始化后加載的普通進(jìn)程賦予特定的優(yōu)先級和權(quán)限,使得它們成為系統(tǒng)進(jìn)程。也可以根據(jù)驅(qū)動程序的名字重新啟動崩潰的驅(qū)動程序。RAMdisk、控制臺、日志驅(qū)動程序和init程序。boot需要完成屬于磁盤任務(wù)和文件系統(tǒng)范圍的操作。boot要準(zhǔn)備好內(nèi)核初始化程序的運(yùn)行環(huán)境,切換到內(nèi)核。初始化第15頁
共
頁內(nèi)核先啟動系統(tǒng)任務(wù)和時鐘任務(wù)啟動進(jìn)程管理器和文件系統(tǒng)。然后進(jìn)程管理器和文件系統(tǒng)合作加載作為引導(dǎo)映像一部分的其他服務(wù)器和驅(qū)動程序。當(dāng)所有這些都開始運(yùn)行并完成初始化之后,它們將阻塞,等待執(zhí)行某種操作。只有包含在引導(dǎo)映像中的所有任務(wù)、驅(qū)動程序和服務(wù)器都阻塞之后,第1個用戶進(jìn)程init才開始運(yùn)行。再生服務(wù)器第16頁
共
頁進(jìn)程管理器是用戶空間內(nèi)運(yùn)行的第1個進(jìn)程。它被賦予PID為0。它既不是其他任何進(jìn)程的子進(jìn)程,也不是其他任何進(jìn)程的父進(jìn)程。再生服務(wù)器被作為其他所有在引導(dǎo)映像中啟動的進(jìn)程的父進(jìn)程(例如驅(qū)動程序和服務(wù)器)。當(dāng)這些程序需要重啟時,應(yīng)該通知的是再生服務(wù)器進(jìn)程。init進(jìn)程被作為再生服務(wù)器進(jìn)程的一個子進(jìn)程。init被賦予的進(jìn)程標(biāo)識符為1(盡管init不是運(yùn)行的第1個進(jìn)程)init進(jìn)程第17頁
共
頁init進(jìn)程首先執(zhí)行/etc/rc腳本這一腳本啟動其他不在引導(dǎo)映像中的驅(qū)動程序和服務(wù)器。所有通過rc腳本啟動的進(jìn)程都是init進(jìn)程的一個子進(jìn)程。rc腳本的一個重要功能是檢查可能由上次系統(tǒng)崩潰所引起的文件系統(tǒng)錯誤:shutdown
-C命令查wtmp文件中最后一條記錄是否是關(guān)閉信息。如果不是,將假定上次是非正常關(guān)機(jī),執(zhí)行fsck檢查所有的文件系統(tǒng)。最后,init進(jìn)程為每一個終端創(chuàng)建一個子進(jìn)程。init讀取/etc/ttytab文件,該文件列出了所有可能的終端設(shè)備。通常每個子進(jìn)程都執(zhí)行文件/usr/bin/getty,打印出一條信息,然后等待輸入一個用戶名。當(dāng)用戶輸入用戶名登錄時,/usr/bin/login被調(diào)用,并使用這個用戶名作為參數(shù)。在成功登錄之后,/bin/login執(zhí)行用戶的shellshell等待用戶鍵人命令,并為每條命令創(chuàng)建一個新的進(jìn)程。Minix3的重要系統(tǒng)組件組件描述通過什么加載kernel內(nèi)核+時鐘和系統(tǒng)任務(wù)(在引導(dǎo)鏡像中)pm進(jìn)程管理器(在引導(dǎo)鏡像中)fs文件系統(tǒng)(在引導(dǎo)鏡像中)rs重啟服務(wù)器和驅(qū)動程序(在引導(dǎo)鏡像中)memoryRAM盤驅(qū)動程序(在引導(dǎo)鏡像中)log緩存日志輸出(在引導(dǎo)鏡像中)tty終端和鍵盤驅(qū)動程序(在引導(dǎo)鏡像中)driver磁盤(bios或軟盤)驅(qū)動程序(在引導(dǎo)鏡像中)init所有用戶進(jìn)程的父進(jìn)程(在引導(dǎo)鏡像中)floppy軟盤驅(qū)動程序(如果從硬盤啟動)/etc/rcis信息服務(wù)器(用于調(diào)試轉(zhuǎn)儲)/etc/rccmos讀CMOS時鐘來設(shè)置時間/etc/rcrandom隨機(jī)數(shù)產(chǎn)生器/etc/rcprinter打印機(jī)驅(qū)動程序/etc/rc第18頁
共
頁用戶進(jìn)程第19頁
共
頁一個進(jìn)程的所有信息被保存在進(jìn)程表中進(jìn)程表劃分成內(nèi)核、進(jìn)程管理器和文件系統(tǒng)三部分,分別擁有它們各自所需要的那些域。當(dāng)出現(xiàn)一個新進(jìn)程(通過fork)或者一個老進(jìn)程終止(通過exit或信號)時,進(jìn)程管理器首先更新它那部分進(jìn)程表,然后向文件系統(tǒng)和內(nèi)核發(fā)送消息,以通知它們進(jìn)行相應(yīng)的操作。2.10.3
MINIXDE
消息第20頁
共
頁消息第21頁
共
頁MINIX
3提供了三條原語來發(fā)送和接收消息send(dest,
&message);當(dāng)一個進(jìn)程發(fā)送消息到目標(biāo)進(jìn)程而目標(biāo)進(jìn)程并不在等待消息時,發(fā)送進(jìn)程將阻塞,直到目標(biāo)進(jìn)程調(diào)用receive為止。MINIX3使用這種方法避免了緩沖那些發(fā)送出去但未被目標(biāo)進(jìn)程接收的消息所帶來的問題。它很簡單,避免了緩存管理。所有的消息長度固定,并且在編譯時確定下來,緩存溢出問題這個常見的錯誤就從結(jié)構(gòu)上消除了。第4層的用戶進(jìn)程可以向第3層的服務(wù)器發(fā)送消息,第3層的服務(wù)器可以向第2層的驅(qū)動程序發(fā)送消息。限制進(jìn)程間消息傳遞的根本原因是如果允許進(jìn)程A通過send向進(jìn)程B發(fā)送消息,那么可以允許進(jìn)程B通過receive從進(jìn)程A接收消息,但是不能允許B向A發(fā)送消息。如果進(jìn)程A嘗試向進(jìn)程B發(fā)送消息而阻塞,同時進(jìn)程B嘗試向進(jìn)程A發(fā)送消息而阻塞,這將導(dǎo)致死鎖。用戶層發(fā)送消息第22頁
共
頁send(dest,
&message);
send:
lib/I386/rts/ipc.s→proc.c/syscall→proc.c/mini_sendpush
ebpmov ebp,
esppush
ebxmovmovmovinteax,
SRC_DST(ebp)ebx,
MESSAGE(ebp)ecx,
SENDSYSVEC!
eax
=
dest-src!
ebx
=
message
pointer!
_send(dest,
ptr)!
trap
to
the
kernelebxebppoppopret消息第23頁
共
頁receive(source,
&message);sendrec(src_dst,
&message);發(fā)送消息,等待接收者進(jìn)程的響應(yīng),收到響應(yīng)后再回復(fù)。notify(dest);通知,不阻塞,繼續(xù)執(zhí)行。2.10.4
MINIX3的進(jìn)程調(diào)度第24頁
共
頁Minix3中的進(jìn)程調(diào)度第25頁
共
頁進(jìn)程被阻塞的情況進(jìn)程請求從設(shè)備輸入時時鐘中斷設(shè)備中斷異常軟件中斷每當(dāng)一個進(jìn)程阻塞時,都有機(jī)會重新確定哪個進(jìn)程最需要運(yùn)行機(jī)會。在一個進(jìn)程終止時也要執(zhí)行該操作。多級排隊系統(tǒng)第26頁
共
頁MINIX3調(diào)度器使用一個多級排隊系統(tǒng)。一共定義了16個隊列,最低優(yōu)先級隊列只由IDLE進(jìn)程使用,IDLE進(jìn)程在系統(tǒng)沒有其他任務(wù)時運(yùn)行。用戶進(jìn)程啟動時默認(rèn)的優(yōu)先級比最低優(yōu)先級要高一些。服務(wù)器進(jìn)程處于比用戶進(jìn)程具有更高優(yōu)先級的隊列當(dāng)中。驅(qū)動程序進(jìn)程處于比服務(wù)器進(jìn)程更高優(yōu)先級的隊列當(dāng)中。系統(tǒng)和時鐘任務(wù)處于最高優(yōu)先級隊列當(dāng)中。時間片時間片:進(jìn)程在被搶占前所允許運(yùn)行的最大時間間隔。用戶進(jìn)程有一個較小的時間片。驅(qū)動程序進(jìn)程和服務(wù)器進(jìn)程通??梢赃\(yùn)行到阻塞,為了防止故障,它們是可搶占的,但具有一個大的時間片。Minix啟動后初始的進(jìn)程隊列情況第27頁
共
頁多級排隊系統(tǒng)第28頁
共
頁運(yùn)行超時的進(jìn)程仍處于就緒態(tài),但被放到它所在隊列的尾端。如果一個用完了時間片的進(jìn)程,仍然是上一次運(yùn)行的進(jìn)程,將把該進(jìn)程放到一個較低優(yōu)先級隊列的隊尾以降低它的優(yōu)先級??梢哉J(rèn)為它卡在了一個循環(huán)中,從而出現(xiàn)了阻止其他低優(yōu)先級進(jìn)程運(yùn)行的征兆。如果這個進(jìn)程又運(yùn)行超時,而還有其他進(jìn)程得不到運(yùn)行,它的優(yōu)先級將再一次降低。最終使其他的進(jìn)程都得到機(jī)會運(yùn)行。一個被降低優(yōu)先級的進(jìn)程仍有機(jī)會提高它的優(yōu)先級。如果一個進(jìn)程用完了它的時間片,但沒有妨礙其他進(jìn)程運(yùn)行,
它的優(yōu)先級將得到提高,直到該進(jìn)程所允許的最大優(yōu)先級為止。如果進(jìn)程轉(zhuǎn)為非就緒的時候沒有用完它的時間片這說明它在I/O上阻塞,當(dāng)該進(jìn)程再次轉(zhuǎn)為就緒時就被放到隊首,并分配上次所剩余的時間片。給用戶進(jìn)程更快的I/O響應(yīng)。系統(tǒng)進(jìn)程不會被用戶進(jìn)程阻止運(yùn)行。2.11 Minix3中進(jìn)程的實(shí)現(xiàn)第29頁
共
頁2.11.1
MINIX源代碼的組織第30頁
共
頁Minix第31頁
共
頁Minix網(wǎng)站()上有最新的版本,它具有新的特性及其配套軟件和文檔。C語言源代碼的完整路徑是/usr/src用一個頂層目錄為src/的路徑字符串來引用MINIX3的源程序文件。源代碼目錄樹下的每一個目錄都包含一個名為Makefile的文件,它用來完成UNIX標(biāo)準(zhǔn)下的make命令。Makefile文件控制它所在目錄中的文件的編譯,有時也會包括它的一些子目錄中的文件。src/目錄樹的全部或者部分也可以被重新分配位置每個源目錄內(nèi)的Makefile都是使用C源程序所在目錄的相對路徑。Minix的源碼組成includesysibmminixnetKernel
—
微內(nèi)核systemServers—
服務(wù)程序PMFSRSInetISInit…………第32頁
共
頁drivers—驅(qū)動程序At_winiBios_winiCmosFlopyTty…………boot
—引導(dǎo)和啟動Lib—用戶庫函數(shù)PosixI386RTSSyscallSyslib…………頭文件目錄第33頁
共
頁include/目錄包含了許多符合POSIX標(biāo)準(zhǔn)的頭文件,它又包含三個子目錄sys/:包含POSIX頭文件。minix/:包含操作系統(tǒng)使用的頭文件。ibm/:包含IBMPC特有定義的頭文件。源文件目錄第34頁
共
頁kernel/
第1層(調(diào)度、消息、時鐘和系統(tǒng)任務(wù))drivers/
第2層(磁盤、控制臺、打印機(jī)等的驅(qū)動程序)。servers/
第3層(進(jìn)程管理器、文件系統(tǒng)、其他服務(wù)器)。src/servers/inet/:網(wǎng)絡(luò)服務(wù)器的源代碼src/lib/
庫例程(如open,read)的源代碼。src/tools/
用于構(gòu)建MINIX3系統(tǒng)的Makefile和腳本。src/boot/
引導(dǎo)和安裝MINIX3的代碼。mands/,其中包含工具程序(如cat,甲,date,ls,
pwd以及200多個其他程序)的源代碼。編譯在src/tools/目錄下運(yùn)行make命令來編譯MINIX3。src/include/目錄下的頭文件將在/usr/include/目錄下產(chǎn)生一個新的副本。src/kernel/目錄中的源文件以及
src/servers/和src/drivers/中的一些子目錄將被編譯成object文件。src/kernel/中所有的object文件再鏈接成一個可執(zhí)行程序kernel。src/servers/pm/目錄中的所有object文件也將鏈接成一個可執(zhí)行程序pm。src/servers/fs/目錄中的object文件則鏈接為fs。作為引導(dǎo)映像的組成部分的其他程序也在它們各自的目錄中被編譯和鏈接。鏈接后的程序被分離和加載后的內(nèi)存分配情況如右圖所示。第35頁
共
頁安裝第36頁
共
頁installboot將kernel,pm,fs,init以及其他引導(dǎo)映像中的組件,添加一些數(shù)據(jù)以使其長度扇區(qū)大小的整數(shù)倍(以便可以更容易地獨(dú)立加載該部分)。并將其連接為一個文件。這個新的文就是啟動映像文件,可以將其復(fù)制到軟盤或者硬盤分區(qū)的/boot或者/boot/image/目錄中。2.10.2
引導(dǎo)MINIX
3第37頁
共
頁引導(dǎo)記錄第38頁
共
頁主引導(dǎo)保留區(qū)分區(qū)1引導(dǎo)分區(qū)2引導(dǎo)主引導(dǎo)程序分析分區(qū)表,找到活動分區(qū)位置。從活動分區(qū)讀取第一個扇區(qū),作為引導(dǎo)程序。引導(dǎo)程序加載啟動程序boot。一個分區(qū)可以有多個子分區(qū)。主引導(dǎo)保留區(qū)分區(qū)1主引導(dǎo)分區(qū)2引導(dǎo)子分區(qū)1引導(dǎo)子分區(qū)2引導(dǎo)boot的定位第39頁
共
頁將MINIX3引導(dǎo)扇區(qū)寫入硬盤時要對它進(jìn)行修改寫入操作由一個特殊的程序installboot完成,該程序添加個扇區(qū)號以便在其分區(qū)或子分區(qū)中找到boot程序。因?yàn)樵谘b入操作系統(tǒng)之前無法通過目錄和文件名來定位一個文件。boot不僅可以裝入操作系統(tǒng),而且作為一個監(jiān)控程序,它許用戶改變、設(shè)置和保存不同的參數(shù)。boot從它所在分區(qū)的第2個扇區(qū)中尋找一套可用的參數(shù)。MINIX3保留每個硬盤分區(qū)的前1KB作為一個引導(dǎo)塊。但其中只有一個512字節(jié)的扇區(qū)被ROM引導(dǎo)程序或主引導(dǎo)扇區(qū)裝入,這樣,另外512字節(jié)可以用來保存設(shè)置信息。這些信息控制引導(dǎo)操作,并且被傳到操作系統(tǒng)本身。默認(rèn)的設(shè)置顯示一個只有一個選擇項的菜單,引導(dǎo)MINIX3。但該設(shè)置信息可以被改變,以顯示一個更復(fù)雜的菜單。這樣,便允許引導(dǎo)其他操作系統(tǒng)(通過裝入并執(zhí)行其他分區(qū)的引導(dǎo)扇區(qū))或使用不同的選擇項來引導(dǎo)
MINIX3。默認(rèn)設(shè)置也可以被修改,以旁路掉該菜單而直接引導(dǎo)MINIX3。boot
加載系統(tǒng)鏡像和傳遞參數(shù)第40頁
共
頁boot并不是操作系統(tǒng)的一部分可以使用文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)來找到操作系統(tǒng)鏡像。boot尋找一個默認(rèn)文件在/boot/image下,若存在文件則加載之。它同Minix
3一起運(yùn)行,但Minix
3正常關(guān)閉后,該引導(dǎo)監(jiān)控程序會重獲得控制權(quán)。引導(dǎo)映像中的每一個文件都包含一個頭文件由它標(biāo)識在加載完可執(zhí)行代碼初始化的數(shù)據(jù)后應(yīng)為那些未初始化的數(shù)據(jù)及棧預(yù)留多大的空間,以使下一個程序能在合適的地址行加載。MINIX3鏡像組件的頭文件a.out被抽取為引導(dǎo)內(nèi)存空間的一個數(shù)組,其基地址被傳送給內(nèi)核。其他一些信息,如引導(dǎo)參數(shù),必須由引導(dǎo)監(jiān)控程序傳送給操作系統(tǒng)。2.10.4
系統(tǒng)初始化第41頁
共
頁初始化的主要工作第42頁
共
頁Minix3的初始化可以分為兩個階段:低層初始化和高層初始化。低層初始化由mpx386.s完成,主要有以下工作:GDT,IDT的初始化通用段寄存器的初始化:cs,ds,es,fs,gs全局?jǐn)?shù)據(jù)結(jié)構(gòu)的初始化:kinfo
,machine高層初始化由main()完成,主要有以下工作:8259中斷控制器的初始化進(jìn)程表和進(jìn)程特權(quán)級表的初始化為啟動鏡像中的進(jìn)程分配空間調(diào)度進(jìn)程運(yùn)行起始位置初始化代碼的32位版本位于文件mpx386.s中。MINIX
3的啟動牽涉到幾次控制權(quán)轉(zhuǎn)移
它們發(fā)生在mpx386.s中的匯編語言例程和start.c及main.c中的C語言例程之間。在mpx386.s中,從Minix:標(biāo)號開始,此時BootMonitor已經(jīng)將控制權(quán)轉(zhuǎn)移到此。…高地址a.out數(shù)組的基地址boot
parameters
length由boot
monitor壓入boot
parameters
offsetboot
monitor返址←——sp低地址第43頁
共
頁BootMonitor中設(shè)置的GDT第44頁
共
頁BootMonitor中會將系統(tǒng)從實(shí)模式切換到保護(hù)模式。在BootMonitor中設(shè)置的GDT表項內(nèi)容如下:0GDT_INDEX:1IDT_INDEX:2DS_INDEX:3ES_INDEX:4SS_INDEX:5CS_INDEX:6MON_CS_INDEX:7不用GDT描述符IDT描述符Kernel
DS
描述符Kernel
ES描述符Boot
monitor
SS描述符Kernel
CS描述符Boot
Monitor
CS描述符這時,CS:EIP指向標(biāo)號為Minix:處DS也已經(jīng)指向了核心數(shù)據(jù)段SS:SP依然指向Boot的棧頂。壓入ebp,esi,edi
首先將sp擴(kuò)展為32位的,因?yàn)锽ootMonitor中這是16位的。第45頁
共
頁!
monitor
stack
is
a
16
bit
stackmovzxpushmovpushpushesp,
spebp
ebp,
espesiedi將BootMonitor中的GDT拷貝到內(nèi)核的地址空間中,然后在以后對其進(jìn)行更新。初始化對象kinfo和machine將boot提供的相關(guān)參數(shù)壓棧,為調(diào)用函數(shù)kernel/start.c/cstart做準(zhǔn)備。cstart()函數(shù)的主要作用是對兩個全局結(jié)構(gòu)體kinfo和machine結(jié)構(gòu)體的初始化。kinfo是記錄內(nèi)核的信息的,任何需要知道內(nèi)核信息的地方都需要查看此結(jié)構(gòu)體的參數(shù)machine結(jié)構(gòu)體主要是記錄處理器的一些硬件信息,比如總線類型,是286系列還是386系列,內(nèi)核中涉及到硬件體系結(jié)構(gòu)的地方都需要此結(jié)構(gòu)體提供信息。字段值Code_baseseg2phys(cs)Code_size(phys_bytes)
&etextData_baseseg2phys(ds)Data_size(phys_bytes)
&endParams_baseseg2phys(mds)+
parmoffParams_sizeMIN(parmsize,sizeof(params)-2)Nr_procs100Nr_tasks4Release[6]“3”Version[6]“1.1”字段值Pc_at具體的值從boot參數(shù)中提取Ps_mca具體的值從boot參數(shù)中提取Processor具體的值從boot參數(shù)中提取Protected具體的值從boot參數(shù)中提取Vdu_ega具體的值從boot參數(shù)中提取Vdu_vga具體的值從boot參數(shù)中提取第46頁
共
頁系統(tǒng)GDT的更新cstart()的另外一個重要工作就是調(diào)用
kernel/protect.c/prot_init()進(jìn)行GDT,IDT和TSS的初始化。因?yàn)橄惹笆褂玫腉DT是從BootMonitor拷貝過來的,這里需要根據(jù)
kinfo結(jié)構(gòu)體提供的內(nèi)核代碼段地址,代碼段大小,數(shù)據(jù)段地址,數(shù)據(jù)段大小等重新設(shè)置GDT表中S_INDEX,DS_INDEX等的內(nèi)容。這主要通過init_codeseg()和init_dataseg()兩個函數(shù)完成的。中斷描述符表是通過int_gate()這個函數(shù)完成的。這個函數(shù)通過將中斷向量,中斷處理函數(shù),特權(quán)級等信息組裝成一個中斷描述符放入IDT表中。在從cstart返回之后,Igdt和lidt指令通過向其對應(yīng)的尋址寄存器裝入相應(yīng)的值。jmpf
CS_SELECTOR:csinit這條指令(CS寄存器有影子數(shù)據(jù),當(dāng)遠(yuǎn)跳轉(zhuǎn)時要根據(jù)描述符表更新)
第47頁
共
頁Minix3的GDT內(nèi)容序號名稱基址限長(字節(jié))DPL0未用001GDT描述符gdt[]的物理地址gdt[]的長度減12IDT描述符idt[]的物理地址idt[]的長度減13核心DS描述符核心數(shù)據(jù)段物理始址核心數(shù)據(jù)段長度減104核心ES描述符0232-115monitor
DS描述符Boot數(shù)據(jù)段的物理始址boot數(shù)據(jù)段長度減16核心CS描述符核心代碼段物理始址核心代碼段長度減107monitor
CS描述符Boot代碼段的物理始址Boot代碼段長度減18TSS描述符tss的物理地址tss結(jié)構(gòu)的長度減109286
DS描述/p>
ES描述符0232-111112131415LDT0的描述符proc[0].p_ldt的物理地址proc[0].p_ldt[]的長度減1016LDT1的描述符proc[1].p_ldt的物理地址proc[0].p_ldt[]的長度減10…LDT[NR_TASKS+NR_PROCS]的描述符LDT[NR_TASKS+NR_PROCS].p_ldt的物理地址proc[0].p_ldt[]的長度減10第48頁
共
頁高層初始化第49頁
共
頁低層初始化的工作到此完成,下面跳轉(zhuǎn)到main函數(shù)繼續(xù)高層初始化。首先使用intr_init()對8259中斷控制器進(jìn)行初始化。初始化進(jìn)程表Struct
proc
proc[NR_TASKS
+
NR_PROCS];系統(tǒng)中有一個image[]數(shù)組。數(shù)組類型為boot_image結(jié)構(gòu)體。image[]數(shù)組記錄了系統(tǒng)啟動時需要加載的所有進(jìn)程的信息,比如進(jìn)程號,時間片,隊列,名稱等等。進(jìn)程表初始化后,這些進(jìn)程以便將來可以被調(diào)用。最后跳轉(zhuǎn)到restart()函數(shù),調(diào)用第一個進(jìn)程來運(yùn)行。至此,初始化完畢。2.5
中斷內(nèi)核第51頁
共
頁時鐘中斷函數(shù)的注冊typedef struct
irq_hook
{……}
irq_hook_t第52頁
共
頁struct
irq_hook
*next;next
hook
in
chainint
(*handler)(struct
irq_hook
*);interrupt
handlerint
irq;IRQ
vectornumberint
id;id
of
this
hookint
proc_nr;NONE
if
not
in
useirq_id_t
notify_id;id
to
return
on
interruptirq_policy_t
policy;bit
maskfor
policy內(nèi)核(glo.h)有一個中斷鏈表的指針數(shù)組irq_hook_t
*irq_handlers[NR_IRQ_VECTORS];當(dāng)中斷發(fā)生的時候,根據(jù)中斷號,取得其中的一個指針。再在這個鏈表上遍歷需要處理這個中斷的處理函數(shù)。時鐘中斷函數(shù)的注冊第53頁
共
頁時鐘任務(wù)需要處理時鐘中斷。時鐘任務(wù)在初始化的時候注冊時鐘中斷。Kernel/clock.c/init_clock()
ch2-src\clock.cPRIVATE
voidinit_clock(){clock_c_nr
=
CLOCK;………………put_irq_handler(&clock_hook,
CLOCK_IRQ,
clock_handlerenable_irq(&clock_hook);
/*
kernel/klib386.s
*/}時鐘中斷函數(shù)的注冊第54頁
共
頁kernel/i8259.c/put_irq_handler
(&clock_hook,CLOCK_IRQ,clock_handler)將中斷處理的數(shù)據(jù)結(jié)構(gòu)掛在鏈表上?!環(huán)ook->next
=
NULL;hook->handler
=
handler;hook->irq
=
irq;hook->id
=
id;…………}void
put_irq_handler(hook,
irq,handler){…………line
=
&irq_handlers[irq];id
=
1;while
(*line
!=
NULL)
{if
(hook
==
*line)
return;line
=
&(*line)->next;id
<<=
1;其它中斷的處理函數(shù)的注冊第55頁
共
頁時鐘中斷的處理函數(shù)注冊kernel/clock.c/init_clock()
調(diào)用kernel/i8259.c/put_irq_handler()它們在一個進(jìn)程空間中,可以直接調(diào)用put_irq_handler。其它在驅(qū)動程序初始化的時候要統(tǒng)通過系統(tǒng)調(diào)用調(diào)用lib/syslib/sys_irqctrl.c/sys_irqctl(……)
源碼調(diào)用lib/other/taskcall.c/_taskcall(SYSTASK,SYS_IRQCTL,&m_irq);向系統(tǒng)任務(wù)發(fā)消息。源碼kernel/system.c/sys_task()源碼(*call_vec[call_nr])(message);kernel/system/do_irqctrl.c/do_irqctrl(message);
源碼在.h中定義了系統(tǒng)調(diào)用對應(yīng)的消息類型。# define
SYS_IRQCTL (KERNEL_CALL
+
19) /*
sys_irqctl()
*/lib/syslib/sys_irqctrl.c/sys_irqctl(……)PUBLIC
int
sys_irqctl(req,
irq_vec,
policy,
hook_id)int
req; int
irq_vec; int
*hook_id; hook
at
kernel
*/{ message
m_irq; int
s;m_irq.m_type
=
SYS_IRQCTL;m_irq.IRQ_REQUEST
=
req;m_irq.IRQ_VECTOR
=
irq_vec;m_irq.IRQ_POLICY
=
policy;m_irq.IRQ_HOOK_ID
=
*hook_id;s
=_taskcall
(SYSTASK,
SYS_IRQCTL,&m_irq);if
(req
==
IRQ_SETPOLICY)
*hook_id
=
m_irq.IRQ_HOOK_ID;return(s);}第56頁
共
頁lib/other/taskcall.c/_taskcall
(……)int
_taskcall(who,
syscallnr,
msgptr)int
who;int
syscallnr;register
message
*msgptr;{ int
status;msgptr->m_type
=
syscallnr;status
=
_sendrec
(who,
msgptr);if
(status
!=
0)
return(status);return(msgptr->m_type);}第57頁
共
頁P(yáng)UBLIC
void
sys_task()
{while
(TRUE)
{receive(ANY,
&m);call_nr
=
(unsigned)
m.m_type
-
KERNEL_CALL;caller_ptr
=
proc_addr(m.m_source);if
(!
(priv(caller_ptr)->s_call_mask
&
(1<<call_nr)))
{result
=
ECALLDENIED;}
else
if
(call_nr
>=
NR_SYS_CALLS)
{result
=
EBADREQUEST;}
elseresult
=
(*call_vec[call_nr])(&m);}…………} /*
end
of
while(true)
*/}第58頁
共
頁kernel/system.c/sys_task()PUBLIC
int
do_irqctl(m_ptr)register
message
*m_ptr;{
……case
IRQ_ENABLE:case
IRQ_DISABLE:……if
(m_ptr->IRQ_REQUEST
==
IRQ_ENABLE)enable_irq(&irq_hooks[irq_hook_id]);elsedisable_irq(&irq_hooks[irq_hook_id]);break;…………}第59頁
共
頁kernel/system/do_irqctrl.c/
do_irqctl(m_ptr)時鐘中斷的處理第60頁
共
頁IDT的中斷門描述符的偏移地址指向了kernel/mpx386.s定義的中斷入口點(diǎn)。.align
16_hwint00:!
Interrupt
routine
for
irq
0
(the
clock).hwint_master(0).align
16_hwint01:!
Interrupt
routine
for
irq
1
(keyboard)hwint_master(1).align
16_hwint02:!
Interrupt
routine
for
irq
2
(cascade!)hwint_master(2)……
……
……時鐘中斷的處理第61頁
共
頁#define
hwint_master(irq)
\/*
save
interrupted
process
state
*/;\/*
irq_handlers[irq]
*/;\/*
intr_handle(irq_handlers[irq])
*/;\;\*/;\;\;\callpushcallpopcmpjz
inborboutbsave(_irq_handlers+4*irq)_intr_handleecx(_irq_actids+4*irq),
00fINT_CTLMASKal,
[1<<irq]INT_CTLMASK/*interrupt
still
active?;\/*
getcurrentmask*//*
maskirq*//*
disable
the
irq*/;\0:movb;\al,
END_OF_INToutbINT_CTLret/*
reenable
master
8259/*
restart
(another)process*/;\*/調(diào)用統(tǒng)一的中斷處理函數(shù)kernel/mpx386.x/hwint_master(irq)時鐘中斷的處理第62頁
共
頁kernel/i386.c/intr_handle(hook)調(diào)用中斷處理結(jié)構(gòu)鏈表上的一個處理函數(shù)。PUBLIC
void
intr_handle(hook)irq_hook_t
*hook;{/*
Call
list
of
handlers
for
an
IRQ.
*/while
(hook
!=
NULL)
{irq_actids[hook->irq]
|=
hook->id;if
((*hook->handler)(hook))
irq_actids[hook->irq]
&=
~hook->id;hook
=
hook->next;}}第63頁
共
頁中斷向量的初始化int_gate(vec_nr,offset,dpl_type)填充一個中斷描述符。prot_init()初始化中斷向量表gate_table[]數(shù)組{
s_call,
SYS386_VECTOR,
USER_PRIVILEGE
}IDT的的設(shè)置for
(gtp
=
&gate_table[0];gtp
<
&gate_table[sizeof
gate_table
/
sizeof
gate_table[0]];++gtp)
{int_gate(gtp->vec_nr,(vir_bytes)
gtp->gate,PRESENT
|
INT_GATE_TYPE
|
(gtp->privilege
<<
DPL_SHIFT));}第64頁
共
頁第65頁
共
頁第66頁
共
頁第67頁
共
頁2.10.6
系統(tǒng)任務(wù)第68頁
共
頁用戶進(jìn)程調(diào)用系統(tǒng)服務(wù)的過程用戶進(jìn)程首先通過內(nèi)核向服務(wù)進(jìn)程發(fā)消息。服務(wù)進(jìn)程處理之后,向系統(tǒng)任務(wù)進(jìn)程發(fā)消息服務(wù)進(jìn)程再通過內(nèi)核向用戶進(jìn)程返回消息第69頁
共
頁fork()系統(tǒng)調(diào)用過程
(1)第70頁
共
頁在用戶程序中調(diào)用lib/posix目錄中_fork.c中的fork()函數(shù)fork()調(diào)用在lib/other/syscall.c/_syscall
(who,
syscallnr,
msgptr)_syscall
調(diào)用lib/I386/rts/ipc.s/_sendrec(who,msgptr)_sendrec通過系統(tǒng)調(diào)用中斷(0x33)進(jìn)入內(nèi)核。_sendrec調(diào)用系統(tǒng)調(diào)用,進(jìn)入kernel/mpx386.s
的
_s_call_s_call
掉用kernel/proc.c/sys_call
(call_nr,
src_dst,
m_ptr)sys_call根據(jù)參數(shù)mini_send(caller_ptr,
src_dst,
m_ptr,
flags)向PM發(fā)送消息阻塞發(fā)送進(jìn)程mini_receive(caller_ptr,
src_dst,
m_ptr,
flags);讓發(fā)送進(jìn)程等待Pm的響應(yīng)消息fork()系統(tǒng)調(diào)用過程
(2)第71頁
共
頁在PM
中main.c/main()get_work();receive(ANY,&m_in)
其它進(jìn)程給它發(fā)消息。result
=
(*call_vec[call_nr])();servers/pm/forkexit.c/do_fork()填寫進(jìn)程控制塊sys_fork(who,child_nr);
給內(nèi)核發(fā)消息lib/sysysutil/_taskcall(who,
syscallnr,
msgptr)_sendrec
(who,
msgptr);tell_fs(FORK,
who,child_nr,
rmc->mp_pid);
給文件系統(tǒng)法消息PM的數(shù)據(jù)結(jié)構(gòu)第72頁
共
頁P(yáng)M維護(hù)進(jìn)程表
mproc[NR_PROCS]全局變量輸入消息m_in調(diào)用者who系統(tǒng)調(diào)用號callnr已用的進(jìn)程數(shù)procs_in_use當(dāng)前請求調(diào)用的進(jìn)程MP空閑內(nèi)存鏈表hole_headphy_clicksh_basephy_clicksh_lenhole*
h_nextphy_clicksh_basephy_clicksh_lenhole*
h_nextphy_clicksh_basephy_clicksh_lenhole*
h_nextmem_mapmp_seg[3]mp_exitstatusmp_sigstatusmp_pidmp_child_utimemp_parentmp_child_stimemp_flags012NR_PROCS-1............impmp_replymem_virmem_physmem_lenhole_headmem_virmem_physmem_lenmem_virmem_physmem_lenMp_seg[T]Mp_seg[D]Mp_seg[S]PM—fork第73頁
共
頁1、PM每接收到新消息,設(shè)置全局變If(Receive(ANY,message));M_in=message;Callnr=m_in.m_type;Who=m_in.m_source;Mp=&mproc[who];phy_clicksh_basephy_clicksh_lenhole*
h_nextphy_clicksh_basephy_clicksh_lenhole*
h_nextphy_clicksh_basephy_clicksh_lenhole*
h_nextmem_mapmp_seg[3]mp_exitstatusmp_sigstatusmp_pidmp_child_utimemp_parentmp_child_stimemp_flags012NR_PROCS-1............impmp_replymem_virmem_physmem_lenhole_headmem_virmem_physmem_lenmem_virmem_physmem_lenMp_seg[T]Mp_seg[D]Mp_seg[S]分析callnr=FORK,執(zhí)行*callvec[callnr]創(chuàng)建進(jìn)程。If(Procs_in_use==NR_PROCS) Return(EFULL);統(tǒng)計當(dāng)前進(jìn)程mp的數(shù)據(jù)段開始
至棧段結(jié)束內(nèi)存大小total_size,遍歷hole_head鏈表找到hole=min{hole:hole.hlen>=total_size},分配這塊內(nèi)存并進(jìn)行數(shù)據(jù)拷貝。PM—fork第74頁
共
頁2、尋找
i=min{i:mproc[i].mp_flags&IN_USE==0};分配mproc[i]給子進(jìn)程;*mproc[i]=*mp復(fù)制進(jìn)程控制塊;proc_in_use++;phy_clicksh_basephy_clicksh_lenhole*
h_nextphy_clicksh_basephy_clicksh_lenhole*
h_nextphy_clicksh_basephy_clicksh_lenhole*
h_nextmem_mapmp_seg[3]mp_exitstatusmp_sigstatusmp_pidmp_child_utimemp_parentmp_child_stimemp_flags012NR_PROCS-1............impmp_replymem_virmem_physmem_lenhole_headmem_virmem_physmem_lenmem_virmem_physmem_lenMp_seg[T]Mp_seg[D]Mp_seg[S]分析callnr=FORK,執(zhí)行*callvec[callnr]創(chuàng)建進(jìn)程。If(Procs_in_use==NR_PROCS)Return(EFULL);統(tǒng)計當(dāng)前進(jìn)程mp的數(shù)據(jù)段開始
至棧段結(jié)束內(nèi)存大小total_size,遍歷hole_head鏈表找到hole=min{hole:hole.hlen>=total_size},分配這塊內(nèi)存并進(jìn)行數(shù)據(jù)拷貝。PM—fork第75頁
共
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 北海市檢測合同范例
- 代建房屋租賃合同范本
- 企業(yè)消防合同范本
- 主體變更合同范本
- 個人建設(shè)工程合同范本
- 農(nóng)村房屋驗(yàn)收合同范本
- 辦證代理合同范本
- 代理土地合同范本
- 乳膠卷材供貨合同范本
- 加工輔料采購合同范本
- 《大模型原理與技術(shù)》全套教學(xué)課件
- 2024年青海省中考生物地理合卷試題(含答案解析)
- 2019譯林版高中英語全七冊單詞總表
- 蘇少版小學(xué)一年級下冊綜合實(shí)踐活動單元備課
- 品茗安全計算軟件新手入門教程1梁模板扣件式
- 預(yù)應(yīng)力空心板吊裝專項施工方案
- 鞍鋼鲅魚圈鋼鐵項目38m生產(chǎn)線工程設(shè)計思想
- 《藥劑學(xué)》-阿昔洛韋軟膏的制備
- 畢業(yè)設(shè)計-膽囊結(jié)石患者的護(hù)理計劃
- 倒排工期計劃表
- 項目承包制實(shí)施方案
評論
0/150
提交評論