终于调通了进程切换的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效果图,接下来就是完善修改中了......
接下来要知道内核函数调用怎么处理了
欢迎交流
说是经过软中断来实现的,今天忽然明白了软中断属于门(门的做用是什么)