本文共 993 字,大约阅读时间需要 3 分钟。
裸机 代码 : 没有调度函数有进程概念的代码 : 有调度函数
添加调度要添加什么 1. pick next task 调度算法 选择 哪个进程 为 下一个进程 2. switch 寄存器的保存和恢复其他细节 1. 在什么时候调度/即调度时机
考虑到 要选择 下一个进程, 考虑 用 单链表即可考虑到 要保存 寄存器, 考虑用一个 结构体(不同的体系架构有不同的寄存器个数与bit) 保存即可考虑到换出,当前cpu就无法访问,但是换入,还要能恢复,就需要全部变量考虑到 每个 任务 要 一套(区分进程/选择进程/保存进程上下文),将 int类型变量/单链表/结构体 封装到一个大的结构体task_struct 中考虑到 代码运行的栈(sp)要方便设置,干脆就将 task_struct 搞大一点,设置 sp 为 task_struct 结构体变量 所在的地址范围最高地址----- 美化操作考虑到 区分进程 会更好一点,用一个 int 类型 保存即可 // 其实不区分也可以 // 进程就是换出换入,只要能满足可以选择下一个进程,换出当前进程,换入下一进程,就可以考虑到 用 current 能索引当前的 task_struct // task_struct 按照 0x1000 对其 // 当前的 sp(sp会在 0x#### #000 - 0x#### #fff 浮动) // 可以 以 sp&~(0x1000-1) 索引 task_struct
针对 arm32struct task_struct{ int pid; struct list_head list; // 使用内核链表 // 参考 https://github.com/lisider/kernel_list struct register_all{ int r0; ... int r15; int cspr; int spsr; };}调度时机 在 irq 的时候调度, irq 由 timer产生
// 多进程os请 参考 https://github.com/lisider/learn_os/tree/master/process// 实现与 对 多进程os 的设想有出入,可以查看链接中的图片看实际设计的结构体布局
转载地址:http://vcigi.baihongyu.com/