μC/OS-II在PC機(jī)上移植的設(shè)計(jì)與實(shí)現(xiàn)
1 引言
μC/OS-II是專門為嵌入式系統(tǒng)應(yīng)用而設(shè)計(jì)的嵌入式實(shí)時(shí)操作系統(tǒng),人們?cè)趯W(xué)習(xí)μC/OS-II時(shí),一開始往往在基于PC機(jī)的DOS或 Windows環(huán)境下進(jìn)行分析與研究。在這種環(huán)境中,帶有μC/OS-II內(nèi)核的應(yīng)用系統(tǒng)(簡(jiǎn)稱μC/OS-II應(yīng)用系統(tǒng))的運(yùn)行,讓人覺得它好像是一個(gè) DOS程序,人們無法真實(shí)地領(lǐng)略實(shí)時(shí)操作系統(tǒng)的面貌。實(shí)際上,在PC機(jī)的DOS或Windows環(huán)境中,μC/OS-II應(yīng)用系統(tǒng)確實(shí)是一個(gè)DOS可執(zhí)行程序,它的運(yùn)行離不開DOS或Windows環(huán)境。為了讓更多的人掌握和理解μC/OS-II實(shí)時(shí)操作系統(tǒng),筆者對(duì)μC/OS-II進(jìn)行移植,使其完全脫離DOS或Windows環(huán)境而運(yùn)行。首先設(shè)計(jì)Bootloader引導(dǎo)程序,由它來裝入μC/OS-II應(yīng)用系統(tǒng);其次修改BORLAND C++編譯器中的EXE啟動(dòng)代碼,剝?nèi)ヅcDOS相關(guān)的代碼;最后修改μC/OS-II內(nèi)核代碼中與硬件平臺(tái)相關(guān)部分的代碼,使其能正常運(yùn)行和正常退出。
2 bootloader的設(shè)計(jì)
Bootloader引導(dǎo)程序的設(shè)計(jì)是嵌入式系統(tǒng)軟件開發(fā)的一個(gè)重要環(huán)節(jié),它把操作系統(tǒng)和硬件平臺(tái)銜接在一起,通過初始化硬件設(shè)備、建立內(nèi)存空間映射,為最終加載操作系統(tǒng)內(nèi)核建立正確的環(huán)境。由于Bootloader的實(shí)現(xiàn)依賴于CPU的體系結(jié)構(gòu),因此大多數(shù)初始化引導(dǎo)程序分為兩部分,第一部分主要包含依賴于CPU體系結(jié)構(gòu)的硬件初始化代碼,第二部分實(shí)現(xiàn)的功能比第一部分更多更復(fù)雜,它為內(nèi)核程序準(zhǔn)備運(yùn)行的環(huán)境,將內(nèi)核裝入到指定位置,并轉(zhuǎn)到內(nèi)核處運(yùn)行。本文設(shè)計(jì)的Bootloader也是由兩部分構(gòu)成,一部分稱作BOOT的引導(dǎo)記錄,另一部分是LOADER裝入程序。BOOT的大小固定為512個(gè)字節(jié),作為引導(dǎo)記錄存放在軟盤的0面0磁道1扇區(qū),它所實(shí)現(xiàn)的功能是在軟盤的目錄區(qū)中尋找LOADER文件,并將LOADER裝入到內(nèi)存中,然后由 LOADER負(fù)責(zé)初始化工作環(huán)境并引導(dǎo)內(nèi)核的運(yùn)行。
軟盤采用FAT文件系統(tǒng),并對(duì)它進(jìn)行格式化,使用工具將BOOT寫到0面0磁道1扇區(qū)中,將LOADER和μC/OS-II應(yīng)用系統(tǒng)程序復(fù)制到軟盤中,然后用軟盤啟動(dòng)系統(tǒng),就能觀察到μC/OS-II實(shí)時(shí)操作系統(tǒng)的運(yùn)行情況,它完全脫離了DOS運(yùn)行環(huán)境。同樣,也可以通過Bochs、QEMU或 VMware等虛擬機(jī)做一個(gè)磁盤映像文件,用BOOT替換該映像文件的前512個(gè)字節(jié),將LOADER和μC/OS-II應(yīng)用系統(tǒng)復(fù)制到該映像文件中,然后就可以在虛擬機(jī)中完成系統(tǒng)的啟動(dòng)。這樣,在每次修改程序后,不需要重新啟動(dòng)機(jī)器來驗(yàn)證系統(tǒng)的正確性,而只需要調(diào)整映像文件,在虛擬機(jī)中重啟系統(tǒng)即可,使用虛擬機(jī)使內(nèi)核的修改和調(diào)試變得十分容易。
2.1 BOOT的設(shè)計(jì)
當(dāng)PC機(jī)加電后,首先進(jìn)行自檢,然后尋找啟動(dòng)盤,如果從軟盤啟動(dòng),計(jì)算機(jī)讀取軟盤的0面0磁道1扇區(qū)的內(nèi)容,若該扇區(qū)最后兩個(gè)字節(jié)是0x55、 0xaa,則其為引導(dǎo)扇區(qū),計(jì)算機(jī)將其內(nèi)容裝入到內(nèi)存地址0x7c00開始處,并轉(zhuǎn)到該處運(yùn)行。因BOOT只能占用一個(gè)扇區(qū),其大小固定為512個(gè)字節(jié),其實(shí)現(xiàn)的功能受到限制,所以BOOT的主要功能是在磁盤的目錄區(qū)中尋找LOADER程序,并將其裝入到內(nèi)存中,最后將CPU的控制權(quán)交給LOADER,其后的任務(wù)就由LOADER完成。BOOT程序的算法描述如下:
(1) 在顯示屏上顯示“Booting...”提示信息,同時(shí)使軟驅(qū)復(fù)位;
(2) 在磁盤的目錄區(qū)中尋找LOADER文件;
(3) 若LOADER文件存在,則轉(zhuǎn)(5);
(4) LOADER文件不存在,顯示提示信息“Boot fail!”,關(guān)閉軟驅(qū)馬達(dá),程序進(jìn)入死循環(huán);
(5) 將LOADER讀到內(nèi)存0x90000處;
(6) CPU轉(zhuǎn)到0x90000處運(yùn)行,即將CPU的控制權(quán)交給LOADER。
這段程序用匯編語言編寫,它經(jīng)過匯編連接后,使用工具軟件,比如debug將其寫到軟盤的0面0道1扇區(qū)。
評(píng)論