30天自制操作系统之第15天 多任务(1)

多任务的本质是利用定时器和far跳转在任务之间进行切换,具体来说,一开始先运行main函数(就是处理我们的鼠标、键盘和定时器等事件),0.02s后定时器超时,执行如下语句:
farjmp(0, 4 * 8);

这是一个far跳转,先看一下farjmp的实现:

_farjmp:	; void farjmp(int eip, int cs)
		JMP		FAR [ESP+4] ; eip, cs
		RET

far-JMP指令指向的目标地址段是4*8,这是任务B的TSS所在,因此实际上是发生了任务切换,下面是任务B的TSS设定:

set_segmdesc(gdt + 4, 103, (int) &tss_b, AR_TSS32);

之后任务B得到执行,下面是任务B的函数:

void task_b_main(struct SHEET *sht_back)
{
	//for (;;) { io_hlt(); }
	struct FIFO32 fifo;
	struct TIMER *timer_ts, *timer_put;
	int i, fifobuf[128], count = 0;
	char s[11];

	fifo32_init(&fifo, 128, fifobuf);
	timer_ts = timer_alloc();
	timer_init(timer_ts, &fifo, 2);
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值