裸机 代码 : 没有调度函数
有进程概念的代码 : 有调度函数
添加调度要添加什么
添加调度要添加什么
1. pick next task 调度算法 选择 哪个进程 为 下一个进程
2. switch 寄存器的保存和恢复
其他细节
1. 在什么时候调度/即调度时机
调度的技术设想
考虑到 要选择 下一个进程, 考虑 用 单链表即可
考虑到 要保存 寄存器, 考虑用一个 结构体(不同的体系架构有不同的寄存器个数与bit) 保存即可
考虑到换出,当前cpu就无法访问,但是换入,还要能恢复,就需要全部变量
考虑到 每个 任务 要 一套(区分进程/选择进程/保存进程上下文),将 int类型变量/单链表/结构体 封装到一个大的结构体task_struct 中
考虑到 代码运行的栈(sp)要方便设置,干脆就将 task_struct 搞大一点,设置 sp 为 task_struct 结构体变量 所在的地址范围最高地址
----- 美化操作
考虑到 区分进程 会更好一点,用一个 int 类型 保存即可
考虑到 用 current 能索引当前的 task_struct
针对 arm32
struct task_struct{
int pid;
struct list_head list;
struct register_all{
int r0;
...
int r15;
int cspr;
int spsr;
};
}
调度时机
在 irq 的时候调度, irq 由 timer产生