30天自制操作系统day15
来源:互联网 发布:excel数据有效性颜色 编辑:程序博客网 时间:2024/05/22 06:05
这章讲到多任务了。多任务实际就是多个任务来回切换。切换时把上一个任务的寄存器写入内存,读入下一个任务的寄存器,保证程序能够从被中断的地方继续执行。
保存的寄存器用一个结构体表示:
struct TSS32 { int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3; int eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi; int es, cs, ss, ds, fs, gs; int ldtr, iomap;};
其中第二行都是32位寄存器,第三行都是16位寄存器。eip是程序计数器,负责记录正在运行的指令的地址。
任务切换的方式
如果JMP指令指定的目标地址不是可执行代码而是TSS,CPU就不会执行,而是理解为任务切换。
模拟两个任务的切换。首先定义两个TSS结构变量,使用set_segmdesc()将他们的地址注册到段表中。因为切换任务的时候,JMP指令就要指向这个地址。limit设置为103,因为一个TSS结构大小是104字节。
TR寄存器表示当前运行的是哪一个任务。通过LTR指令写入TSS结构所在的段号。
切换时使用JMP指令,如JMP 4*8:0
表示切换到段表中段号为4的TSS代表的任务。
任务初始化时,程序计数器应该指向这段程序的开头。所以在初始化TSS时,把task_main()的地址赋给eip。另外还要分配一个栈空间。不同的任务栈必须不同,这里用memman_alloc_4k()分配了一段内存空间作为栈。
利用之前学的定时器,可以实现定时切换任务。如何在任务之间传递参数?这里可以使用刚才分配栈空间的esp,把参数放在esp+4的位置,就可以从task_main()中得到参数了。
真正的多任务
以上只是简单的任务切换。如果要实现真正的多任务,切换不应该出现在程序里面。可以在中断处理函数中进行任务切换。
在主程序(第一个任务)中初始化一个定时器,在inthandler20()中,当这个定时器timeout时,执行mt_taskswitch()。
- 30天自制操作系统day15
- 《30天自制操作系统》读书笔记Day15
- 30天自制操作系统
- 30天自制操作系统
- 30天自制操作系统
- 30天自制操作系统
- 30天自制操作系统 导读
- [30天自制操作系统]day_2
- 30天自制操作系统day00
- 30天自制操作系统day01
- 30天自制操作系统day02
- 30天自制操作系统(1)
- 30天自制操作系统day2
- 30天自制操作系统day3
- 30天自制操作系统day4
- 30天自制操作系统day5
- 30天自制操作系统day7
- 30天自制操作系统day8
- 6. 重建二叉树
- 递归和递推
- Merge Sorted Array
- SQL Server
- 如何在大学里成为IT技术大神
- 30天自制操作系统day15
- runAllManagedModulesForAllRequests="true" 的思考
- redis的maxmemory设置
- Linux /etc/resolv.conf
- 股票18
- Androidstudio安装问题
- 数据结构和设计模式01(数据结构的基础)
- Hive常见内置函数及其使用
- 开发部署一个简单的Servlet