新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于X86平臺(tái)的簡(jiǎn)單多任務(wù)內(nèi)核的分析與實(shí)現(xiàn)

基于X86平臺(tái)的簡(jiǎn)單多任務(wù)內(nèi)核的分析與實(shí)現(xiàn)

作者: 時(shí)間:2016-10-08 來(lái)源:網(wǎng)絡(luò) 收藏

摘要:描述了一個(gè)簡(jiǎn)單的設(shè)計(jì)和實(shí)現(xiàn)方法。分析了該簡(jiǎn)單的基本結(jié)構(gòu)和運(yùn)行的基本原理,然后描述了其被進(jìn)機(jī)器RAM中以及兩個(gè)任務(wù)進(jìn)行切換的運(yùn)行方法。

本文引用地址:http://butianyuan.cn/article/201610/305817.htm

0 引言

當(dāng)提到時(shí),人們便會(huì)聯(lián)想到Mac OS、Linux、Windows等操作系統(tǒng)。通常情況下,若在操作系統(tǒng)下運(yùn)行,是由操作系統(tǒng)負(fù)責(zé)管理和調(diào)度各個(gè)任務(wù)的。本文通過(guò)分析一個(gè)簡(jiǎn)單的多任務(wù),能夠便于更容易地理解操作系統(tǒng)的任務(wù)管理機(jī)制,以及可以理解計(jì)算機(jī)系統(tǒng)是如何啟動(dòng)的。

1 多任務(wù)程序的結(jié)構(gòu)

本文實(shí)現(xiàn)的簡(jiǎn)單多任務(wù)內(nèi)核,主要由兩個(gè)文件構(gòu)成:一個(gè)是使用as86語(yǔ)言編制的引導(dǎo)啟動(dòng)程序,主要用于在計(jì)算機(jī)系統(tǒng)加電時(shí),將內(nèi)核代碼從啟動(dòng)盤到內(nèi)存中;另一個(gè)便是使用GNU as匯編語(yǔ)言編寫的內(nèi)核程序,其中實(shí)現(xiàn)兩個(gè)運(yùn)行在特權(quán)級(jí)2上的任務(wù)可在時(shí)鐘中斷控制下相互切換運(yùn)行,并可通過(guò)系統(tǒng)調(diào)用在屏幕上實(shí)現(xiàn)字符顯示。

2 多任務(wù)內(nèi)核工作的啟動(dòng)程序原理

計(jì)算機(jī)系統(tǒng)加電啟動(dòng)后,會(huì)把啟動(dòng)程序從啟動(dòng)盤的第一個(gè)扇區(qū)加載到物理內(nèi)存0x7c00位置開始處,之后把執(zhí)行權(quán)交給0x7c00初開始運(yùn)行啟動(dòng)程序。

啟動(dòng)程序的主要功能是將軟盤或者鏡像文件中的內(nèi)核程序加載到內(nèi)存的某個(gè)指定位置,實(shí)現(xiàn)這個(gè)目的的方法是利用ROS BIOS中斷int 0x 13,把軟盤或者鏡像中的內(nèi)核代碼讀入到內(nèi)存,然后再把這段內(nèi)核代碼移動(dòng)到內(nèi)存0開始處。最后設(shè)置控制寄存器CR0中的開啟保護(hù)運(yùn)行模式標(biāo)志,并跳轉(zhuǎn)到內(nèi)存0處開始執(zhí)行內(nèi)核代碼。啟動(dòng)程序在內(nèi)存中移動(dòng)內(nèi)核代碼的示意圖如圖1所示。

基于X86平臺(tái)的簡(jiǎn)單多任務(wù)內(nèi)核的分析與實(shí)現(xiàn)

將內(nèi)核代碼移動(dòng)到物理內(nèi)存0開始處的主要原因是這是GDT表時(shí)可以簡(jiǎn)單一點(diǎn)。但是,不能讓啟動(dòng)程序把內(nèi)核代碼從軟盤或映像文件中直接加載到內(nèi)存0處,因?yàn)榧虞d操作需要ROM BIOS提供中斷過(guò)程,而BIOS使用的中斷向量表正處于內(nèi)存0開始處。若直接把內(nèi)核代碼加載到內(nèi)存0處,那么,BIOS中斷過(guò)程將不能正常運(yùn)行。

3 內(nèi)核程序

3.1 初始化任務(wù)

內(nèi)核程序運(yùn)行在32位保護(hù)模式下,初始化階段主要包括重新設(shè)置GDT表,設(shè)置系統(tǒng)定時(shí)器芯片,重新設(shè)置IDT表并且設(shè)置時(shí)鐘和系統(tǒng)調(diào)用中斷門。內(nèi)核示例中所有代碼和數(shù)據(jù)段都對(duì)應(yīng)到物理內(nèi)存同一個(gè)區(qū)域上,即從物理內(nèi)存0開始的區(qū)域。在虛擬地址空間中內(nèi)核程序的內(nèi)核代碼和任務(wù)代碼分配圖如圖2所示。

