一、窃喜下
终于调通了进程切换的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效果图,接下来就是完善修改中了......
接下来要知道内核函数调用怎么处理了
五、代码地址
欢迎交流
六、说下方法调用
说是通过软中断来实现的,今天突然明白了软中断属于门(门的作用是什么)