進入保護模式(十二)多任務的簡單實現

1、竊喜下

      終於調通了進程切換的DEMO,用一個標題來竊喜 ^_^ java

2、言歸正傳

      任務調度的實現方式是 git

                                 2.1.經過時鐘中斷,打斷現有的進程 github

                                 2.2.利用中斷跳轉到相應的進程中 函數

                                 2.3.也能夠經過任務門直接進行跳轉(這裏不打算) spa

 

3、中斷以及任務切換工程中的知識點

                                3.1時鐘中斷後棧的格式 code

EIP                ----------- 
CS                    低地位
EFlags
ESP                    高位
SS                 -----------

                                3.2就是任務中斷要保存環境變量(寄存器的狀況) 進程

                                3.3就是任務不一樣特權級切換的過程當中棧要變換的(要有個TSS) ip

4、具體過程     

我目前的實現思路是這樣的,後續在所修改吧。 內存

                                4.1.我把內核棧分配了8K,高端4K自用,低端4K專門用於保存任務的棧信息 get

                                4.2.分配一個專門的內存塊管理當前的任務

                                    主要負責任務的初始化信息,以及任務記錄的堆棧信息

任務總數   頭四字節
任務1     格式 高16位任務編號 低16位任務狀態
任務2
任務3
正在執行   最後一個任務

                                4.3.任務調度模塊,我這個很簡單

                                 就是任務管理模塊,我把第一個和最後一個狀態信息調整,交換(這樣只是兩個任務 哈哈)

                                4.4.當中斷打斷任務的時候

                                    首先把臨時信息保存起來

                                    而後獲得執行任務位置,保存臨時信息

                                    獲得下一個任務

                                    任務調度,修改棧信息

                                    跳轉

demo的內存分佈

#直接用給的程序加載從第二個扇區開始
#加載的是保護模式的程序
#可是加載到什麼地方哪?按照書上的位置

#顯示的時候直接寫顯存位置怎麼處理?怎麼回車換行
#用一個全局變量標示寫入的位置80*25的標準

#全局段描述表     
 0 空
 1 數據段         初始地址是0x0          界限是4G                   4G         全局修改
 2 主程序加載的段 初始地址是0x7C00       界限是1FF                  512字節    跳轉保護
 3 堆棧段         初始地址是0x7C00       界限是0xFFFFD000<<FFFFFFFF 大小8KB    ESP的初始值?
 4 顯示描述       初始地址是0xB8000      界限是7FFFF                也就是  
 5 系統公用例子代碼段
 6 內核數據段
 7 內核代碼段 
#全局段描述表結束
#中斷描述符
   中斷段         初始地址是0X0000A000   界限是2^11-1=0X7FF
#中斷段描述符結束 
#內存分佈圖
00000000
00005C00-------------------------------------
                任務信息記錄的棧
00006C00-------------------------------------
                |
            4KB大小內核棧 地址換算 基地址限長     3
		        |
00007C00-------------------------------------
                |
			512字節的引導位置                     2    
                |			
00007DFF-------------------------------------
00007E00-------------------------------------
                |
			描述符位置(每一個描述符佔位8個字節) 1ff=512/8=64
                |	
00007FFF---------------------------------------
                |
			描述符防止不夠空缺出來的            512額外字節
			    |
000081FF----------------------------------------
00008200----------------------------------------
                |
        	LDT描述符位置 1ff=512/8=63
                |			
000083FF----------------------------------------
                |
			防止描述符不夠額外添加的	       512額外字節
				|
000085FF----------------------------------------
00008600----------------------------------------
                |
			 tss描述符  1ff  19FF/104=63
			    |
00009000----------------------------------------
                |
              任務的臨時信息
              順序:gs、fs、es、ds、edi、esi、ebp、esp、ebx、edx、ecx、eax、retaddr、eip、cs、eflags、esp、ss
			    |                  |----------------pushad-----------------|         |----------iret---------|
			    |	18*4=64字節 512/64能夠放8個
                |	                				
00009FFF----------------------------------------
0000A000----------------------------------------
                |
             中斷安裝的位置 256*8=2^11				
				|			
0000A7FF---------------------------------------			
00010000---------------------------------------
00011000---------------------------------------		
00020000---------------------------------------
                |
		    1024頁目錄 4KB		
				|
00021000---------------------------------------
                |
		    1024頁表   4KB->4M		
                |				
00022000-------------------------------------				
00040000-------------------------------------
                |
			系統核心的程序和數據加載位置(大小不固定)
                |				
0009ffff-------------------------------------
000A0000
000B8000-------------------------------------
                |  
            顯示區域                             4
                |
000BFFFF-------------------------------------
000fffff
00100000-------------------------------------
                |
			用戶程序和數據
			    |
FFFFFFFF-------------------------------------


 

沒有作修改的demo效果圖,接下來就是完善修改中了......

接下來要知道內核函數調用怎麼處理了

  

5、代碼地址            

    歡迎交流      

   demo地址:https://github.com/Soap13/PingPangOS/tree/%E4%B8%80%E3%80%81%E8%BF%9B%E5%85%A5%E4%BF%9D%E6%8A%A4%E6%A8%A1%E5%BC%8F/%EF%BC%88%E5%85%AD%EF%BC%89%E7%9C%9F%E6%AD%A3%E5%AE%9E%E7%8E%B0%E5%A4%9A%E4%BB%BB%E5%8A%A1      

 

6、說下方法調用

    說是經過軟中斷來實現的,今天忽然明白了軟中斷屬於門(門的做用是什麼)

相關文章
相關標籤/搜索