日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

系统初始化程序

發(fā)布時間:2025/5/22 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 系统初始化程序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
main.c程序首先利用前面setup.s程序取得的系統(tǒng)參數(shù)設(shè)置系統(tǒng)的根文件設(shè)備號以及一些內(nèi)存全局變量。這些內(nèi)存變量指明了主內(nèi)存的開始地址、系統(tǒng)所擁有的內(nèi)存容量和作為高速緩沖區(qū)的末端地址。如果還定義了虛擬盤(RAMDISK),則主內(nèi)存將適當(dāng)減少。該程序確定如何分配使用系統(tǒng)物理內(nèi)存,然后調(diào)用內(nèi)核各部分的初始化函數(shù)分別對內(nèi)存管理、中斷處理、塊設(shè)備和字符設(shè)備、進(jìn)程管理以及硬盤和軟盤硬件進(jìn)行初始化處理。在完成這些操作之后,系統(tǒng)各部分就已經(jīng)處于可運(yùn)行狀態(tài)。
??? 內(nèi)核進(jìn)行所有方面的硬件初始化工作,包括陷阱門、塊設(shè)備、字符設(shè)備和tty,包括手工設(shè)置第一個任務(wù)。待所有初始化工作完成后程序就設(shè)置中斷允許標(biāo)志以開啟中斷,mai()也切換到了任務(wù)0中運(yùn)行。
??? 在整個內(nèi)核完成初始化后,內(nèi)核將執(zhí)行權(quán)切換到了用戶模式,此時main.c的主程序就工作在任務(wù)0中。然后系統(tǒng)第一次調(diào)用進(jìn)程創(chuàng)建函數(shù)fork(),創(chuàng)建出一個用于運(yùn)行init()的子進(jìn)程。在該函數(shù)中程序?qū)⒗^續(xù)進(jìn)行應(yīng)用環(huán)境的初始化并執(zhí)行shell登陸程序。而原進(jìn)程0則會在系統(tǒng)空閑時被調(diào)度執(zhí)行,因此進(jìn)程0通常也被稱為idle進(jìn)程。此時進(jìn)程0僅執(zhí)行pause()系統(tǒng)調(diào)用,并又會調(diào)用調(diào)度函數(shù)。
??? init()函數(shù)的功能可氛圍4個部分:(1)安裝根文件系統(tǒng)(2)顯示系統(tǒng)消息(3)運(yùn)行系統(tǒng)初始資源配置文件rc中的命令(4)執(zhí)行用戶登陸shell程序。
??? 代碼首先調(diào)用setup(),用來收集硬盤設(shè)備分區(qū)表信息并安裝根文件系統(tǒng)。在安裝根文件系統(tǒng)之前系統(tǒng)會先判斷是否需要先建立虛擬盤。若編譯內(nèi)核時設(shè)置了虛擬盤的大小,并在前面內(nèi)核中已經(jīng)開辟了一塊內(nèi)存用作虛擬盤,則內(nèi)核就會首先嘗試把根文件系統(tǒng)加載到內(nèi)存的虛擬盤區(qū)中。
??? 然后init()打開一個中斷設(shè)備tty0,并復(fù)制其文件描述符以產(chǎn)生標(biāo)準(zhǔn)輸入stdin、標(biāo)準(zhǔn)輸出stdout和錯誤輸出stderr設(shè)備。內(nèi)核隨后利用這些描述符在終端上顯示一些系統(tǒng)信息。接著init()又新建一個進(jìn)程(進(jìn)程2),并在其中為建立用戶交互使用環(huán)境而執(zhí)行一些初始配置操作,即在用戶可以使用shell命令行環(huán)境之前,內(nèi)核調(diào)用/bin/sh程序運(yùn)行了配置文件etc/rc中設(shè)置的命令。rc文件的作用與DOS系統(tǒng)根目錄上的AUTOEXEC.BAT文件類似。這段代碼首先通過關(guān)閉文件描述符0,并立刻打開文件/etc/rc,從而把標(biāo)準(zhǔn)輸入stdin定向到etc/rc文件。這樣,所有的 標(biāo)準(zhǔn)輸入數(shù)據(jù)都將從該文件中讀取。然后內(nèi)核以非交互式執(zhí)行/bin/sh,從而實(shí)現(xiàn)執(zhí)行/etc/rc文件中的命令。當(dāng)該文件中的命令執(zhí)行完畢后,/bin/sh就會立刻退出。因此進(jìn)程2也就隨之結(jié)束。
????inti()函數(shù)的最后一部分在新建進(jìn)程中為用戶建立一個新的會話,并運(yùn)行用戶登陸shell程序/bin/sh。在系統(tǒng)執(zhí)行進(jìn)程2中的程序時,父進(jìn)程(init進(jìn)程)一直等待著它的結(jié)束。隨著進(jìn)程2的退出,父進(jìn)程就進(jìn)入到一個無限循環(huán)中。在該循環(huán)中,父進(jìn)程會再次生成一個新進(jìn)程,然后在該進(jìn)程中創(chuàng)建一個新的會話,并以登陸shell方式再次執(zhí)行程序/bin/sh,以創(chuàng)建用戶交互shell環(huán)境。然后父進(jìn)程繼續(xù)等待該子進(jìn)程。登陸shell雖然與前面的非交互方式shell是同一個程序/bin/sh,但是所使用的命令行參數(shù)不同。從這時開始,用戶就可以正常使用linux命令行環(huán)境了,而父進(jìn)程隨之又進(jìn)入等待狀態(tài)。此后若用戶在命令行上執(zhí)行了exit或logout命令,那么在顯示一條當(dāng)前登陸shell退出的信息后,系統(tǒng)就會在這個無限循環(huán)中再次重復(fù)以上創(chuàng)建登陸shell進(jìn)程的過程。
??? 由于創(chuàng)建新進(jìn)程的過程是通過完全復(fù)制父進(jìn)程代碼段和數(shù)據(jù)段的方式實(shí)現(xiàn),因此在首次使用fork()創(chuàng)建新進(jìn)程init時,為了確保新進(jìn)程用戶態(tài)棧中沒有進(jìn)程0的多余信息,要求進(jìn)程0在創(chuàng)建第一個新進(jìn)程(進(jìn)程1)之前不要使用其用戶態(tài)棧,即要求任務(wù)0不要調(diào)用函數(shù)。因此在main.c主程序移動到任務(wù)0執(zhí)行后,任務(wù)0中的代碼fork()不能以函數(shù)形式進(jìn)行調(diào)用。程序中的實(shí)現(xiàn)方法時采用gcc函數(shù)內(nèi)嵌(內(nèi)聯(lián))形式來執(zhí)行這個系統(tǒng)調(diào)用。

轉(zhuǎn)載于:https://blog.51cto.com/bluefish/38850

總結(jié)

以上是生活随笔為你收集整理的系统初始化程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。