进入保护模式(十二)多任务的简单实现

一、窃喜下

      终于调通了进程切换的DEMO,用一个标题来窃喜 ^_^

二、言归正传

      任务调度的实现方式是

                                 2.1.通过时钟中断,打断现有的进程

                                 2.2.利用中断跳转到相应的进程中

                                 2.3.也可以通过任务门直接进行跳转(这里不打算)

 

三、中断以及任务切换工程中的知识点

                                3.1时钟中断后栈的格式

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

                                3.2就是任务中断要保存环境变量(寄存器的情况)

                                3.3就是任务不同特权级切换的过程中栈要变换的(要有个TSS)

四、具体过程     

我目前的实现思路是这样的,后续在所修改吧。

                                4.1.我把内核栈分配了8K,高端4K自用,低端4K专门用于保存任务的栈信息

                                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效果图,接下来就是完善修改中了......

接下来要知道内核函数调用怎么处理了

  

五、代码地址            

    欢迎交流      

   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      

 

六、说下方法调用

    说是通过软中断来实现的,今天突然明白了软中断属于门(门的作用是什么)

                

转载于:https://my.oschina.net/findurl/blog/192207

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值