freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

一個(gè)簡(jiǎn)易操作系統(tǒng)的實(shí)現(xiàn)畢業(yè)論文-資料下載頁(yè)

2025-06-28 01:53本頁(yè)面
  

【正文】 一個(gè)可用任務(wù)狀態(tài)段TSS描述符時(shí),正常情況下就發(fā)生從當(dāng)前任務(wù)到由該TSS對(duì)應(yīng)的目標(biāo)任務(wù)的切換。目標(biāo)任務(wù)的入口點(diǎn)由目標(biāo)任務(wù)TSS內(nèi)的CS和EIP字段所規(guī)定的的指針確定,而指令內(nèi)部的偏移將被丟棄。另一中進(jìn)行任務(wù)切換的方式是,直接通過任務(wù)門進(jìn)行任務(wù)切換。我們知道,任務(wù)門內(nèi)的選擇子指示某個(gè)任務(wù)的TSS描述符。當(dāng)段間轉(zhuǎn)移指令JMP或段間調(diào)用指令CALL所含指針的選擇子指示一個(gè)任務(wù)門時(shí),正常情況下就發(fā)生任務(wù)切換,也就是從當(dāng)前任務(wù)切換到由任務(wù)門內(nèi)的選擇子所指示的TSS描述符對(duì)應(yīng)的任務(wù),也就是目標(biāo)任務(wù)。此時(shí),JMP或CALL指令內(nèi)的偏移和任務(wù)門內(nèi)的偏移都沒有意義。 任務(wù)切換過程根據(jù)指示目標(biāo)任務(wù)TSS描述符的選擇子進(jìn)行任務(wù)切換的一般過程如下:a) 測(cè)試目標(biāo)任務(wù)狀態(tài)段TSS的界限。TSS用于保存任務(wù)的各種狀態(tài)信息,不同的任務(wù),TSS中可以由數(shù)量不等的其他信息,但根據(jù)任務(wù)狀態(tài)段TSS的基本格式,TSS的界限應(yīng)該大于或等于103。b) 把寄存器現(xiàn)場(chǎng)保存到當(dāng)前任務(wù)的TSS。把通用寄存器、段寄存器、EIP以及EFLAGS的當(dāng)前值保存到當(dāng)前TSS中。保存的EIP的值是返回地址,指向引起任務(wù)切換指令的下一條指令,任務(wù)返回后繼續(xù)執(zhí)行。但是,LDTR和CR3不被保存入TSS中。c) 把指示目標(biāo)任務(wù)TSS的選擇子裝入TR。同時(shí),把對(duì)應(yīng)TSS描述符裝入TR高速緩沖寄存器中。此后,當(dāng)前任務(wù)改稱為原任務(wù),目標(biāo)任務(wù)改稱為當(dāng)前任務(wù)。d) 基本恢復(fù)當(dāng)前任務(wù)(目標(biāo)任務(wù))的寄存器現(xiàn)場(chǎng)。根據(jù)保存在TSS中的內(nèi)容,恢復(fù)各通用寄存器、段寄存器、EFLAGS以及EIP。在裝入段寄存器的過程中,為了能夠正確處理可能發(fā)生的異常,只把對(duì)應(yīng)選擇子裝入各段寄存器。還要裝載CR3寄存器。e) 進(jìn)行鏈接處理。f) 把CR0中的TS標(biāo)志置為1。將CR0中的TS標(biāo)志置為1的目的是為了表示已經(jīng)發(fā)生過任務(wù)切換,在當(dāng)前任務(wù)使用協(xié)處理器指令時(shí),產(chǎn)生自陷。由自陷處理程序完成有關(guān)協(xié)處理器現(xiàn)場(chǎng)保存和恢復(fù),這個(gè)有利于快速地切換任務(wù)。g) 把TSS中的CS選擇子的RPL作為當(dāng)前任務(wù)特權(quán)級(jí)設(shè)置為CPL。h) 裝載LDTR寄存器。一個(gè)任務(wù)可以有自己的LDT,當(dāng)然,也可以沒有。當(dāng)任務(wù)沒有LDT時(shí),TSS中LDT選擇子為0。如果TSS中LDT選擇子非空,則從GDT中讀出相應(yīng)LDT描述符,在經(jīng)過測(cè)試后,把所讀LDT描述符裝入LDTR高速緩沖寄存器。如果LDT選擇子為空,則將LDT的存在位設(shè)置成0,標(biāo)明任務(wù)不適用LDT。i) 裝載代碼段寄存器CS、堆棧段寄存器SS和各個(gè)數(shù)據(jù)段寄存器以及其他的高速緩沖寄存器。j) 把調(diào)試寄存器DR7中的局部啟用位設(shè)置為0,以清除局部于原任務(wù)的各個(gè)斷電和方式。第4章 MyOS具體設(shè)計(jì)與實(shí)現(xiàn) MyOS的開發(fā)語(yǔ)言、開發(fā)流程以及開發(fā)環(huán)境簡(jiǎn)述 由于多次需要提到本文所設(shè)計(jì)的操作系統(tǒng),所以為這個(gè)操作系統(tǒng)取名MyOS。MyOS使用的開發(fā)語(yǔ)言為匯編語(yǔ)言和C語(yǔ)言。在編碼的過程中,為了使代碼邏輯清晰且易于維護(hù),能用C語(yǔ)言的地方都避免使用匯編,利用匯編語(yǔ)言完成的任務(wù)有:在系統(tǒng)啟動(dòng)前期用匯編完成一些操作系統(tǒng)準(zhǔn)備工作;以及貫穿整個(gè)操作系統(tǒng)運(yùn)行時(shí)期,對(duì)某些C語(yǔ)言無法操作的寄存器進(jìn)行的操作;其最重要的貢獻(xiàn)還是完成了由16位實(shí)模式向32位保護(hù)模式的跳轉(zhuǎn),以及跳轉(zhuǎn)之前利用16位實(shí)模式可以調(diào)用BIOS中斷函數(shù)獲取和設(shè)置一些關(guān)于硬件的信息,如果某些信息需要保存,則保存在某個(gè)約定的內(nèi)存地址,以供運(yùn)行于32位保護(hù)模式時(shí)期的操作系統(tǒng)使用。(32保護(hù)模式不能調(diào)用BIOS中斷函數(shù),因?yàn)锽IOS中斷函數(shù)都是16位代碼段) MyOS的開發(fā)流程并不復(fù)雜,主要按照如下幾個(gè)步驟進(jìn)行:a) 在Windows系統(tǒng)上編寫源代碼,包括c語(yǔ)言源代碼和匯編源代碼,以及makefile文件。b) 用C語(yǔ)言編譯器和匯編語(yǔ)言編譯器編譯源代碼,并生成各自的機(jī)器語(yǔ)言文件。c) 對(duì)機(jī)器語(yǔ)言進(jìn)行鏈接,并用軟件生成軟盤映像文件。d) 將映像文件寫入磁盤(軟盤),做成含操作系統(tǒng)的啟動(dòng)盤。下面對(duì)這幾個(gè)步驟涉及到的具體信息進(jìn)行詳細(xì)說明。a) C編譯器。由于現(xiàn)在使用較多的C編譯器都是以開發(fā)Windows或者Linux上的應(yīng)用程序?yàn)榍疤岫O(shè)計(jì)的,但是如果用來對(duì)編寫操作系統(tǒng)的C源代碼進(jìn)行編譯的話,可能會(huì)有一些不便的地方,所以此次畢設(shè)使用的是為開發(fā)操作系統(tǒng)而做出了些修改的類GCC編譯器。b) 匯編編譯器。為了使匯編之后的機(jī)器代碼能夠與這個(gè)類GCC編譯器編譯出來的機(jī)器代碼保持一致,此次畢設(shè)使用的是和這個(gè)類GCC編譯器配套的匯編編譯器。c) 軟盤映像文件。軟盤映像文件就是每一個(gè)bit都與實(shí)體軟盤一一對(duì)應(yīng)的文件,例如,一個(gè)裝滿了文件的1440K的軟盤,其軟盤映像文件就是1440K,而且從頭到尾,軟盤映像中的每一位(“0”或者“1”)都和實(shí)體軟盤相同。軟盤映像文件可以用于模擬虛擬機(jī)的軟盤,編寫好的操作系統(tǒng)經(jīng)過編譯成機(jī)器代碼以后,可以寫入到映像文件中,用虛擬機(jī)以虛擬軟盤位啟動(dòng)盤,可以得到和真機(jī)運(yùn)行相同的效果。這樣的一個(gè)工具大大地方便了系統(tǒng)的開發(fā)。在系統(tǒng)的開發(fā)過程中,與軟盤映像文件對(duì)應(yīng)的有兩個(gè)軟件,一個(gè)是軟盤映像寫入軟件,其功能把映像文件當(dāng)做是一個(gè)普通文件,將二進(jìn)制文件寫入到映像文件中,主要用于將編譯好的系統(tǒng)寫入到映像文件中;另一個(gè)軟件是虛擬軟盤存取軟件,這個(gè)軟件可以將軟盤映像文件模擬成一個(gè)機(jī)器上的硬盤驅(qū)動(dòng)器,可以像操作硬盤的一個(gè)分區(qū)一樣操作這個(gè)軟盤,例如新建文件、打開文件、修改文件、保存文件、修改目錄,不過支持的格式只有FAT1FAT1FAT32格式,本人沒有這個(gè)軟件的源代碼,但是猜測(cè)這個(gè)軟件的運(yùn)行原理應(yīng)該是:根據(jù)FAT1FAT1FAT32格式文件系統(tǒng)的運(yùn)行原理,直接對(duì)文件系統(tǒng)的根目錄區(qū)、FAT區(qū)、數(shù)據(jù)區(qū)進(jìn)行模擬,例如:如需要新建一個(gè)文件,這個(gè)軟件就會(huì)要在根目錄區(qū)對(duì)應(yīng)的文件位置新建一個(gè)文件名(當(dāng)然,包括這個(gè)文件的諸多信息),接著如果向這個(gè)文件寫入內(nèi)容,這個(gè)軟件就會(huì)向軟盤映像文件中對(duì)應(yīng)的位置寫入這個(gè)文件的信息,同時(shí)更新FAT表。總結(jié)來說,就是如果在實(shí)體軟盤中做的一些文件操作,你使用的系統(tǒng)怎樣寫入或讀取實(shí)體軟盤,這個(gè)軟件就怎樣對(duì)待軟盤映像文件。d) Makefile文件。到現(xiàn)在為止,需要要用到的軟件有C編譯器、匯編編譯器、軟盤映像寫入文件、虛擬軟盤存取軟件,當(dāng)然還有一個(gè)鏈接器用來把所有的目標(biāo)文件鏈接在一起,再寫入到軟盤映像文件中,而這些軟件的使用都是命令行方式,如果每編譯一個(gè)文件,都要輸入一行命令,效率非常低,所以就使用腳本批處理文件,但是批處理也有其缺陷,因?yàn)閷鞰yOS的文件非常之多,而且隨著開發(fā)的推進(jìn),文件之間有很多依賴關(guān)系,這樣如果改動(dòng)一個(gè)文件,就要多次運(yùn)行批處理,而且必須牢記每個(gè)文件之間的關(guān)系。為了解決這個(gè)問題,引入了makefile文件,有了這個(gè)機(jī)制,每次只需要運(yùn)行一個(gè)命令,就能完成所有的工作,當(dāng)有新的依賴關(guān)系或者添加新的內(nèi)容時(shí),修改makefile文件即可。系統(tǒng)的開發(fā)的環(huán)境。匯編用的是記事本,C語(yǔ)言用的是Visual C++ 。 MyOS運(yùn)行原理簡(jiǎn)述 引導(dǎo)扇區(qū)計(jì)算機(jī)加電以后,BIOS程序引導(dǎo)計(jì)算機(jī)的啟動(dòng),它首先檢查被設(shè)置用來啟動(dòng)的磁盤(硬盤、軟盤、閃存)中的第一個(gè)扇區(qū)(512字節(jié)),并檢查這個(gè)扇區(qū)的最后兩個(gè)字節(jié),如果這兩個(gè)字節(jié)是55 AA,則說明這個(gè)扇區(qū)被設(shè)置為啟動(dòng)扇區(qū),這時(shí)BIOS會(huì)“指揮”CPU跳到這個(gè)扇區(qū)的某個(gè)地址(這個(gè)地址的信息在扇區(qū)存儲(chǔ)),開始順序執(zhí)行,也就是將執(zhí)行的權(quán)利交到這個(gè)啟動(dòng)扇區(qū),而再后來這個(gè)啟動(dòng)扇區(qū)又會(huì)跳轉(zhuǎn)到操作系統(tǒng)內(nèi)核代碼,這樣,操作系統(tǒng)就運(yùn)行起來。引導(dǎo)扇區(qū)要做的第二件事情是從BIOS讀出機(jī)器的信息,保存到內(nèi)存的某個(gè)約定的地址,這樣做的原因是:機(jī)器一開始運(yùn)行在16位的實(shí)模式下,可以利用BIOS中斷獲得很多信息,進(jìn)行很多操作,而到32保護(hù)模式下,就無法運(yùn)行BIOS中的16位代碼段,無法使用BIOS的中斷函數(shù)。引導(dǎo)扇區(qū)的編寫是用匯編,直接匯編成機(jī)器代碼后寫入到軟盤映像文件的第一個(gè)扇區(qū),當(dāng)然,在寫匯編代碼的時(shí)候,必須控制匯編之后目標(biāo)文件的大小為512字節(jié),并且最后的兩個(gè)字節(jié)是55 AA。 加載內(nèi)核 上一節(jié)講的是引導(dǎo)扇區(qū)引導(dǎo)計(jì)算機(jī)啟動(dòng)并保存機(jī)器的相關(guān)信息到內(nèi)存。而引導(dǎo)扇區(qū)只有512字節(jié)大小,它必須盡快完成一些任務(wù),之后把權(quán)利交出去。 實(shí)際的操作系統(tǒng)在從引導(dǎo)扇區(qū)啟動(dòng)之后,都會(huì)讀入并運(yùn)行一個(gè)加載內(nèi)核的Loader,這個(gè)Loader負(fù)責(zé)加載內(nèi)核和模式的切換,然后把權(quán)利交給內(nèi)核。而本次的MyOS系統(tǒng)為了簡(jiǎn)便,直接在引導(dǎo)扇區(qū)里加載內(nèi)核,而模式的切換并入到系統(tǒng)的內(nèi)核當(dāng)中。 加載內(nèi)核的過程很簡(jiǎn)單,就是利用BIOS中的讀取磁盤中斷服務(wù)程序,將之前寫入磁盤的系統(tǒng)文件拷貝至內(nèi)存,然后把CPU的EIP寄存器設(shè)置為系統(tǒng)所在的位置,這樣系統(tǒng)就得到執(zhí)行了。 執(zhí)行系統(tǒng)內(nèi)核執(zhí)行系統(tǒng)內(nèi)核只是一個(gè)概念,不需要詳細(xì)敘述。但是到此為止,還沒有介紹MyOS具體信息,這里就先給出一個(gè)MyOS運(yùn)行時(shí)的內(nèi)存分布圖,如圖41,以后詳細(xì)介紹系統(tǒng)各部分的時(shí)候,可以心中有數(shù)。圖42是實(shí)模式下使用的1M內(nèi)存空間,在保護(hù)模式下依舊使用,里面存有啟動(dòng)時(shí)期保存的有關(guān)機(jī)器的信息,在保護(hù)模式下需要使用。圖 41 MyOS系統(tǒng)的內(nèi)存分布圖圖 42 保護(hù)模式和實(shí)模式都使用的內(nèi)存中前1MB空間分布圖 MyOS內(nèi)核設(shè)計(jì)與實(shí)現(xiàn) 內(nèi)存管理內(nèi)存管理的主要內(nèi)容是內(nèi)存容量的檢查、內(nèi)存分配、內(nèi)存釋放,而為了方便管理大內(nèi)存,減少磁盤外部碎片,還要設(shè)計(jì)一個(gè)以4KB為單位的內(nèi)存分配和內(nèi)存釋放,這兩個(gè)功能在整個(gè)系統(tǒng)中是內(nèi)存管理的主要體現(xiàn)形式。 內(nèi)存容量檢查 內(nèi)存管理的第一步是弄清楚內(nèi)存的大小。而在機(jī)器最初啟動(dòng)的時(shí)候,BIOS已經(jīng)檢查了內(nèi)存,并且會(huì)保存內(nèi)存信息。但是問題是,BIOS版本不同,調(diào)用方法也不同,所以,通過別的手段得到內(nèi)存的有效大小。 得到內(nèi)存有效大小的原理是:往內(nèi)存的一個(gè)單元寫入一個(gè)值,再?gòu)倪@個(gè)單元讀出這個(gè)值,如果相等,則說明該內(nèi)存是可以使用的內(nèi)存。 但是有一點(diǎn)要注意,從486以后英特爾就在處理器中加入了一個(gè)高速緩存,利用局部性原理提高CPU的吞吐率,緩沖CPU和內(nèi)存之間的速度差別的矛盾。而如果高速緩存起作用的話,CPU讀出和寫入的第一個(gè)對(duì)象是高速緩存,尤其是在寫入某個(gè)單元后再次讀出這個(gè)單元的情況下,這個(gè)值并不會(huì)真正寫入到內(nèi)存,而是會(huì)在高速緩存中。所以,先要將CPU的高速緩存禁止,在測(cè)試完內(nèi)存容量以后再次打開。 怎樣禁止緩存呢?控制寄存器CR0中有一位標(biāo)志位是控制緩存是否有效的,可以對(duì)它進(jìn)行操作。 以下是內(nèi)存大小檢查的代碼。unsigned int memtest(unsigned int start, unsigned int end){ char flg486 = 0。 unsigned int eflg, cr0, i。 /* 確認(rèn)CPU是386還是486以上的 */ eflg = io_load_eflags()。 eflg |= EFLAGS_AC_BIT。 /* ACbit = 1 */ io_store_eflags(eflg)。 eflg = io_load_eflags()。 if ((eflg amp。 EFLAGS_AC_BIT) != 0) { /* 如果是386,即使設(shè)定AC = 1,AC的值還是會(huì)自動(dòng)回到0 */ flg486 = 1。 } eflg amp。= ~EFLAGS_AC_BIT。 /* ACbit = 0 */ io_store_eflags(eflg)。 if (flg486 != 0) { cr0 = load_cr0()。 cr0 |= CR0_CACHE_DISABLE。 /* 禁止緩存 */ store_cr0(cr0)。 } i = memtest_sub(start, end)。//這個(gè)函數(shù)使用匯編寫的,返回能用的內(nèi)存的最大地址 if (flg486 != 0) { cr0 = load_cr0()。 cr0 amp。= ~CR0_CACHE_DISABLE。 /* 允許緩存 */ store_cr0(cr0)。 } return i。} 用于內(nèi)存管理的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì) 在操作系統(tǒng)的課程上,主要介紹了兩種內(nèi)存管理的方式,一種是位示圖法,即用1位來表示一個(gè)單位的內(nèi)存是否正在使用。例如,128M的內(nèi)存,共有0x08000000個(gè)字節(jié),以0x1000(4KB)為單位進(jìn)行管理,需要?jiǎng)?chuàng)建0x08000000/0x1000 = 32768個(gè)單位進(jìn)行管理。還有一種是空閑分區(qū)鏈管理法,即記錄下每一塊空閑區(qū)域的起始地址和大小,每當(dāng)有內(nèi)存分配時(shí),則遍歷所有空閑區(qū)域的記錄,找到一塊合適的分配給它,然后再更新內(nèi)存的空閑區(qū)域記錄;釋放時(shí)也一樣,更新相應(yīng)的空閑區(qū)域記錄,但是有一點(diǎn)要注意,內(nèi)存釋放的空間上面和下面的空間也可能是空閑的,這樣就要與上面和下面空閑的空間合并,在空閑區(qū)域記錄中歸納成一條,要不然系統(tǒng)運(yùn)行到后面就沒有大塊的內(nèi)存可用,全部都被分割成小塊的空閑區(qū)域。 MyOS中采用的是第二種管理方法,其原因?yàn)椋菏紫日加脙?nèi)存少,而且大塊內(nèi)存分配和釋放時(shí)都特別迅速,如果用位示圖法,需要對(duì)大量的內(nèi)存進(jìn)行讀寫。 以下是用于內(nèi)存管理的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)。define MEMMAN_FREES 4090 /* 最大個(gè)數(shù)32KB */define MEMMAN_ADDR 0x003c0000 /* 約定的存放內(nèi)存管理信息(結(jié)構(gòu)體信息)的首地址*/struct FREEINFO { /* 一塊空閑區(qū)域 */ unsigned int addr, size。}。struct MEMMAN { /* 內(nèi)存管理器 */ int frees。 /* 空閑內(nèi)存區(qū)域的數(shù)量 */int maxfrees。 /* 最大的空閑內(nèi)存區(qū)域大小 */ struct FREEINFO free[MEMMAN_FREES]。 /* 所有的內(nèi)存區(qū)域記錄 */}。
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1