• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 基于X86平臺的簡單多任務內核的分析與實現

    基于X86平臺的簡單多任務內核的分析與實現

    作者: 時間:2016-10-08 來源:網絡 收藏

    摘要:描述了一個簡單的設計和實現方法。分析了該簡單的基本結構和運行的基本原理,然后描述了其被進機器RAM中以及兩個任務進行切換的運行方法。

    本文引用地址:http://www.czjhyjcfj.com/article/201610/305817.htm

    0 引言

    當提到時,人們便會聯想到Mac OS、Linux、Windows等操作系統。通常情況下,若在操作系統下運行,是由操作系統負責管理和調度各個任務的。本文通過分析一個簡單的多任務,能夠便于更容易地理解操作系統的任務管理機制,以及可以理解計算機系統是如何啟動的。

    1 多任務程序的結構

    本文實現的簡單多任務內核,主要由兩個文件構成:一個是使用as86語言編制的引導啟動程序,主要用于在計算機系統加電時,將內核代碼從啟動盤到內存中;另一個便是使用GNU as匯編語言編寫的內核程序,其中實現兩個運行在特權級2上的任務可在時鐘中斷控制下相互切換運行,并可通過系統調用在屏幕上實現字符顯示。

    2 多任務內核工作的啟動程序原理

    計算機系統加電啟動后,會把啟動程序從啟動盤的第一個扇區加載到物理內存0x7c00位置開始處,之后把執行權交給0x7c00初開始運行啟動程序。

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

    基于X86平臺的簡單多任務內核的分析與實現

    將內核代碼移動到物理內存0開始處的主要原因是這是GDT表時可以簡單一點。但是,不能讓啟動程序把內核代碼從軟盤或映像文件中直接加載到內存0處,因為加載操作需要ROM BIOS提供中斷過程,而BIOS使用的中斷向量表正處于內存0開始處。若直接把內核代碼加載到內存0處,那么,BIOS中斷過程將不能正常運行。

    3 內核程序

    3.1 初始化任務

    內核程序運行在32位保護模式下,初始化階段主要包括重新設置GDT表,設置系統定時器芯片,重新設置IDT表并且設置時鐘和系統調用中斷門。內核示例中所有代碼和數據段都對應到物理內存同一個區域上,即從物理內存0開始的區域。在虛擬地址空間中內核程序的內核代碼和任務代碼分配圖如圖2所示。

    基于X86平臺的簡單多任務內核的分析與實現

    3.2 啟動第一個任務

    特權級0的代碼不能直接把控制權轉移到特權級2的代碼中執行,但可以使用中斷返回操作來實現,因此當初始化GDT、IDT和定時芯片結束后,就利用中斷返回指令IRET來啟動第一個任務。

    具體的實現方法是在初始堆棧init stack中人工設置一個返回環境,即把任務0的TSS段選擇符加載到任務寄存器TR中,LDT段選擇符加載到LDTR中以后,把任務0的用戶棧指針和代碼指針以及標志寄存器值壓入棧中,然后執行中斷返回指令IRET。該指令會彈出堆棧上的堆棧指針作為任務0用戶棧指針,恢復假設的任務0的標志寄存器內容,并且彈出棧中代碼指針放入CS:EIP寄存器中,從而開始執行任務0的代碼,以完成從特權級0到特權級3代碼的控制轉移。

    3.3 兩個任務的切換

    內核程序將定時器芯片的通道0設置成每經過10 ms就向中斷控制芯片發送一個時鐘中斷請求信號,這樣,每個10 ms將會切換運行的任務。PC的ROM BIOS開機時已經在定時器芯片中把時鐘中斷請求信號設置成中斷向量8,因此需要在中斷8的處理過程中執行任務切換操作。

    每個任務在執行時,會首先把一個字符的ASCII碼放入寄存器AL中,然后調用系統中斷int 0x80,而該系統調用處理過程會調用一個簡單的字符寫屏子程序。在顯示過一個字符后,任務代碼會使用循環語句延遲一段時間,然后又跳轉到任務代碼開始處繼續循環執行,直到運行了10 ms而發生了定時中斷,從而代碼會切換到另一個任務去運行。

    目前,該內核示例已經在Bochs模擬軟件中運行測試過,測試結果如圖3所示。

    基于X86平臺的簡單多任務內核的分析與實現

    4 結語

    本文分析了一個基于的簡單多任務內核的基本結構和加載運行原理,描述了其被加載進機器RAM中的基本思路,同時給出了兩個任務進行切換的運行方法。其主要目的是理解操作系統的啟動加載過程。

    附:本文的啟動代碼及內核代碼如下:

    基于X86平臺的簡單多任務內核的分析與實現
    基于X86平臺的簡單多任務內核的分析與實現
    基于X86平臺的簡單多任務內核的分析與實現
    基于X86平臺的簡單多任務內核的分析與實現
    基于X86平臺的簡單多任務內核的分析與實現
    基于X86平臺的簡單多任務內核的分析與實現
    基于X86平臺的簡單多任務內核的分析與實現
    上一頁 1 2 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 民丰县| 礼泉县| 涟水县| 河北区| 凭祥市| 木里| 洪湖市| 郧西县| 女性| 灵丘县| 高邑县| 合作市| 佳木斯市| 临武县| 鞍山市| 建始县| 扎兰屯市| 慈溪市| 峨眉山市| 三原县| 枣强县| 常山县| 神农架林区| 汕头市| 政和县| 丹阳市| 社会| 新宁县| 曲麻莱县| 梧州市| 伊金霍洛旗| 蓬莱市| 崇文区| 广宁县| 蓝田县| 资溪县| 团风县| 西平县| 驻马店市| 翁源县| 嘉定区|