- 搭建实验环境
- 下载内核文件和补丁
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.9.4.tar.xz
在实验楼中的环境下内核源码文件已经下载并编译完毕,但由于实验楼的环境升级,需要重新编译
wget https://raw.github.com/mengning/mykernel/master/mykernel_for_linux3.9.4sc.patch # download mykernel_for_linux3.9.4sc.patch
删除mykernel文件夹中全部内容,安装补丁文件,并用make allnoconfig复位
make指令进行编译,等候编译结束 - 使用qemu查看内核状态
安装qemu 并使用qemu查看内核状态
qemu -kernel arch/x86/boot/bzImage - 查看mymain.c和myinterupt.c理解上述运行情况
mymain.c
myinterupt.c
- 下载内核文件和补丁
- 修改mymain.c 和myinterrupt.c代码 重新编译实现时间偏轮转
构建构建PCB。有进程号,运行状态,预先开辟的stack空间 线程的ip和sp 还有运行程序的入口地址task_entry
另外此处PCBl类型为tPCB,stack的size为1024*8
在mymain.c的主程序下,有进程序列task,还有一个当前运行task的链表
内核启动,设置序列内的第一个进程的进程号为0
修改状态为启动运行
把入口地址和线程的ip都改成从函数my_process开始启动。
把线程的sp更新为进程stack的末端地址
形成环状进程链表
创建更多的进程,把入口地址都更新为my_process
修改进程号 设置运行状态为阻塞 加入环状链表
设置从0号进程开始启动,当前执行程序指向环形链表第一个程序
把1号程序的sp装载esp 1号程序的bp装载ebp 启动运行(先把esp指向stack空间高位,载入eip载入ebp)
此时eip地址为my_process函数地址,所以开始执行myprocess函数
每隔10000000周期进程号。主动询问是否需要调度,如果需要调度启动调度函数
切换到myinterupt.c代码中,中断调用的程序会进行计数,当1000周期时将启用调度
调度函数,有记录上一个进程和下一个进程,如果当前进程后面没有进程了则返回,如果当前进程环中空了,也返回,如果有则更新两个记录值
判断当前情况,如果下一个可以运行,切换下一个进程,装载寄存器
如果下一个目前状态不能运行,则让他运行并且换到他
转载于:https://www.cnblogs.com/xiaofanshao/p/6438788.html