終於調通了進程切換的DEMO,用一個標題來竊喜 ^_^ java
任務調度的實現方式是 git
2.1.經過時鐘中斷,打斷現有的進程 github
2.2.利用中斷跳轉到相應的進程中 函數
2.3.也能夠經過任務門直接進行跳轉(這裏不打算) spa
3.1時鐘中斷後棧的格式 code
EIP ----------- CS 低地位 EFlags ESP 高位 SS -----------
3.2就是任務中斷要保存環境變量(寄存器的狀況) 進程
3.3就是任務不一樣特權級切換的過程當中棧要變換的(要有個TSS) ip
我目前的實現思路是這樣的,後續在所修改吧。 內存
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效果圖,接下來就是完善修改中了......
接下來要知道內核函數調用怎麼處理了
歡迎交流
說是經過軟中斷來實現的,今天忽然明白了軟中斷屬於門(門的做用是什麼)