作業系統是計算機軟體系統的重要組成部分,它起著管理計算機軟硬體資源、控制計算機的正常執行及為各類使用者提供使用介面等諸多功能,是其它各類應用軟體賴以存在的基礎。
由於作業系統軟體多數以公司模式集體開發,並以成品軟體的形式進行發售,使得使用者只能侷限於作業系統所提供的使用介面及系統功能呼叫上,對於系統底層的執行機制的理解只能侷限於一些表面現象上,不能深入把握作業系統內部的運作機理,即使以原始碼形式提供的,也由於其規模龐大、特徵繁多,使得使用者不可能在短時間內完全掌握執行機制。為了能充分了解作業系統的功能實現,自己親自動手編寫乙個小型的,或是實現部分功能的作業系統模型,而後逐步完善不失為一種好方法。本文所述的這一作業系統模型即是在這方面的一次嘗試。
功能及特點
1.實現在x86實模式下分時的多工功能。
2.pc機自檢完成後可以完成機器的引導。
3.引導成功後可以使3個程序並行執行,分別執行於自身的程式空間內,完成自身計數器的計值工作,並採用直接寫屏方式輸出到螢幕上。
4.有乙個核心級鍵盤中斷處理程式。
5.軟體規模小巧,易於研讀、理解和實踐,以及進行功能的增強和拓展。
6.程式分模組編寫,功能明確,界限清晰。
7.對於機器的配置要求極低,以intel 80x86 處理器為cpu的pc機、vga彩色顯示器、3英吋軟碟機即可。
執行機制
眾所周知,intel 80386以上的cpu具有實模式和保護模式兩種工作方式,處於保護模式的cpu在硬體上支援儲存器管理、虛擬位址、分頁、保護等功能,具有多工切換機制,是現今的多使用者多工作業系統如windows、linux、freebsd 等所採用的工作方式。而工作於實模式80386 及以上的cpu相當於高效能的8086 cpu ,本身在硬體上不具備多工的切換機制,那末,在x86的實模式下是否可以實現現多工功能呢?答案是肯定的,利用軟體進行模擬。
本程式在系統時鐘中斷的驅動下,利用軟體方式在x86 cpu實模式下實現了乙個多工作業系統模型,可以啟動機器,並在螢幕上顯示由3個並行程序輸出的各自程式計數器。 在巨集觀上,3個程序在並行執行。在微觀實現上,通過時鐘中斷的控制,3個程序依次輪流占用cpu完成各自的工作,即每當發生時鐘中斷,kernel內的排程程式被啟用,順序將下乙個先前被剝奪執行權的程序賦予執行權,使其可以占用cpu執行,當再次發生時鐘中斷時,當前執行的程序被強行中斷執行,排程程式將其斷點資訊儲存到該程序的堆疊區,待下次執行時再將其恢復,而後排程程式選擇下一程序,使其轉入執行狀態。整個系統迴圈往復,直到關機。
相關背景知識
1.pc機自舉過程簡述
pc機在通電後至作業系統接管控制前,要進行一系列的自檢及初始化過程,包括對記憶體、外設等硬體的檢測。在檢測過程中若存在嚴重錯誤則停機。若無則試圖根據cmos內的配置資訊讀取啟動盤上的引導記錄bootsector。通常先從軟盤啟動(本文預設從軟盤啟動),將軟盤上0面0道1扇區的512位元組讀入到記憶體0000:7c00h位址處,而後跳到該位址處執行,這時機器便由軟體接管控制。
通常作業系統都由乙個引導程式進行引導,引導程式的主要作用在於將作業系統的核心讀入記憶體,而後轉到核心去執行,由核心接管機器的所有控制,包括記憶體管理、程序管理、裝置管理、處理機管理等。上述啟動盤上的引導記錄就是乙個引導程式,在該作業系統模型的實現中,boot.a**程式即起到這樣功能的程式,後面將結合具體**進行詳細介紹。
2.pc機的中斷向量表結構
中斷是改變程式執行環境的一種機制,它可以使cpu暫停當前程式的執行,轉去執行引發中斷的中斷源的中斷服務程式。在中斷服務程式執行完畢後,再接著原來的程式執行。中斷可以通過中斷指令int xx或由外部的硬體裝置產生。中斷向量錶即提供當中斷發生時,如何轉向中斷服務程式的方法。在中斷向量表中存放了相應中斷服務程式的入口位址,這一入口位址稱為中斷向量,它由段位址和偏移組成,即cs:ip。 pc機中的中斷向量表位於低端記憶體區的1kb儲存器中,絕對位址為:00000h~003ffh, 其中的每個中斷向量佔4個位元組,cs佔2個位元組(佔高位址區),ip佔2個位元組(佔低位址區)。給定乙個中斷型別號,即可通過如下的方式取得中斷向量的段位址及偏移:
cs=[中斷型別號*4]
ip=[中斷型別號*4+2]
3.pc機遮蔽中斷的內部處理過程
pc機中斷發生時,若中斷標誌i=1(中斷允許),則有如下的內部動作:
◆ 將中斷型別號*4,得到中斷向量表的指標;
◆ 將cpu的標誌暫存器flag入棧;
◆ 將中斷標誌i和陷阱標誌t清0;
◆ 將主程式斷點處的cs及ip分別壓入堆疊儲存;
◆ 從中斷向量表中取得中斷服務程式的入口位址,分別送到cs 和ip中;
◆ 轉到中斷服務程式去執行。
對於軟體中斷,則不判斷中斷標誌的狀態,直接執行a~f的處理過程。
在使用者所寫的中斷服務程式的末尾,要有一條中斷返回指令iret,控制程式流由中斷服務程式返回到主程式中,它所完成的內部處理如下:
◆ 將先前壓棧儲存的端點從堆疊彈出,送到cs和ip中;
◆ 執行popf操作,恢復標誌暫存器flag;
◆ 從主程式的端點處繼續執行。
4.pc機的過程呼叫
pc機的過程呼叫通過call指令產生,它的處理過程與中斷過程相似,但無標誌暫存器的處理,具體如下所示。
遠過程呼叫:call far farentry
◆ 以farentry的偏移及段位址送入ip及cs;
◆ 轉到farentry去執行。
遠過程呼叫返回:retf
◆ 將返回位址彈出到ip及cs;
◆ 從返回位址處繼續執行程式。
對於近過程呼叫,則呼叫時只儲存返回位址的ip,過程結束時只恢復ip。
5.組合語言相關知識
本程式在linux下用na**進行編譯。na**是乙個功能強大的開源**的組合語言編譯程式,其語法與intel語法相似,可以產生純二進位制的指令**,也可以產生a.out及elf格式的目標**,通過聯結器連線便可生成直接由作業系統執行的程式。這裡用它產生二進位制格式的指令**,這是一種記憶體映像,載入到記憶體便可直接執行。關於na**編譯器的詳細資訊可參考相關資料。
編寫實模式多工作業系統模型之(6)
自己動手增加乙個新程序 如果使用者想自己動手增加乙個新的程序,如名為task4的程序,須在kernel.a 程式中做如下幾處修改 1 將maxtasks的值定義為4。2 在程式中增加乙個入口位址為task4的一段 功能上應為一段無限迴圈的 有動態資訊輸出的程式,如乙個字元在螢幕的某行上反覆滾動顯示。...
多工作業系統
單使用者單任務作業系統是指一台計算機同時只能有乙個使用者在使用,該使用者一次只能提交乙個作業,乙個使用者獨自享用系統的全部硬體和軟體資源。多使用者與多工作業系統是指一台計算機可以同時有多個使用者同時使用,並且同時可以執行由多個使用者提交的多個任務。windows多工處理採用的是虛擬機器技術,為每乙個...
多工作業系統的任務切換
在學習os時,對於多工作業系統的任務切換,一直不能理解 控制權是怎麼麼回到排程程式上的?記得在描述任務切換時,一般都是這麼描述的 在每乙個時鐘滴答,都將檢查當前程序是否是乙個運 行超過100毫秒的使用者程序。如果是,則呼叫排程程式來檢視是否有另乙個使用者程序在等待cpu,我這裡舉個例子 我用 寫了乙...