OK6410A 开发板 (八) 25 linux-5.11 OK6410A 进程角度 裸机和进程的区别

裸机		  代码 : 没有调度函数
有进程概念的代码 :   有调度函数
添加调度要添加什么
添加调度要添加什么
	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
针对 arm32
struct 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
// 多进程os请 参考 https://github.com/lisider/learn_os/tree/master/process
// 实现与 对 多进程os 的设想有出入,可以查看链接中的图片看实际设计的结构体布局
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值