基于X86平臺(tái)的簡(jiǎn)單多任務(wù)內(nèi)核的分析與實(shí)現(xiàn)

3.2 啟動(dòng)第一個(gè)任務(wù)

特權(quán)級(jí)0的代碼不能直接把控制權(quán)轉(zhuǎn)移到特權(quán)級(jí)2的代碼中執(zhí)行,但可以使用中斷返回操作來(lái)實(shí)現(xiàn),因此當(dāng)初始化GDT、IDT和定時(shí)芯片結(jié)束后,就利用中斷返回指令I(lǐng)RET來(lái)啟動(dòng)第一個(gè)任務(wù)。

具體的實(shí)現(xiàn)方法是在初始堆棧init stack中人工設(shè)置一個(gè)返回環(huán)境,即把任務(wù)0的TSS段選擇符加載到任務(wù)寄存器TR中,LDT段選擇符加載到LDTR中以后,把任務(wù)0的用戶棧指針和代碼指針以及標(biāo)志寄存器值壓入棧中,然后執(zhí)行中斷返回指令I(lǐng)RET。該指令會(huì)彈出堆棧上的堆棧指針作為任務(wù)0用戶棧指針,恢復(fù)假設(shè)的任務(wù)0的標(biāo)志寄存器內(nèi)容,并且彈出棧中代碼指針?lè)湃隒S:EIP寄存器中,從而開始執(zhí)行任務(wù)0的代碼,以完成從特權(quán)級(jí)0到特權(quán)級(jí)3代碼的控制轉(zhuǎn)移。

3.3 兩個(gè)任務(wù)的切換

內(nèi)核程序?qū)⒍〞r(shí)器芯片的通道0設(shè)置成每經(jīng)過(guò)10 ms就向中斷控制芯片發(fā)送一個(gè)時(shí)鐘中斷請(qǐng)求信號(hào),這樣,每個(gè)10 ms將會(huì)切換運(yùn)行的任務(wù)。PC的ROM BIOS開機(jī)時(shí)已經(jīng)在定時(shí)器芯片中把時(shí)鐘中斷請(qǐng)求信號(hào)設(shè)置成中斷向量8,因此需要在中斷8的處理過(guò)程中執(zhí)行任務(wù)切換操作。

每個(gè)任務(wù)在執(zhí)行時(shí),會(huì)首先把一個(gè)字符的ASCII碼放入寄存器AL中,然后調(diào)用系統(tǒng)中斷int 0x80,而該系統(tǒng)調(diào)用處理過(guò)程會(huì)調(diào)用一個(gè)簡(jiǎn)單的字符寫屏子程序。在顯示過(guò)一個(gè)字符后,任務(wù)代碼會(huì)使用循環(huán)語(yǔ)句延遲一段時(shí)間,然后又跳轉(zhuǎn)到任務(wù)代碼開始處繼續(xù)循環(huán)執(zhí)行,直到運(yùn)行了10 ms而發(fā)生了定時(shí)中斷,從而代碼會(huì)切換到另一個(gè)任務(wù)去運(yùn)行。

目前,該內(nèi)核示例已經(jīng)在Bochs模擬軟件中運(yùn)行測(cè)試過(guò),測(cè)試結(jié)果如圖3所示。

基于X86平臺(tái)的簡(jiǎn)單多任務(wù)內(nèi)核的分析與實(shí)現(xiàn)

4 結(jié)語(yǔ)

本文分析了一個(gè)基于的簡(jiǎn)單多任務(wù)內(nèi)核的基本結(jié)構(gòu)和加載運(yùn)行原理,描述了其被加載進(jìn)機(jī)器RAM中的基本思路,同時(shí)給出了兩個(gè)任務(wù)進(jìn)行切換的運(yùn)行方法。其主要目的是理解操作系統(tǒng)的啟動(dòng)加載過(guò)程。

附:本文的啟動(dòng)代碼及內(nèi)核代碼如下:

基于X86平臺(tái)的簡(jiǎn)單多任務(wù)內(nèi)核的分析與實(shí)現(xiàn)
基于X86平臺(tái)的簡(jiǎn)單多任務(wù)內(nèi)核的分析與實(shí)現(xiàn)
基于X86平臺(tái)的簡(jiǎn)單多任務(wù)內(nèi)核的分析與實(shí)現(xiàn)
基于X86平臺(tái)的簡(jiǎn)單多任務(wù)內(nèi)核的分析與實(shí)現(xiàn)
基于X86平臺(tái)的簡(jiǎn)單多任務(wù)內(nèi)核的分析與實(shí)現(xiàn)
基于X86平臺(tái)的簡(jiǎn)單多任務(wù)內(nèi)核的分析與實(shí)現(xiàn)
基于X86平臺(tái)的簡(jiǎn)單多任務(wù)內(nèi)核的分析與實(shí)現(xiàn)
上一頁(yè) 1 2 下一頁(yè)

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